Skip to content

Latest commit

 

History

History
99 lines (78 loc) · 4.52 KB

RELEASE_NOTES.md

File metadata and controls

99 lines (78 loc) · 4.52 KB

Riak Ruby Client Release Notes

1.0.0 Feature Release - 2012-02-03

Release 1.0.0 is a major feature release and is the first where riak-client, ripple, and riak-sessions will be released independently (see below). Because there too many individual changes to recount, this entry will cover the major features and bugfixes present in the release.

Riak 1.0/1.1 Compatibility

riak-client is fully compatible with Riak 1.0.x and (yet-to-be-released) 1.1.x, including supporting secondary indexes, integrated search, and cluster membership commands.

Multi-node Connections and Retries

Riak::Client can now connect to multiple Riak nodes at once. This greatly improves throughput and allows the client to recover from intermittent connection errors while continuing normal operation. To enable this, all uses of the Pump/Fiber logic were removed in favor of connection pools from which any new request can draw an existing or create a new connection. Which node is selected for any new connection is based on a quickly-decaying EWMA of its success rate on recent requests. A huge thanks to Kyle Kingsbury who did most of the work on this!

Improved TestServer and Node Generation

The Riak::TestServer class has been generalized such that you can generate regular nodes and even clusters that store data on disk. This is especially useful if you want separate nodes or clusters for each project that uses Riak, and to keep them separate from your base install. TestServer also now launches the node in a separate process (not a child process) so you can keep it running between test suites. Clearing the in-memory data is performed by connecting to the console via the exposed Unix pipes, rather than over stdio.

Conflict Resolution

An important part of dealing with eventual consistency is the ability to handle when conflicts (also called siblings) are created. Now you can resolve them automatically by registering blocks (callbacks) using Riak::RObject.on_conflict. The block will be called when fetching a key in conflict and receives a RObject that has siblings. To resolve the conflict, it simply returns the resolved object, or nil if it didn't handle the conflict. A huge thanks to Myron Marston who implemented this!

Serializers

Before, serialization of Ruby objects into Riak was constrained to three formats: JSON, YAML and Marshal. Now you can define your own serializers so that you can store data in BSON, MsgPack, NetStrings, or whatever format you like. Use Riak::Serializers[content_type] = serializer to assign a serializer for the selected media type. The serializer must respond to #dump and #load. (More handiwork of Myron Marston, thanks!)

Stamps

If you don't like the keys that Riak hands out when you store an RObject without a key, and you want something naturally ordered, you can now generate them client-side using Riak::Stamp, which will generate 64-bit integers in a fashion similar to Twitter's Snowflake, but uses Riak::Client#client_id as the machine identifier.

Repository/Feature split

In an effort to decouple development of the individual projects and reduce top-level dependencies, the ripple repository was split into new repositories containing its corresponding sub-projects. Additionally, the Riak::CacheStore has become its own project/gem. The new gem and repository locations are below:

Significant Known Issues

Attempting to use the Protocol Buffers transport with a 0.14.x cluster may cause the connection to dump because of incompatibilities in certain protocol messages. This will be addressed in a future patch/bugfix release.

The new node generation and test server intermittently fails on JRuby, specifically from deadlocks related to blocking opens for the console FIFOs. The JRuby team has helped on this issue, but there may not be a clear resolution path until JRuby 1.7 or later.

Other known issues may be found on the Github issue tracker.