The ScyllaDB team is pleased to announce ScyllaDB Rust Driver 0.8.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!
Some interesting statistics:
- over 145k downloads on crates;
- over 390 GitHub stars!
Notable changes
New features / enhancements:
- Support for the serverless Scylla Cloud has been introduced. (#614)
- The load balancing module was rewritten. The new API allowed for a more efficient implementation which does not allocate on the happy path when planning on which nodes to execute the query on. Existing load balancing policies have been unified into a single
DefaultPolicy
, which is configurable and offers the same functionality as the previous, composable policies. (#612) - Execution profiles have been introduced. An execution profile represents a group of options applicable to a query. It is possible to associate a single execution profile with multiple queries, as well as change the execution profile for multiple queries at once if they share the same execution profile handle. See the docs for more details. (#592)
- Column types, UDT definitions etc. in the cluster metadata no longer refer to UDTs by name, instead they contain the whole definitions of the UDT. The driver topologically sorts the UDT definitions and resolves type dependencies after fetching metadata. (#649)
- If token aware routing is enabled, the load balancing policy used to always choose a random replica. This behavior can now be disabled so that replicas are always chosen in a fixed order. This can have performance benefits for some workloads as it can lead to better caching. (#667)
- The driver now uses nodes’ host id instead of IPs for identification. There are ongoing efforts to allow Scylla nodes to change their IPs after restart, so this change in the driver serves as a preparation which - fortunately - is backwards-compatible with existing Scylla versions. (#617)
- Connection keepalives are now, by default, enabled and sent every 30 seconds. (#654)
- Spans attached to requests now contain more information, including request/response size, partition key, token, replica IPs etc. (#668)
- The
BatchValues
trait was simplified with the help of recently introduced Generic Associated Types (GATs). (#596) - The
impl FromCqlVal for CqlDuration
, which was previously missing, was added. (#623) - The
impl FromCqlVal for Date
, which was previously missing, was added. (#638) - Support for deserialization of types wrapped in
secrecy::Secret
was added. To enable it, you need to enable thesecret
feature. (#619) - Support for deserialization of DateTime was added. (#619)
- It is now possible to get information about the name of the current keyspace. (#663)
- The
Session::calculate_token
is now public. (#658) - Now, most of the error types in the crate implement the
Clone
trait. (#669) - The
deser_cql_value
function was made public. It is used by thescylla-rust-udf
library. (#630) - Dropped dependency on
ahash
in tests. It wasn’t really needed and, in some cases, could trigger a bug in the cargo resolver with a cryptic error message, which could prevent the whole project from compiling. (#625) - Hygiene of the procedural macros has been increased. Moreover, it is now possible to use them with conjunction with just
scylla-cql
by using the#[scylla_crate = "scylla_cql"]
attribute. (#628) - Address translation now happens just before a connection is established. Previously, it happened during metadata fetch. This allows the user-provided
AddressTranslator
to be more dynamic - for example, if a node’s IP changes and all connections are closed, if theAddressTranslator
reacts to this quickly then the driver can re-establish connections to this node much more quickly. (#641)
Bug fixes:
- The
Session::query_iter
/execute_iter
methods will now correctly work when used to send a write request. (#644)
Performance improvements:
- The internal method
Connection::query_all
that was used to fetch cluster metadata has been replaced withConnection::query_iter
. The new method does not concatenate results from multiple pages into single one, but rather returns an iterator which allows processing the rows as they are fetched in the background. This should reduce memory usage during metadata fetch in some extreme cases. Moreover, the new method fits the upcoming “iterator-based deserialization” API rework better. (#645) - Calculation of some parameters passed to tracing used to allocate, which could lead to a significant performance impact. Now, they don’t need to allocate. (#656)
-
PreparedStatement
is now cheaper to clone. Its internals that allocated on clone are now wrapped in anArc
. (#653)
CI / developer tool improvements:
- Now, IP addresses for scylla-proxy nodes are assigned automatically. Developers no longer need to specify IPs manually and worry about IP conflicts between the tests. (#621)
- The cluster that is set up both by CI and
Makefile
now boots Scylla nodes sequentially. This slows down the boot process, but the old method is technically incorrect and could result in a fail - the new method follows the best practices. (#647) - To aid in debugging cluster failures, now CI prints logs from the Scylla nodes at the end. (#646)
Other:
- MSRV was bumped up from 1.59 to 1.65. It was mainly done to support GATs. (#627)
Congrats to all contributors and thanks everyone for using our driver!
The source code of the driver can be found here:
-
GitHub - scylladb/scylla-rust-driver: Async CQL driver for Rust, optimized for Scylla!
Contributions are most welcome!
The official crates.io registry entry is here:
Thank you for your attention, please do not hesitate to contact us if you have any questions, issues, feature requests, or are simply interested in our driver!
Contributors since the last release:
commits | author |
---|---|
108 | Wojciech Przytuła |
66 | Piotr Dulikowski |
18 | Michał Sala |
5 | Jan Ciolek |
5 | Wojciech Mitros |
3 | Jan Ciołek |
3 | Thomas BESSOU |
1 | Gor Stepanyan |
1 | Sining (Stephen) Ma |
1 | Ten0 |