Skip to content

Releases: scylladb/scylla-rust-driver

v0.9.1

12 Oct 17:23
Compare
Choose a tag to compare

Changes

  • Fixed a panic in LatencyAwarePolicy when 2 calls to Instant::now() returned the same value. (#830)

v0.10.0

06 Oct 13:04
Compare
Choose a tag to compare

The ScyllaDB team is pleased to announce ScyllaDB Rust Driver 0.10.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!

Some interesting statistics:

  • over 685k downloads on crates;
  • over 460 GitHub stars!

Notable changes

API cleanups / breaking changes:

  • Bumped MSRV to 1.66 (#810)
  • Slimmed down schema agreement API to make it's usage less error-prone to race conditions and deadlocks. (#779)
  • Added Serial and LocalSerial levels to Consistency enum because those are valid levels for LWT SELECTs. LegacyConsistency became redundant so it was removed. (#792)
  • Made it impossible to specify preferred rack without specifying preferred datacenter. This was already invalid configuration, now the API is changed so that it is unrepresentable. (#775)
  • Un-pub some types and methods that are not part of intended public API. (#774). There were also a lot of other pub specifiers removed but those should not result in API-break. (#773)
  • Made StatementConfig private - it is used internally and does not appear in any public API. retry_policy field is moved there from Query, PreparedStatement and Batch. (#772)
  • Change load balancing policy so that Rack awareness works also with non-token-aware queries (e.g. unprepared statements). Now, local rack nodes are preferred in pick() and fallback() methods. Signature of ReplicaSet::choose_filtered() is slightly changed (a reference is added to predicate's argument). (#777)

New features / enhancements:

  • Changed Partitioners' API to be stateful, similar to std::hash. Changed all it's usages to take advantage of this functionality, getting rid of a lot of needless allocations of partition key. This decreased number of allocations and improved performance. (#758)
  • Driver now re-resolves hostnames when none of known peers can't be reached. This is to support the case when all nodes change their IP - previously driver was unable to reconnect to cluster again after control connection failed in this situation. Control connection now begins reconnection attempts immediately after it breaks. (#770)
  • Procedural macros in scylla-macros now use produce proper compilation errors instead of panicking, resulting in nicer error messages. (#818)
  • Size calculation in serialization is improved, hopefully resulting in fewer reallocations (#809)
  • Added support for serializing / deserializing HashMap and HashSet with custom hashers. (#808)
  • Implemented serialization for &[u8], which allows deriving ValueList for structs with &[u8] fields. (#790)
  • Some performance optimisations by avoiding cloning. (#780)
  • Moved write_coalescing() method from SessionBuilder to GenericSessionBuilder as there is nothing preventing using it in Cloud. (#778)
  • Topology refresh interval is now configurable - see cluster_metadata_refresh_interval method on GenericSessionBuilder. (#776)

Documentation:

  • Added docstring for AddressTranslator trait. (#796)
  • Improved docs about handling UDTs. Now it clearly mentions the fact that UDT's and Rust struct's fields must be in the same order. (#789)
  • Documentation is now built for latest release too, not only main branch. It also defaults to latest release. (#784)

Bug fixes:

  • Bumped the version of chrono dependency to the one that supports functionality that we use. (#807)
  • Downgraded criterion to 0.4 because 0.5 used version of clap that has MSRV higher than ours. (#799)
  • Fixed deserialization of compound partition keys. Driver sometimes used wrong column from metadata when deserializing them due to improper lookup logic. (#795)

CI / developer tool improvements:

  • Fixes for clippy warnings. (#805)
  • Added cmdline example of proxy usage, useful for manual testing of DNS related functionalities in drivers. (#797)
  • Proxy now always asks Scylla for shard number it connected to and sends that information back to the client. (#788)
  • Added instructions on updating documentation to RELEASE.md . (#785)
  • Fixed documentation build process. (#783)
  • Make it clearer where new session builder methods should go (SessionBuilder vs GenericSessionBuilder) to prevent CloudSessionBuilder not getting the functionalities that it should. (#781)

Others:

  • Removed a leftover TODO. (#803)
  • Updated syn (non-public dependency) to 2.0. (#782)

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
79 Wojciech Przytuła
34 Piotr Dulikowski
4 Anna Stuchlik
2 Pavel Kirilin
1 Karol Baryła
1 Collin Styles
1 Jan Ciołek
1 Lucas Kent
1 Rishabh Aryal
1 koheatel

v0.9.0

27 Jul 19:11
Compare
Choose a tag to compare

The ScyllaDB team is pleased to announce ScyllaDB Rust Driver 0.9.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!

Some interesting statistics:

  • over 403k downloads on crates;
  • over 440 GitHub stars!

Notable changes

API cleanups / breaking changes:

  • Removed Session::estimate_replicas_for_query. The same effect can be achieved via slightly longer session.get_cluster_data().get_token_endpoints(). (#768)
  • Removed Session::get_tracing_info_custom. The parameters passed to that function (number of retries, delay between retries, consistency level) can now be set on the per-session level basis, and get_tracing_info should be used instead. (#768)
  • Removed accidental reexports of Consistency and SerialConsistency from the scylla::statement::batch module. Those are already available through more convenient import paths. (#767)
  • Removed the reexport of QueryResult from scylla::transport::connection module. It is already reexported from the scylla module which should be more convenient. (#763)
  • Removed the scylla::routing::Node struct. It hasn't been used by any of our APIs and had a very similar name to scylla::transport::Node, so it would only be a source of confusion if left alone any longer. (#762)
  • A bunch of constants have been un-pubbed from the scylla-cql crate, as well as two internal functions related to frame compression/decompression. (#764)
  • The CloudConfig struct has been exposed to the users. The purpose of this change is to aid in implementing Scylla Cloud support in the cpp-rust-driver project. (#750)
  • It is now not possible to set the SSL context when using Rust driver with Scylla Cloud; the SSL context should be determined fully by the Scylla Cloud configuration and should not be modified by users. (#703)

New features / enhancements:

  • In case when executing prepared queries, the partition key associated with the request is emitted in a tokio::tracing span in a human-readable form. Previously, it was also emitted, but in a form that is hard to parse by a human. (#766)
  • The function Session::calculate_token_for_partition_key is added. It allows to calculate a partition key only by using a partitioner and values of a partition key, no PreparedStatement object is needed. (#757)
  • The scale parameter in LatencyAwarePolicy, which is exposed in cpp driver but was missing from the rust implementation's API, is now exposed. The previous default value has been changed. (#733)
  • The documentation theme has been updated. (#737)

Bug fixes:

  • The RoutingInfo struct to load balancing policies used to have incorrect consistency level set. This is now fixed, and a regression test has been added. (#743)
  • If one of the hostnames passed as a contact point cannot be resolved, the driver would fail to create a session, even if other nodes would resolve correctly. This is now fixed and the driver will succeed in such scenario. (#753)

CI / developer tool improvements:

  • The timeout of CI jobs has been reduced from the default 6 hours to 1 hour. (#734)

Others:

  • Non-public dependencies of the driver were updated. (#769, #755)
  • The clone.rs example has been removed. It promoted bad practices; we recommend only using one Session object per application. (#728)
  • Uses of SimpleStrategy has been removed from examples and documentation. This strategy will become deprecated in ScyllaDB in the future, and we no longer want to promote its use in learning materials. (#726)
  • The runners in our CI has been temporarily downgraded to use Ubuntu 20.04. The reason for this change is that the ccm tool, used by the CI, requires Python 2 which is no longer available in the ubuntu-latest runner. Requirement for Python 2 will be dropped with the next ScyllaDB release, and the system version will be upgraded again after this happens. (#752)
  • docker compose version has been upgraded from V1 to V2 in the CI. The old one stopped receiving updates. (#761)

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
20 Piotr Dulikowski
15 Wojciech Przytuła
11 Piotr Grabowski
3 Jan Ciolek
2 David Garcia
2 Gor Stepanyan
1 Lucas Kent

v0.8.2

05 Jun 20:43
Compare
Choose a tag to compare

Features:

  • An optimization has been (re)added which improves efficiency of the LWT queries. It causes the driver to always choose replicas in the ring order which improves performance when there is a lot of per-partition key contention. (#717)
  • The driver now closes connections if there is no response to CQL keepalives. (#731)
  • TCP-level keepalives have been added. (#735)
  • There is an option now to switch off write coalescing optimization in the driver. This "optimization" is technically a tradeoff - it improves efficiency when the throughput is high, but may cause worse latency in a busy application which does not send so many queries. (#725)

Security fixes:

Bugfixes:

  • After execution profile support merge, the serial consistency was no longer set by default. It was an unintended and undocumented change; it is now fixed and the driver properly sets it to LocalSerial by default. (#729)

Enhancements:

  • The SessionConfig::add_known_nodes{_addr} and SessionBuilder::known_nodes{_addr} functions were made more generic and now they accept a wider range of argument types. (#705)
  • Clarified wording in the doc page about batches. (#712)
  • An outdated driver version was specified in an example on the "Create project" page, now it points to a much newer one. (#715)
  • An obsolete comment was removed from examples. (#716)
  • A latency aware policy test with a very long name has been refactored so that it does not rely on timing, no longer causing flakiness of the CI. (#714)
  • The CI now sets the RUST_BACKTRACE=full environment variable which causes full backtraces to be printed when panic occurs in tests. This should help in debugging issues, especially those that only occur in CI. (#719)
  • Integration tests have been refactored into a single binary. This should reduce the time needed to build the tests and improve test parallelism. (#730)

v0.8.1

21 Apr 16:46
Compare
Choose a tag to compare

Bugfixes:

  • Token awareness now works correctly with execute_iter. (#700)
  • A deadlock that occurs immediately when trying to send a query with latency aware policy set is now fixed. (#697)
  • The documentation used to accidentally strip rust attributes from code examples, which is now fixed. (#684)
  • If the database responds with an error during connection handshake, it will now be properly propagated to users. (#686)

Enhancements:

  • The set_retry_policy/get_retry_policy methods were brought back (they were removed previously with the introduction of execution profiles). (#707)
  • The default load balancing policy now supports rack-aware load balancing. (#666)
  • Serialization/deserialization is now possible for array types. (#693)
  • Various extensions to the execution profile API needed for the cpp-rust-driver project were added. (#690)
  • The documentation now contains an example that shows how to connect to a serverless cluster. (#685)

CI:

  • Tests for the serverless support have been added. (#689, #694)

v0.8.0

22 Mar 19:07
Compare
Choose a tag to compare

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

v0.7.0

15 Dec 16:56
Compare
Choose a tag to compare

The ScyllaDB team is pleased to announce ScyllaDB Rust Driver 0.7.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!

Some interesting statistics:

  • over 67k downloads on crates;
  • over 350 GitHub stars!

Notable changes

Bugs fixed:

  • The CachingSession used to cache not only prepared statement IDs but also query parameters (such as page size) and those parameters overrode the ones provdided to CachingSession::execute. This caused strange and inconsistent behavior. Now, query parameters are not cached but are always taken from the Query object provided to CachingSession::execute (#598)
  • Fixed a bug in a corner case of retry logic that could cause a panic in case query_iter/execute_iter is used to perform a write with a DowngradingConsistencyPolicy (#609)
  • The driver now advertises its version to nodes that it connects to. The driver version is now visible in the system.clients table (#611)
  • The derive macros in the scylla-macros crate can now be used on generic structs (#565)

New features/enhancements:

  • Token-awareness for batches is now supported. Batches are routed with respect to the routing key of the first statement of the batch (#573)
  • An optimization has been implemented which, in case of LWT queries, causes TokenAwareStrategy to choose the nodes for queries in a predefined order, bypassing any shuffling coming from the child policy. This reduces the number of retries needed to perform an LWT update in case when multiple clients try to update the same key (#578)
  • The LatencyAwarePolicy has been added which mimics the behavior of C++ driver's latency aware routing. The new policy measures latency on a per-node basis and prefers nodes with lower latencies. Although this policy may be useful for some use cases, caution is advised as it was deprecated in C++ driver and also removed from the Java driver (#536)
  • It is now possible to restrict the set of keyspaces for which metadata is being fetched. This can reduce the amount of network traffic needed during metadata refresh in case the metadata for some keyspaces is not needed by the user (#576)
  • It is now possible to implement other authentication schemes via the AuthenticatorProvider and AuthenticatorSession traits. The previous, hardcoded password authentication scheme is now offered as PlainTextAuthenticator (although the SessionBuilder::user method was kept for convenience) (#572)
  • The CachingSession now supports custom hashers for use in the internal hashmap. By default, the default hasher from the standard library is used, but a more efficient implementation can be chosen by the user (#577)
  • The impl_from_cql_value_from_method! macro is added that allows you to easily generate FromCqlValue impls from your extension trait methods (#601)
  • The Value trait used for serialization was implemented for Box and for references to unsized types, allowing to cover trait objects (dyn T) as well (#590)
  • Retry policies now support serial consistency (#585)

CI / developer tools:

  • Introduced scylla-proxy, a tool internal to the driver that allows intercepting and modifying requests and responses that are exchanged between the driver and the cluster. It is useful for simulating responses from the cluster that would be hard to trigger reliably without it - e.g. timeout errors (#496)
  • The tests now require a running 3-node Scylla cluster. In order to simplify testing, a Makefile has been added that sets up such a cluster with docker-compose before running the tests (#584)
  • The CI now also sets up a 3-node Cassandra cluster (#602)
  • Request serialization benchmarks have been added (#581)

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
63 Wojciech Przytuła
10 Michał Sala
10 Thomas BESSOU
9 Piotr Dulikowski
5 Colin O'Brien
2 Gor Stepanyan
2 colin-grapl
1 Jan Ciolek
1 Joseph Perez
1 Lucas Kent
1 Piotr Grabowski

v0.6.1

04 Oct 20:14
Compare
Choose a tag to compare
  • Forgot to update the scylla-cql version from 0.0.1 to 0.0.2 in Cargo.toml which prevented 0.6.0 from being published to crates.io. The version 0.6.1 depends on scylla-cql 0.0.2, both of them were successfully pushed and are available on crates.io.

v0.6.0

04 Oct 19:12
Compare
Choose a tag to compare

The ScyllaDB team is pleased to announce ScyllaDB Rust Driver 0.6.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!

The numbers are constantly growing:

  • over 53k downloads on crates;
  • over 320 GitHub stars!

=== Notable changes ===

  • Introduced HostFilter abstraction. HostFilter can be used to prevent the driver from connecting to some of the nodes in the cluster, e.g. you can use DcHostFilter to connect only to the nodes from the local datacenter.
  • DcAwareRoundRobin policy can now be configured not to return nodes outside the configured DC at all (previously it just returned them after the DC-local nodes).
  • Introduced AddressTranslator. This feature makes it possible for the driver to correctly connect to clusters which are behind NAT.
  • CachingSession has gained support for batches.
  • The batch method now returns QueryResult instead of BatchResult. It no longer ignores rows returned by the database and it is now possible to learn whether a LWT batch has been applied or not.
  • After issuing a schema-altering query, the driver automatically updates the metadata - it is no longer needed to refresh it manually afterwards.
  • It is now possible to get information about replicas relevant to given query and partition key via ClusterData::get_endpoints.
  • It is now possible to get detailed information about the way the driver executed a query with the help of the HistoryListener trait.
  • A request coalescing optimization has been implemented. Before flushing data to the socket, the task responsible for it yields once. In our tests, this resulted in increased efficiency: less flushes were made, which should lead to larger packets being sent, reducing the overhead needed to send the same amount of data.
  • Information about materialized views in the Metadata was extended to contain information about the view's base table.
  • Information about nodes' sharders (i.e. number of shards and the msb_ignore parameter) is now available.
  • Support for RateLimitReached error has been added. The new error will be returned in ScyllaDB 5.1 by the upcoming per-partition rate limiting feature.
  • Assorted improvements to documentation, CI, and some refactors.

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 last release:
commits|author
30 Jan Ciolek
10 Wojciech Przytuła
9 Piotr Dulikowski
4 Joseph Perez
2 Gor Stepanyan
2 Piotr Sarna
1 Thomas BESSOU

v0.5.0

25 Aug 14:09
Compare
Choose a tag to compare

The ScyllaDB team is delighted to announce ScyllaDB Rust Driver 0.5.0,
an asynchronous CQL driver for Rust, optimized for Scylla, but also compatible with Apache Cassandra!

Cool, ever growing open-source stats:

  • over 38k downloads on crates;
  • over 300 GitHub stars!

=== Notable changes ===

  • Client-side timeouts are here! Request timeout can be set for a session, or, with higher granularity, for a specific statement.
  • CachingSession implementation was simplified, it no longer reimplements separate repreparation logic.
  • Continuous integration tests are now run on a 3-node cluster, increasing the test coverage for whole classes of distributed errors.
  • CQL logic was extracted to a separate scylla-cql crate, so that it can be reused by other projects.
  • Debug was implemented for a few important structs - Session, PreparedStatement, etc.
  • In certain cases, retry policy will not properly react on an error returned from the database and not retry - this is now fixed.
  • Materialized view info is now included when fetching database schema.
  • TracingInfo now has a neat helper function, which returns the list of nodes that took part in processing given request
  • DowngradingConsistency policy is implemented (although it's only recommended for very specific use-cases).
  • It's now possible to obtain a list of replicas that are most likely to serve given statement,
    by computing owner nodes of a particular token, if this information is available.
  • Clone implementation for PreparedStatement got slimmed, now it does not copy an unnecessary list of tracing ids.

Also, the usual stuff: fixes, speedups, amendments, doc updates and example updates were all applied.

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 last release:
commits|author
28 Wojciech Przytuła
14 Piotr Sarna
13 Piotr Dulikowski
13 Jan Ciołek
2 Lucas Kent
1 David Garcia
1 Gor Stepanyan