Buckets

Buckets are used to define a virtual keyspace for storing Riak objects. They enable you to define non-default configurations over that keyspace concerning replication properties and other parameters.

In certain respects, buckets can be compared to tables in relational databases or folders in filesystems, respectively. From the standpoint of performance, buckets with default configurations are essentially “free,” while non-default configurations, defined using bucket types, will be gossiped around [the ring][glossary read rep] using Riak’s cluster metadata subsystem.

Configuration

Bucket configurations are defined using bucket types, which enables you to create and modify sets of configurations and apply them to as many buckets as you wish. With bucket types, you can configure the following bucket-level parameters, overriding the default values if you wish.

allow_mult

Determines whether sibling values can be created. See siblings. The default can be true or false depending on the context. See the documentation on allow_mult for more information.

n_val

Specifies the number of copies of each object to be stored in the cluster. See the documentation on replication properties. Default: 3.

last_write_wins

Indicates if an object’s timestamp will be used to decide the canonical write in the case of a conflict. See the documentation on vector clocks and on conflict resolution for more information. Default: false.

r, pr, w, dw, pw, rw, notfound_ok, basic_quorum

See the documentation on replication properties for more information on all of these properties.

precommit

A list of Erlang functions to be executed before writing an object. See our documentation on pre-commit hooks for more information. Default: no pre-commit hooks, i.e. an empty list.

postcommit

A list of Erlang functions to be executed after writing an object. See our documentation on pre-commit hooks for more information. Default: no post-commit hooks, i.e. an empty list.

old_vclock, young_vclock, small_vclock, big_vclock

These settings enable you to manage vector clock pruning.

backend

If you are using the Multi backend, this property enables you to determine which of Riak’s available backends—Bitcask, LevelDB, or Memory—will be used in buckets of this type. If you are using LevelDB, Bitcask, or the Memory backend at a cluster-wide level, all buckets of all types will use the assigned backend.

consistent

If you are using Riak’s experimental strong consistency feature for buckets bearing a type, this setting must be set to true. The default is false. More information can be found in our documentation on using strong consistency.

datatype

If you are using Riak data types, this setting determines which data type will be used in buckets of this bucket type. Possible values: counter, set, or map.

dvv_enabled

Whether dotted version vectors will be used instead of traditional vector clocks for conflict resolution. Default: false.

chash_keyfun, linkfun

These settings involve features that have been deprecated. You will not need to adjust these values.

Fetching Bucket Properties

If you’d like to see how a particular bucket has been configured, you can do so using our official client libraries or through Riak’s HTTP API. The following would fetch the properties for the bucket animals if that bucket had a default configuration, i.e. the default bucket type:

Namespace animalsBucket = new Namespace("animals");
FetchBucketProperties fetchProps =
    new FetchBucketProperties.Builder(animalsBucket).build();
FetchBucketProperties.Response response = client.execute(fetchProps);
BucketProperties props = response.getProperties();
bucket = client.bucket('animals')
bucket.properties
$bucketProperties = (new \Riak\Riak\Command\Builder\FetchBucketProperties($riak))
  ->buildBucket('animals')
  ->build()
  ->execute()
  ->getBucket()
  ->getProperties();
bucket = client.bucket('animals')
bucket.get_properties()
{ok, Props} = riakc_pb_socket:get_bucket(Pid, <<"animals">>).
# Assuming that Riak is running on "localhost" and port 8087:

curl http://localhost:8087/types/default/buckets/animals/props

If the bucket animals had a different type that you had created and activated, e.g. my_custom_type, you could fetch the bucket properties like so:

Namespace customTypedBucket = new Namespace("my_custom_type", "animals");
FetchBucketProperties fetchProps =
    new FetchBucketProperties.Builder(customTypedBucket).build();
FetchBucketProperties.Response response = client.execute(fetchProps);
BucketProperties props = response.getProperties();
bucket = client.bucket_type('my_custom_type').bucket('animals')
bucket.properties
$bucketProperties = (new \Riak\Riak\Command\Builder\FetchBucketProperties($riak))
  ->buildBucket('animals', 'my_custom_type')
  ->build()
  ->execute()
  ->getBucket()
  ->getProperties();
bucket = client.bucket_type('my_custom_type').bucket('animals')
bucket.get_properties()
{ok, Props} = riakc_pb_socket:get_bucket(Pid, {<<"my_custom_type">>, <<"animals">>}).
curl http://localhost:8087/types/my_custom_type/buckets/animals/props