Erlang Client: get_update_metadata vs get_metadata

Andrew Berman rexxe98 at gmail.com
Wed Jun 13 03:24:53 EDT 2012


Thanks guys,

I'm more inclined to have an API like get_original_metadata and
get_metadata.  The get_metadata in this case always returns whatever
metadata is set on the object, new or original.  In the current API, if
calling get_update_metadata will return the original metadata if there are
no changes, then I kinda fail to see a use case for the get_metadata call.
 Anyone?

Thanks again!

Andrew

On Tue, Jun 12, 2012 at 2:37 PM, Michael Radford <mrad at blorf.com> wrote:

> Reid,
>
> I do understand why update_metadata exists. I guess what I'm
> suggesting is a better default behavior, especially for users who
> don't explicitly set any metadata values. (Or even if they do, for
> when all the metadatas are equivalent.)
>
> I.e., something like this for riakc_obj:get_update_metadata:
>
> get_update_metadata(#riakc_obj{updatemetadata=UM}=Object) ->
>    case UM of
>        undefined ->
>            try
>                get_metadata(Object)
>            catch
>                throw:no_metadata ->
>                    dict:new();
>                throw:siblings ->
>                    default_resolve_metadatas(get_metadatas(Object))
>            end;
>        UM ->
>            UM
>    end.
>
> default_resolve_metadatas(Ms = [M | _]) ->
>    UniqueWritten = lists:usort([ [KV || KV = {K, _V} <- dict:to_list(M),
>                                         K =/= ?MD_LASTMOD,
>                                         K =/= ?MD_INDEX
>                                  || M <- Ms ]),
>    case UniqueWritten of
>      [_]        -> M;
>      [_, _ | _] -> throw(siblings)
>    end.
>
> Mike
>
> On Tue, Jun 12, 2012 at 1:18 PM, Reid Draper <reiddraper at gmail.com> wrote:
> >
> > On Jun 12, 2012, at 2:56 PM, Michael Radford wrote:
> >
> >> get_metadata returns the metadata that was read from riak. But if
> >> allow_mult is true, and there is more than one sibling, then
> >> get_metadata throws the exception 'siblings'. You have to call
> >> get_metadatas to get a list with metadata for each sibling in that
> >> case.
> >>
> >> get_update_metadata returns the metadata that is to be written for the
> >> object (if you were to call riakc_pb_socket:put at that point). The
> >> update metadata is either a single value set explicitly with
> >> riakc_obj:update_metadata, or if none was set, and there is only one
> >> sibling, then the default is the value of get_metadata.
> >>
> >> A related question: if I'm not using any user-specified metadata at
> >> all, but I do have allow_mult turned on, then how do I choose which
> >> metadata to write back to riak after resolving the conflict? Or could
> >> I just call update_metadata with an empty dict in that case?
> > I'd recommend calling update_metadata with an empty dict. Be sure
> > to set the content_type as well.
> >>
> >> Right now, I have some conflict resolution code that uses the same
> >> default strategy as mochimedia's statebox_riak library, which
> >> arbitrarily chooses the first metadata. But this seems less than
> >> ideal: everything in the metadata is coming from riak, and some of it
> >> (e.g., last-modified timestamps) must be ignored when doing the
> >> update. So it seems like riak should be able to resolve the "metadata
> >> conflict" on its own: just prune all the metadata keys that aren't
> >> actually written, and then if the resulting pruned metadatas are
> >> identical, then there's no conflict. Or, if there is some reason why
> >> the user should prefer one metadata over another, then the client
> >> library should give the user some way to decide.
> > There are definitely cases where the user wants to choose one metadata
> > over another, or perhaps more commonly, "merge" them together, according
> > to some conflict resolution semantics. The client provides
> `update_metadata`
> > for this reason. `select_sibling/2` can be used to choose a particular
> {Metadata, Value}
> > pair as well.
> >>
> >> Mike
> >>
> >> On Tue, Jun 12, 2012 at 11:25 AM, Andrew Berman <rexxe98 at gmail.com>
> wrote:
> >>> Can someone explain the difference between the get_update_metadata and
> >>> get_metadata functions in the Erlang PB Client for Riak?  It's very
> >>> confusing...
> >>>
> >>> Thanks,
> >>>
> >>> Andrew
> >>>
> >>> _______________________________________________
> >>> riak-users mailing list
> >>> riak-users at lists.basho.com
> >>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
> >>>
> >>
> >> _______________________________________________
> >> riak-users mailing list
> >> riak-users at lists.basho.com
> >> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.basho.com/pipermail/riak-users_lists.basho.com/attachments/20120613/7718e60b/attachment.html>


More information about the riak-users mailing list