Команда 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::.
