Выпуск Rust-драйвера picodata-driver 3.0.0

Команда Picodata выпустила picodata-driver 3.0.0 — асинхронный Rust-драйвер для Picodata. Главное в релизе — API топологии кластера и привязка запросов к конкретному инстансу.

Пакет опубликован на crates.io, документация доступна на docs.rs и в документации Picodata.

Топология кластера

Метод Client::topology() возвращает снимок топологии кластера: тиры, репликасеты, инстансы и диапазоны бакетов. Метод Tier::bucket_map() возвращает карту бакетов тира — соответствие между UUID репликасетов и их диапазонами бакетов; если некоторые бакеты недоступны по причине недоступности соответствующих репликасетов, возвращается Error::IncompleteBucketMap. Адреса инстансов драйвер берёт из системной таблицы _pico_peer_address:

let topology = client.topology().await?;

for tier in topology.tiers() {
    let bucket_map = tier.bucket_map()?;
    for rs in tier.replicasets() {
        let master = rs.master().map(|i| i.name());
        println!("{} {} master={master:?}", tier.name(), rs.uuid());
        for inst in rs.instances() {
            let iproto = inst.address("iproto"); // or "http", "pgproto" or any other type of address you want to get
            println!("  {} iproto={iproto:?}", inst.name());
        }
        for range in bucket_map[&rs.uuid()] {
            println!("  buckets {}..={}", range.start(), range.end());
        }
    }
}

Привязка запроса к инстансу

Кроме on_master и bucket_id появился третий способ адресации — метод instance(name), возвращающий закреплённый запрос (PinnedQuery):

client.query("SELECT * FROM users", &[])
    .instance("default_1_1")
    .await?;

Закреплённый запрос не принимает on_master и bucket_id — такая комбинация не скомпилируется. Если инстанс неизвестен или не в сети, драйвер возвращает Error::InstanceUnavailable и не переключается на другие узлы.

Правильное именование — одна из двух сложнейших задач информатики!

Крейт выходил как picodata-rust (1.0.0), затем как picodata (2.0.0–2.0.3), теперь называется picodata-driver. Прежние версии остались на crates.io, существующий код продолжает собираться, но новые версии будут выходить только под новым именем.

Обновление сводится к замене зависимости и пути импорта:

 [dependencies]
-picodata = "2.0.3"
+picodata-driver = "3.0.0"

Импорты меняются с picodata:: на picodata_driver::.