Browse files

Update release notes for 1.0. [ci skip]

  • Loading branch information...
1 parent 9c0d2ff commit f33eae2e20dc9d4f3da7769bdc067f887f886507 @seancribbs seancribbs committed Feb 3, 2012
Showing with 99 additions and 286 deletions.
  1. +99 −0
  2. +0 −286 RELEASE_NOTES.textile
@@ -0,0 +1,99 @@
+# 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:
+* [`riak-client`]( —
+ [basho/riak-ruby-client](
+* [`ripple`]( —
+ [seancribbs/ripple](
+* [`riak-sessions`]( —
+ [seancribbs/riak-sessions](
+* [`riak-cache`]( —
+ [seancribbs/riak-cache](
+### 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](
286 RELEASE_NOTES.textile
@@ -1,286 +0,0 @@
-h1. Ripple Release Notes
-h2. 0.9.5 Patch Release - 2011-06-14
-Release 0.9.5 is a minor bugfix release but also includes some small features.
-Full notes:
-* Allow IO-like objects to be used as RObject data. [Josh Nichols]
-* Set the content-length or transfer-encoding appropriately for Net::HTTP. Fixes #162.
-* Fix MapReduce jobs on PBC when keep=false on certain phases. [Alexander Lang]
-* Invalidate the key-cache for a bucket when streaming.
-* Pass options through Document#all to Bucket#keys.
-* Make Hash#to_param compatible with ActiveSupport. [Dave Perrett]
-* Add support for previous_changes functionality and make available to callbacks. [Nathaniel Talbott, Sean Cribbs
-h2. 0.9.4 Patch Release - 2011-05-10
-Release 0.9.4 is a minor bugfix release.
-Full notes:
-* Allow global JSON options to be set so that deeply nested objects can be serialized.
-* Set TCP_NODELAY on PBC sockets and send messages in a single write to reduce latency. [Technorama, Dan Hodge]
-* X510 should be X509 in OpenSSL. [Adam Hunter]
-h2. 0.9.3 Patch Release - 2011-04-18
-Release 0.9.3 is a minor bugfix release.
-Full notes:
-* Make YAML serialization spec immune to engine differences. [Jeff Pollard]
-* Key-streaming over HTTP are immune to JSON objects that cross chunk boundaries.
-* Require 'yaml' so we can read the config file.
-* Require 'erb' so we can eval the config. [Myron Marston]
-* Move definition of validates_associated back into the validator. [Myron Marston]
-* Require 'set' before Set is extended. [André Silva]
-h2. 0.9.2 Patch Release - 2011-04-11
-Release 0.9.2 is a minor bugfix release.
-Full notes:
-* Remove usage of autoload from all projects to reduce thread-safety problems.
-* Fix Excon backend to properly initialize response headers under error conditions. [Jeff Pollard, Myron Marston]
-* Excon yields multiple arguments to the streaming block.
-h2. 0.9.1 Patch Release - 2011-04-07
-Release 0.9.1 is a minor bugfix release.
-Full notes:
-* Fix strange encoding problems on Ruby 1.9 when using Protocol Buffers.
-* Use http_port rather than port in the generated TestServer. [Myron Marston]
-h2. 0.9.0 Feature Release - 2011-04-03
-Release 0.9.0 is a huge step forward from the 0.8 series, including support for Riak 0.14.x features, Protocol Buffers transport, and many bugfixes.
-Following this release, the code will be branched into a 0.9-stable branch, which will only receive critical bugfixes. Development of 1.0 features will occur on the master branch.
-Full notes:
-* Fixed some client semantics: separate ports for protocols, client ID responsibility.
-* Add definition of EmbeddedDocument#==. [Myron Marston]
-* Allow a many-linked doc to be removed from an association. [Myron Marston]
-* Fix one-linked association to return nil appropriately. [Myron Marston]
-* Added external JSON serialization for Ripple documents.
-* Fixed validates_associated. [Myron Marston]
-* Fixed assignment bug in one-embedded associations. [Myron Marston]
-* Added integration tests that work across all client backends.
-* Added support for Protocol Buffers transport with Beefcake library.
-* Added HTTP Basic authorization support. [Adam Hunter]
-* Added HTTPS support. [Adam Hunter]
-* Normalized project Gemfiles.
-* Extracted stream-isolating pump pattern from client backends.
-* Improve speed and reliability of test server.
-* Bubble up errors when saving a document. [Duff OMelia]
-* Add automatic expiration to Rack session store.
-* Use ISO8601 datetime format in stored documents (configurable). [Nicolas Fouché]
-* Access document attributes that do not have a declared property. [Duff OMelia]
-* Fix document callback ordering. [Nathaniel Talbott]
-* Consolidate setting of the object key when link-walking. [Kyle Kingsbury]
-* Added support for streaming MapReduce.
-* Bucket instances are now memoized in the Client. [Woody Peterson]
-* Client backends were refactored so that higher layers are not concerned with transport semantics.
-* Fix false.present? bug.
-* Riak 0.14 features:
-** MapReduce has support for key-filters.
-** Add list_buckets operation.
-** HTTP resources prefixes can be discovered from the root URL.
-* Added document observers using ActiveModel::Observer. [Stefan Sprenger]
-* :key is a protected attribute on Document models. [Adam Hunter]
-h2. 0.8.3 Patch/Minor Feature Release - 2010-12-13
-Release 0.8.3 includes new generators for Rails 3 projects, a new HTTP backend based on Wesley Beary's Excon library, and significant bugfixes for Document models.
-@riak-client@ is now also completely independent of ActiveSupport, and all three libraries have better support for JRuby.
-Full notes:
-* Fix edge case where NetHTTPBackend would not #to_i the response code.
-* Improve handling of Time properties, including ActiveSupport::TimeWithZone. [Duff O'Melia]
-* Don't cast empty string for Numeric property types. [Marco Campana]
-* Add MapReduce built-ins generator.
-* Add generators to help with Riak::TestServer and initial Rails 3 setup. [Duff O'Melia, Sean Cribbs]
-* Improve handling of Document properties we don't know about.
-* Refactored RequestHeaders so it can be used by multiple backends.
-* Add Excon HTTP backend.
-* Control mock HTTP server via DRb so as to avoid deadlocks.
-* Monkeypatch #present? seperately from #blank?. [Kyle Kingsbury]
-* Improved RObject#inspect output. [Jay Adkisson]
-* Fix Bucket#keys raising exceptions on rare occasions. [Kyle Kingsbury]
-* Add support for mass-assignment security on Document models.
-* Moved ActiveSupport version check into CacheStore.
-* Added example TestServer config files.
-* Allow document assignment even if the value is a proxy. [Duff O'Melia]
-* Remove "install curb" warnings.
-* Improve JRuby compatibility.
-* Resolve Hash-ordering differences between 1.9 and 1.8 in specs.
-* Fix 1.8.x issue with Open3 returning a nil waitthread in the TestServer.
-* Removed riak-client dependency on ActiveSupport. [Kyle Kingsbury]
-* Report a changed attribute only if its value changes. [Duff O'Melia]
-* Reloading a Ripple::Document now casts property values. [Duff O'Melia]
-h2. 0.8.2 Patch/Minor Feature Release - 2010-10-22
-Release 0.8.2 includes significant additions to support features in Riak 0.13, including Riak Search and Luwak.
-Simply @require 'riak/search'@ to add Search-related features to riak-client.
-Full notes:
-* Fixed bug in embedded associations where associated validators would be added every time the association was instantiated. [Adam Hunter]
-* Update and loosen dependencies to Rails 3.0.1 and RSpec 2.
-* Add support for file-existence check in Luwak. [John Axel Eriksson]
-* Avoid clobbering an existing Boolean class or module.
-* Add Luwak support.
-* Add Search features. [Sean Cribbs, Rusty Klophaus]
-h2. 0.8.1 Patch/Minor Feature Release - 2010-10-11
-Release 0.8.1 includes several new features and bugfixes.
-Full notes:
-* Riak::TestServer makes it easier and faster to run automated tests that need to store data in Riak. It includes an in-memory Riak backend that quickly clears its contents at the end of a test/example. All included integration tests now use this.
-* Headers are turned into strings before splitting into 8KB chunks. [Nicolas Fouché]
-* Riak::RObject#prevent_stale_writes option allows conditional PUT semantics, matching on ETag. [Lee Jensen]
-* Riak::RObject#raw_data gives access to the object data before deserialization. [Lee Jensen]
-* Boolean properties on Ripple documents now allow a default value of false. [Duff O'Melia]
-* Ripple documents now support accepts_nested_attributes_for. [Brian Kaney]
-h2. 0.8.0 Feature Release - 2010-08-31
-The 0.8.0 release is packed full of new features and bugfixes. Of particular note are:
-* Rails 3 final support
-* Session stores
-* Linked associations
-* Riak 0.12 support
-Full notes:
-* Ripple::Document classes can define their desired quorum parameters.
-* ripple and riak-sessions use Rails 3 final. riak-client is still compatible with active_support >= 2.3.5.
-* Keys are not loaded by default when requesting a Riak::Bucket. This matches the default for Riak 0.12.
-* Ripple::Document now supports update_attributes and update_attribute.
-* Inspection output has been improved for Ripple documents.
-* Ripple::Document classes can now have associations that use links.
-* Property-casting patches are now eagerly loaded.
-* Certain responses from MapReduce can be converted into Riak::RObjects. [Misha Gorodnitzky]
-* Key/bucket (un)escaping has been improved. [Nicolas Fouché]
-* Riak::CacheStore sets and uses bucket-default quorums instead of per-request parameters.
-* Riak::Bucket supports new quorum defaults.
-* The default configuration file for Ripple is now config/ripple.yml. [Ashley Woodard]
-* Added a Rails 3 model generator. [Ashley Woodard]
-* Serializing RObject data via Marshal is now simpler, using "application/x-ruby-marshal" content-type.
-* Large HTTP headers (Link tends to be one) are split into 8KB chunks for both backends.
-* Added session stores for Rack and Rails 3.
-* Document#find returns nil when all arguments are blank.
-* CurbBackend now properly handles IO objects as the request body data.
-* Ripple::Document classes that have the same bucket/key are equivalent using ==.
-* Ripple::Document classes can use a property as the key, as long as it's a String.
-h2. 0.7.1 Patch Release - 2010-06-08
-This release has no new features but includes bug fixes and some internal refactoring of the Ripple::Document hierarchy.
-* The Net::HTTP backend should handle streamed keys better (although
- still not perfectly).
-* The Riak::MapReduce#timeout method now returns self, allowing
- chaining.
-* The Ripple::Document and Ripple::EmbeddedDocument are less coupled
- from one another so numerous internal confusions about calling order
- are fixed.
-* When using Riak::RObject#to_link, a blank tag is no longer allowed.
-h2. 0.7.0 Feature Release - 2010-05-06
-This release includes a number of new features. The largest change is that the library is now split into two gems, 'riak-client' and 'ripple'. 'riak-client' supports ActiveSupport 2.3.5, 'ripple' only supports 3.0.0.beta3.
-A big kudos goes to Adam Hunter who contributed the majority of the new associations code.
-In addition, these changes were made:
-* Keys should stream properly now from Bucket#keys (the "stream" option was left off).
-* Deletes can be issued directly from a Bucket without instantiating an RObject.
-* Added a ActiveSupport 3.0-compatible Cache Store. [Shay Frendt]
-* Added Bucket#exists?
-* A provisionally complete implementation of embedded document associations. [Adam Hunter]
-* Ripple::Document passes ActiveModel::Lint tests.
-* Updated Rails 3 dependencies to beta3 and RSpec to 2.0.0.beta6
-* Ripple::Document handles nil keys better. [John Lynch]
-h2. 0.6.1 Patch Release - 2010-03-17
-This is a minor release with fixes for a few issues:
-* Riak::Link objects will now be unique when added to RObject#links
- Set. [John Lynch]
-* Attributes on Ripple::Document classes are no longer clone, which had
- prevented non-scalar properties from being modified directly (e.g. Array).
-* Buckets, keys, and walk specs are properly escaped in URLs
- (including slashes).
-* Time-related properties properly convert to string formats in JSON that
- they will work in the context of MapReduce jobs.
-h2. 0.6.0 Feature Release - 2010-03-05
-This release contains enhancements and bugfixes in preparation for the
-Riak 0.9 release.
-* The CurbBackend now uses fibers to prevent curl-handle corruption when
- a block is given to streaming operations.
-* The default prefix is now "/riak/" to match the latest version of Riak.
-* The client configuration for Ripple is now used.
-* Added Bucket#new and Bucket#get_or_new for easily creating new objects.
-* Added Bucket#allow_mult and Bucket#n_value accessors for more easily setting
- bucket properties.
-* Added timestamps! method for easily adding created_at/updated_at to documents.
- [Adam Hunter]
-* The 'links' collection on RObject is now a Set instead of an Array.
-* All literal messages are now stored in YAML localization files.
-* Object siblings (caused by concurrent updates when allow_mult is true) can now
- be accessed directly.
-* Map-reduce jobs now have timeouts (in parity with Riak).
-h2. 0.5.1 Patch Release - 2010-02-22
-This is a minor release with fixes for Ruby 1.9, bundler/edge Rails,
-and a minor feature addition. Changes:
-* Qualify namespaces for Ruby 1.9.
-* Decoupled a few specs that gave the appearance of failure.
-* Added "bucket" and "key" properties on Riak::Link objects. [John Lynch]
-* Fully-qualify the @JSON@ constant, using @ActiveSupport::JSON@ instead.
-* Adjusted gem specification to accommodate edge Rails. [Preston Marshall]
-h2. 0.5 Initial Release - 2010-02-10
-This is the first release of Ripple, which would not have been possible
-without the generous support of Sonian and Basho Technologies. Many thanks.
-It includes:
-* A robust basic client, @Riak@, with:
-** multiple HTTP backends (curb, net/http)
-** sensible client defaults (local, default port)
-** bucket access and manipulation, including key-streaming
-** object reading, storing, deleting and reloading
-** automatic de-serialization of JSON, YAML, and Marshal (when given the right content type)
-** streaming POST/PUT bodies (when given an IO)
-** method-chained map-reduce job construction
-* A document-style modeling library, Ripple, with:
-** ActiveModel 3.0 compatibility
-** Property/attribute definition with automatic type-casting
-** Bucket selection based on class name, with single-bucket inheritance (configurable)
-** Validations
-** Dirty-tracking
-** Simple finders - all documents, by key
-** Reloading

0 comments on commit f33eae2

Please sign in to comment.