This is a bugfix release. The major fixes are to the Secondary Index, Riak Control, and LevelDB subsystems.
-
Pagination for equality queries is fixed by riak_kv/615.
-
The ability to set a timeout on a 2i query has been added by riak_kv/616.
-
Using 2i as input for a map-reduce job has been fixed by riak_kv/618.
-
Riak Control can crash its host node when in a mixed-cluster environment containing a 1.4.0 node. This has been addressed by riak_control/120.
-
Basho's leveldb fork has added better fadvise support and fixed some race conditions in the write path. See leveldb/88.
- riak_core/351: Fix catch pattern to match all errors
- riak_core/352: Fix TCP mon to correctly spot nodes coming up
- riak_kv/615: Do not set the start_term to the last seen key for eq (2i)
- riak_kv/616: Add millisecond timeout parameter to API 2i endpoints
- riak_kv/618: Strip index term from result before passing to MR (2i)
- riak-erlang-client/108: Add timeouts to 2i queries
- riak_pb/50: Add timeout field to 2i messages
- riak_control/120: Handle incompatible records between the 1.3 and 1.4 release
- leveldb/88: More effective fadvise calls + fix write race conditions
- node_package/75: In RPMs: Do not error on post install script if usermod fails
- node_package/76: Fix
riak version
for RPM packages
Data stored in Riak can now be represented in a more compact format. The new format reduces storage overhead, especially in the case of small objects or those with large bucket names, keys, or metadata.
By default new Riak clusters, starting with Riak 1.4, will have the new format enabled by default. Users upgrading to Riak 1.4 should first perform the upgrade and once happy with the operation enable the new format. Riak supports both the old and new representation simultaneously, so no additional upgrade process is necessary.
Which representation is used can be configured by setting
object_format
to either v0
or v1
in the riak_kv
section of
app.config
. v1
is the new format.
The new format is also used during handoff if the cluster supports it.
For users who upgrade to Riak 1.4 and enable the new format,
downgrading to a previous version requires reformatting any data
written in the new representation (previous version of Riak won't
understand it). A utility is provided via riak-admin
to perform this
operation:
riak-admin downgrade-objects <kill-handoffs> [<concurrency>]
The utility should be run per-node immediately prior to downgrading
it. <kill-handoffs>
must be either true
or false
. If false
any
ongoing handoff will be waited on before performing the
reformat. Otherwise, all in-flight handoff, inbound to the node or
outbound from it, will be killed. During and after the reformat the
transfer-limit
will be set to 0. The optional <concurrency>
argument must be an integer greater than zero. It determines how many
partitions are reformatted on the node concurrently. By default the
concurrency is two. Additionally, in anticipation that the entire
cluster will be downgraded downgrade-objects
sets the preferred
format to v0
. downgrade-objects
can be run multiple times in the
case of error or if the node crashes.
If you are a frequent user of riak attach
it is worth noting that the behavior has changed in 1.4. riak attach
used to attach to a named pipe that erlang provides to talk to running erlang nodes. This is great except that an accidental Ctrl-C would not only kill your session, but also kill the running node. The behavior has now changed to use -remsh
(remote shell) to connect to the node. This method is safer because a Ctrl-C will not kill a running node. In cases where distributed erlang having problems for some reason and a -remsh is not wanted, riak attach-direct
is a new command which uses the old pipe behavior of riak attach
.
The output of riak-admin transfers
now includes per-transfer
progress reporting and improved display of long node names.
Whether or not progress is reported and how the progress is calculated is
dependent on the cluster's backend. Progress reporting is enabled for
riak_kv_bitcask_backend
, riak_kv_eleveldb_backend
and
riak_kv_memory_backend
. Clusters using riak_kv_multi_backend
will
not have progress reporting enabled. When using riak_kv_bitcask_backend
or
riak_kv_memory_backend
progress is determined by the number of keys
already transferred out of the total number stored. Large variance in
value sizes can skew reporting. For riak_kv_eleveldb_backend
progress is measured in stored bytes. The total number of bytes used
may be an overestimate -- meaning progress will always be what is
reported or further along than reported in the worst case.
Lager has been updated in Riak from Lager 1.2.2 that was in the Riak 1.3.x series to Lager 2.0.0. Please see the lager documentation at https://github.com/basho/lager for the new capabilities in Lager 2.0.
We've extended Riak's Secondary Indexing (2i) interface to allow for paginated results. This is done via the max_results
option in both the Protocol Buffers and HTTP 2i end points. Full details can be found here.
Clients can now specify a timeout value, in milliseconds, that will override the default internal timeout on requests that manipulate objects (fetch, store, delete), list buckets, or list keys.
The Protocol Buffers interface now supports all known bucket properties, and the ability to "reset" bucket properties to their defaults.
Similar to listing keys, listing buckets can be streamed to clients. This means that Riak will send bucket names to the client as they are received, rather than waiting for the request to complete on all nodes.
Similar to HTTP, Protocol Buffers will now bind to multiple interfaces
and ports. Existing configurations will change the previous pb_port
and pb_ip
settings to the singular pb
setting, which is a list of
IP/port pairs.
1.4 sees the addition of Riak's first data type: PN-Counters. A PN-Counter is capable of being both incremented (P) and decremented (N). The full details are here. We're also fast at work on a CRDT Cookbook that will demonstrate this and future data types in Riak.
Riak Control now has an improved cluster management interface, and standalone node management interface, for staging and committing changes to the cluster, which mimics the CLI API.
The command riak-debug
is a shell script provided to aid in the automation of gathering information from Riak nodes for troubleshooting. Information gathered includes operating system command output, Riak command output, Riak configuration files, and Riak logs. See riak-debug -h
and man riak-debug
for more information on using the script and for tips on integrating its usage into your workflow.
Riak 1.4 took a major step forward in how it is packaged by changing over to using node_package for its packaging. This is the same tool used for RiakCS since its first release. This commonality will improve overall feature parity and stability of the packages themselves by cutting down on the number of places packaging bug fixes need to happen. See the 'node_package' section in the Issues section for all the bug fixes to packaging in this release.
Support for Debian Wheezy and SmartOS 13.1 have been added to 1.4. As planned, support for 32bit packages has been dropped.
- init.d scripts for Deb and RPM systems have been rewritten to comply with the standards of those distributions. In particular the init scripts now actually return nonzero exit codes on failure. This was a major issue we had that prevented tools from working seamlessly.
- All start, stop, and status commands use return codes rather than reading stdout. This has been a major 'technical debt' we've had for a long time and it is about time the rest of it is finally fixed.
riak.pid
files are now created and removed onriak start/stop
. This allows other tools to take advantage of .pid files without them needing knowledge about the riak script or nodetool.- Warnings added to
riak attach
andriak attach-direct
to let users know about implications of q() and CTRL-C - The
riak
script now makes it more obvious which commands need to be run as the Riak user (or root user). Status commands likegetpid
orping
can be run by any user while daemon commands likestart
andstop
will error in a more graceful if not run by the Riak user.
- bear/1: Remove native flag and add kernel,stdlib to app deps
- bitcask/89: add dialyzer targets
- bitcask/92: Fix merge logging bug introduced by bs-merge-expiration-change branch
- folsom/2: Improve performance of slide histogram
- leveldb/73: level work1
- leveldb/74: Add status query for total bytes used by a LevelDB instance
- leveldb/75: Merge of Google 1.6, 1.7, 1.8, and 1.9 releases
- leveldb/78: Repair updated for edge case created with new directory structure.
- leveldb/79: filecache tuning2
- leveldb/81: bloom size limit
- leveldb/84: level work3, change from 3 overlapped levels to 2
- merge_index/30: Remove delayed_write option
- mochiweb/7: Range header fix
- mochiweb/8: Remove parameterized modules.
- node_package/40: init script returns success even if riak does not start
- node_package/43: Add SRPMS and make RPM version field fully compatible
- node_package/44: Convert RPM init script to fall in line with Redhat style
- node_package/47: Add app_epath.sh, a POSIX app.config parsing utility.
- node_package/49: Create .pid files for package builds
- node_package/50: RPM %files changes behavior on Fedora 18
- node_package/51: Return nonzero exit codes on init function failure
- node_package/54: Fix %files section to not claim ownership of bindir and mandir
- node_package/55: Investigate shipping configuration to increase open files ulimit
- node_package/56: Name SunOS packages based on erlang architecture rather than uname
- node_package/57: Base architecture naming on erlc arch
- node_package/60: Add support for SmartOS 13.1
- node_package/61: add simple warnings on attach/attach-direct
- node_package/63: remove contract specification from SMF manifests (solaris)
- node_package/65: Create patches for SmartOS packages to handle differing behavior
- erlang_protobuffs/41: Fix some README example problems, callout deep lists change.
- erlang_protobuffs/42: Cleanup warnings
- erlang_protobuffs/45: Be more firewall-friendly :-)
- erlang_protobuffs/46: Fix parsing hex values
- erlang_protobuffs/47: fix compiler warnings about shadowed variables
- erlang_protobuffs/49: Fix enums when using packages
- erlang_protobuffs/51: Remove O(N^2) algorithm from repeated field extraction.
- riak/254: Changed
riak attach
to use a remsh - riak/268: Switch riak to use node_package for packaging
- riak/272: Add new rebar binary and erlydtl opts info toplevel rebar.config for solving dialyzer glitches
- riak/283: We insist on a minimum of 5 nodes in a cluster, adjust devrel
- riak/286: move and clarify ulimit check
- riak/288: remove embedded option
- riak/290: Support multiple PB listeners
- riak/294: Add missing rm -rf dev/$@/lib/riaknostic on dev target
- riak/303: update riak-admin transfers
- riak/310: Remove incorrect
-embedded
flag from riak startup command - riak/311: add "cluster resize-ring " to riak-admin
- riak/322: Add riak-debug, a command for automating the collection of information for diagnosing problems.
- riak/329: Riaknostic no longer escript. Alter build process accordingly.
- riak/331: Lower net_ticktime to check for aliveness more often
- riak/339: update vm.args for moving to OTP team scheduler patch
- riak/341: update app.config to activate v1 object format on new installs
- riak/345: Unable to build Riak from source tarball while offline
- riak_api/21: Move setting/fetching bucket properties out of riak_kv
- riak_api/22: Use init:script_id() for the server version.
- riak_api/23: Enable multiple PB listeners.
- riak_api/24: Add support for resetting bucket properties. Requires basho/riak_pb#35.
- riak_api/25: Remove lager dependency because it is specified by riak_core.
- riak_api/28: No PB listeners leads to repeated log messages concerning a failed stat calculation
- riak_control/54: Fixes to get dialyzer working.
- riak_control/59: Series of dialyzer and formatting changes.
- riak_control/71: Add cluster management.
- riak_control/80: Add ability to stop and down nodes.
- riak_control/81: Normalize resource names.
- riak_control/83: Make join node more explicit.
- riak_control/88: Provide a default selection.
- riak_control/111: Prevent badarith when memory is unavailable.
- riak_core/185: inbound handoffs never cleanup
- riak_core/241: potential fix for #185
- riak_core/270: Dialyzer Fixes
- riak_core/274: Allow parallel vnode initialization
- riak_core/282: Extract out and export pending claim function.
- riak_core/284: initial add of the Riak Core Connection Manager
- riak_core/290: Add support for tracking progress of individual handoffs
- riak_core/291: SSL support
- riak_core/297: don't use hardcoded app names in SSL utils
- riak_core/298: Race in vnode worker pool
- riak_core/299: Vnode nonblocking reply, First draft (3rd edition), ready for some review
- riak_core/300: Fix worker pool races
- riak_core/301: Ring Resizing
- riak_core/302: rework coverage fsm timeouts.
- riak_core/305: Support for
plan/2
andprocess_results/3
funs for coverage fsm - riak_core/312: Enhance transfer display + wrapping nodenames.
- riak_core/313: format _stat_ts in connection manager
- riak_core/316: handoff batching
- riak_core/319: Optimize to better handle large rings/nodes
- riak_core/321: proper return value for riak_core_console:transfers/1
- riak_core/322: Handle node up/down in tcp_mon
- riak_core/323: Permanently disable legacy gossip
- riak_core/325: Fix a typo in tcp_mon init
- riak_core/328: Fix overload test time outs
- riak_core/330: dont start coverage timeout timer if timeout is infinite
- riak_core/331: fix forced_ownership_handoff during resize
- riak_core/332: update bad value protection for timer value
- riak_core/334: Reporting 'normal' events is spammy, don't do it
- riak_core/336: Fix crashing stat mod never getting rescheduled
- riak_core/339: Fix repair handoff crash, missing not sent fun
- riak_core/340: only silently drop DOWN-normal messages in deleted modstate
- riak_kv/30: Bz982 - js_reload not working
- riak_kv/31: Key count reduce function
- riak_kv/334: Every read triggers a read-repair when Last-write-wins=true
- riak_kv/385: Objects cannot be updated if a bad CRC is encountered by Bitcask
- riak_kv/462: Expose FSM timeouts via the HTTP API
- riak_kv/467: add stats for coverage query starts
- riak_kv/479: More Compact Riak Object Binary Format
- riak_kv/487: provide a Location header for the same api version on POST
- riak_kv/488: Move setting/fetching bucket properties to riak_api
- riak_kv/489: Migrate mapred_test to riak_test
- riak_kv/491: Remove Link headers from bucket and key lists
- riak_kv/492: Make hashtree_eqc close trees before destroy.
- riak_kv/495: Add encoding capability for handoff.
- riak_kv/496: Standardize KV backend responses and handling
- riak_kv/498: Document the environment in the logs; advise on bad settings.
- riak_kv/500: vclock capability
- riak_kv/510: Remove merge_index dependency and unused erl_first_file.
- riak_kv/512: Protocol Buffers interface allows the creation of records with an empty key
- riak_kv/520: Adds X-Riak-Deleted where missing
- riak_kv/521: Changes needed to expose FSM timeouts to clients
- riak_kv/526: Expose Backend Size to Handoff for Progress Tracking
- riak_kv/527: List buckets timeout & streaming
- riak_kv/529: Count async MR results against the sink buffer size cap
- riak_kv/530: Ring Resizing Support
- riak_kv/532: kv_wm_utils expects ?MD_DELETED to be "true" not 'true'
- riak_kv/536: A simple way to store a PN-Counter in a riak_object
- riak_kv/542: add license header to riak_kv reformat
- riak_kv/546: Expose the put_fsm 'asis' option to clients
- riak_kv/552: Add new backend capability for Riak r_object use
- riak_kv/554: Optimize to better handle large rings/nodes
- riak_kv/555: Add init/final to AAE remote interface
- riak_kv/559: Alter env recommendations for 1.4
- riak_kv/560: Fix regression in 2i reformat status flag & add extra status function
- riak_kv/562: use old object format by default on upgrade
- riak_kv/563: Add binary format for counters
- riak_kv/569: Make sure client supplied N <= bucket N
- riak_kv/576: Add a capability for counters
- riak_kv/579: Skip start {val, key} pair if start_inclusive is false
- riak_kv/581: Wire up sidejob stats to /stats endpoint
- riak_kv/585: minor improvements to riak_object downgrade support
- riak_kv/586: Stop fold when a vnode reaches page size
- riak_kv/587: Fix incorrect arg in call to get_primary_apl/3 by put FSM
- riak_kv/588: Multi backend was missing data_size function
- riak_pb/30: Add remaining bucket properties to PBC
- riak_pb/31: Fix errors with repl bucket property.
- riak_pb/32: precommit/postcommit empty does not clear
- riak_pb/33: Fix commit hooks and symbolic properties as binaries
- riak_pb/35: Support reset bucket properties feature.
- riak_pb/36: Protoc dependency free version for Python Package Index
- riak_pb/38: Add timeouts to get, put, and delete
- riak_pb/41: Add messages for exporter tool & list timeouts
- riak_pb/42: Remove need to have protoc available in Python source package. Closes #36
- riak_pb/43: 2i pagination support
- riak_pb/44: Add asis flag for RpbPutReq.
- riak_pipe/50: fitting was done before startup
- riak_pipe/62: Move eunit system tests to riak_test
- riak_pipe/68: assume handoff if vnode exits 'normal' during queue requeuest
- riak_pipe/71: Fix opaque type warnings on R16B.
- riak_pipe/73: PULSE test & fix riak_pipe_fitting
- riak_pipe/75: lower "fitting was gone" log to debug level
- riak_pipe/76: limited support for ring resizing
- riak_search/140: remove guard on riak_search_vnode:start_vnode/1
- riaknostic/55: Remove misplaced parathesis (sysctl check)
- riaknostic/56: Add OpenBSD bits
- riaknostic/66: Un-escriptize riaknostic and modify for lager 2.0 compatability
- riaknostic/67: Add an extra log line for clarity when running non-existent checks
- webmachine/76: Add logging for when webmachine crashes and body exists.
- webmachine/115: Fix arguments to call to webmachine_request:recv_stream_body/2
- webmachine/117: Decode Content-MD5 with base64, not hex
- webmachine/124: Refine range header treatment
- webmachine/125: Guess text/css MIME type for .less files
- webmachine/128: Bugfix for multiple routers under Riak
- webmachine/134: collapse 4 separate send calls into 1 in send_chunk
- webmachine/141: Custom reason phrase
- webmachine/142: Read body when DELETE to keep alive connection
- webmachine/143: webmachine_dispatcher crashes on malformed Host header
- webmachine/144: Allow responses for all HTTP errors to be customized
- webmachine/151: Removing io:format/2 calls from log file processing
The first execution of 1.4.0 leveldb using a 1.3.x or 1.2.x dataset will initiate an automatic conversion that could pause the startup of each node by 3 to 7 minutes. The leveldb data in "level #1" is being adjusted such that "level #1" can operate as an overlapped data level instead of as a sorted data level. The conversion is simply the reduction of the number of files in "level #1" to being less than eight via normal compaction of data from "level #1" into "level #2". This is a one time conversion.
Ubuntu 11.04 Natty Narwhal reached its end-of-life October 2012 and recently the public apt updates and security repos were removed. Due to this, Riak will no longer be built against 11.04 going forward. We will consider supporting the latest non-LTS release depending on the timing of the next major Riak release.
Ubuntu LTS releases still supported (10.04 and 12.04) are unaffected.