[RELEASE] ScyllaDB Rust Driver 0.8.0

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 the secret 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 the scylla-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 the AddressTranslator 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 with Connection::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 an Arc. (#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:

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
1 Like