Skip to content

Latest commit

 

History

History
140 lines (103 loc) · 4.3 KB

object.rst

File metadata and controls

140 lines (103 loc) · 4.3 KB

Values & Objects

riak.riak_object

Keys in Riak are namespaced into buckets <riak.bucket.RiakBucket>, and their associated values are represented by objects <RiakObject>, not to be confused with Python "objects". A RiakObject is a container for the key, the vclock, the value(s) and any metadata associated with the value(s).

Values may also be datatypes <riak.datatypes.Datatype>, but are not discussed here.

RiakObject

RiakObject

key

The key of this object, a string. If not present, the server will generate a key the first time this object is stored.

bucket

The bucket <riak.bucket.RiakBucket> to which this object belongs.

resolver

vclock

The vclock for this object.

exists

Vector clock

Vector clocks are Riak's means of tracking the relationships between writes to a key. It is best practice to fetch the latest version of a key before attempting to modify or overwrite the value; if you do not, you may create siblings or lose data! The content of a vector clock is essentially opaque to the user.

VClock

Persistence

Fetching, storing, and deleting keys are the bread-and-butter of Riak.

RiakObject.store

RiakObject.reload

RiakObject.delete

Value and Metadata

Unless you have enabled siblings via the allow_mult <riak.bucket.RiakBucket.allow_mult> bucket property, you can inspect and manipulate the value and metadata of an object directly using these properties and methods:

RiakObject.data

RiakObject.encoded_data

RiakObject.content_type

RiakObject.charset

RiakObject.content_encoding

RiakObject.last_modified

RiakObject.etag

RiakObject.usermeta

RiakObject.links

RiakObject.indexes

RiakObject.add_index

RiakObject.remove_index

RiakObject.set_index

RiakObject.add_link

Siblings

Because Riak's consistency model is "eventual" (and not linearizable), there is no way for it to disambiguate writes that happen concurrently. The vclock helps establish a "happens after" relationships so that concurrent writes can be detected, but with the exception of datatypes, Riak has no way to determine which write has the correct value.

Instead, when allow_mult <riak.bucket.RiakBucket.allow_mult> is True, Riak keeps all writes that appear to be concurrent. Thus, the contents of a key's value may, in fact, be multiple values, which are called "siblings". Siblings are modeled in RiakContent <riak.content.RiakContent> objects, which contain all of the same object_accessors methods and attributes as the parent object.

RiakObject.siblings

riak.content.RiakContent

You do not typically have to create RiakContent <riak.content.RiakContent> objects yourself, but they will be created for you when fetching <RiakObject.reload> objects from Riak.

Note

The object_accessors accessors on RiakObject are actually proxied to the first sibling when the object has only one.

Conflicts and Resolvers

When an object is not in conflict, it has only one sibling. When it is in conflict, you will have to resolve the conflict before it can be written again. How you choose to resolve the conflict is up to you, but you can automate the process using a resolver <RiakObject.resolver> function.

riak.resolver.default_resolver

riak.resolver.last_written_resolver

If you do not supply a resolver function, or your resolver leaves multiple siblings present, accessing the object_accessors will result in a ConflictError <riak.ConflictError> being raised.

riak.ConflictError