From f0e3c39003fc5adbe753053db08b829a6b622164 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Wed, 18 Sep 2013 15:08:46 -0400 Subject: [PATCH] Modify the version 1 format to support bucket types The new keydir format has 2 forms, as follows <> <> The 8th bit of the binary is the bit that indicates if a bucket type is present, and tells the decoder which form to expect. --- src/riak_kv_bitcask_backend.erl | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/riak_kv_bitcask_backend.erl b/src/riak_kv_bitcask_backend.erl index a825effc71..de1d3f251e 100644 --- a/src/riak_kv_bitcask_backend.erl +++ b/src/riak_kv_bitcask_backend.erl @@ -93,32 +93,41 @@ capabilities(_, _) -> {ok, ?CAPABILITIES}. %% @doc Transformation functions for the keys coming off the disk. -key_transform_to_1(<> = Key) -> +key_transform_to_1(<> = Key) -> Key; -key_transform_to_1(<<131:8,_Rest/binary>> = Key0) -> +key_transform_to_1(<<131:8,_Rest/bits>> = Key0) -> {Bucket, Key} = binary_to_term(Key0), - BucketSz = size(Bucket), - <>. + make_bk(?VERSION_BYTE, Bucket, Key). -key_transform_to_0(<> = Key0) -> - <> = Key0, - term_to_binary({Bucket, Key}); +key_transform_to_0(<> = Key0) -> + term_to_binary(bk_to_tuple(Key0)); key_transform_to_0(<<131:8,_Rest/binary>> = Key) -> Key. -bk_to_tuple(<>) -> - {Bucket, Key}; +bk_to_tuple(<>) -> + case HasType of + 0 -> + %% no type, first field is bucket + {TypeOrBucket, Rest}; + 1 -> + %% has a tyoe, extract bucket as well + <> = Rest, + {{TypeOrBucket, Bucket}, Key} + end; bk_to_tuple(<<131:8,_Rest/binary>> = BK) -> binary_to_term(BK). make_bk(0, Bucket, Key) -> term_to_binary({Bucket, Key}); +make_bk(1, {Type, Bucket}, Key) -> + TypeSz = size(Type), + BucketSz = size(Bucket), + <>; make_bk(1, Bucket, Key) -> BucketSz = size(Bucket), - <>. %% @doc Start the bitcask backend