Remove binary_to_term

when fetching don't need to binary_to_term key changes
This commit is contained in:
martinsumner 2017-03-29 15:37:04 +01:00
parent 512af7f41a
commit 6143fcb664
2 changed files with 39 additions and 18 deletions

View file

@ -48,6 +48,7 @@
from_ledgerkey/1, from_ledgerkey/1,
to_inkerkv/4, to_inkerkv/4,
from_inkerkv/1, from_inkerkv/1,
from_inkerkv/2,
from_journalkey/1, from_journalkey/1,
compact_inkerkvc/2, compact_inkerkvc/2,
split_inkvalue/1, split_inkvalue/1,
@ -191,17 +192,23 @@ to_inkerkv(LedgerKey, SQN, Object, KeyChanges) ->
%% Used when fetching objects, so only handles standard, hashable entries %% Used when fetching objects, so only handles standard, hashable entries
from_inkerkv(Object) -> from_inkerkv(Object) ->
from_inkerkv(Object, false).
from_inkerkv(Object, ToIgnoreKeyChanges) ->
case Object of case Object of
{{SQN, ?INKT_STND, PK}, Bin} when is_binary(Bin) -> {{SQN, ?INKT_STND, PK}, Bin} when is_binary(Bin) ->
{{SQN, PK}, revert_value_from_journal(Bin)}; {{SQN, PK}, revert_value_from_journal(Bin, ToIgnoreKeyChanges)};
{{SQN, ?INKT_STND, PK}, Term} -> {{SQN, ?INKT_STND, PK}, Term} ->
{{SQN, PK}, Term}; {{SQN, PK}, Term};
_ -> _ ->
Object Object
end. end.
create_value_for_journal({Object, KeyChanges}, Compress) -> create_value_for_journal({Object, KeyChanges}, Compress)
when not is_binary(KeyChanges) ->
KeyChangeBin = term_to_binary(KeyChanges, [compressed]), KeyChangeBin = term_to_binary(KeyChanges, [compressed]),
create_value_for_journal({Object, KeyChangeBin}, Compress);
create_value_for_journal({Object, KeyChangeBin}, Compress) ->
KeyChangeBinLen = byte_size(KeyChangeBin), KeyChangeBinLen = byte_size(KeyChangeBin),
ObjectBin = serialise_object(Object, Compress), ObjectBin = serialise_object(Object, Compress),
TypeCode = encode_valuetype(is_binary(Object), Compress), TypeCode = encode_valuetype(is_binary(Object), Compress),
@ -213,14 +220,19 @@ create_value_for_journal({Object, KeyChanges}, Compress) ->
maybe_compress({null, KeyChanges}) -> maybe_compress({null, KeyChanges}) ->
create_value_for_journal({null, KeyChanges}, false); create_value_for_journal({null, KeyChanges}, false);
maybe_compress(JournalBin) -> maybe_compress(JournalBin) ->
Length0 = byte_size(JournalBin) - 1, Length0 = byte_size(JournalBin) - 5,
<<JBin0:Length0/binary, Type:8/integer>> = JournalBin, <<JBin0:Length0/binary,
KeyChangeLength:32/integer,
Type:8/integer>> = JournalBin,
{IsBinary, IsCompressed} = decode_valuetype(Type), {IsBinary, IsCompressed} = decode_valuetype(Type),
case IsCompressed of case IsCompressed of
true -> true ->
JournalBin; JournalBin;
false -> false ->
V0 = revert_value_from_journal(JBin0, Length0, IsBinary, false), Length1 = Length0 - KeyChangeLength,
<<OBin2:Length1/binary, KCBin2:KeyChangeLength/binary>> = JBin0,
V0 = {deserialise_object(OBin2, IsBinary, IsCompressed),
binary_to_term(KCBin2)},
create_value_for_journal(V0, true) create_value_for_journal(V0, true)
end. end.
@ -234,18 +246,24 @@ serialise_object(Object, true) ->
term_to_binary(Object, [compressed]). term_to_binary(Object, [compressed]).
revert_value_from_journal(JournalBin) -> revert_value_from_journal(JournalBin) ->
Length0 = byte_size(JournalBin) - 1, revert_value_from_journal(JournalBin, false).
<<JBin0:Length0/binary, Type:8/integer>> = JournalBin,
revert_value_from_journal(JournalBin, ToIgnoreKeyChanges) ->
Length0 = byte_size(JournalBin) - 5,
<<JBin0:Length0/binary,
KeyChangeLength:32/integer,
Type:8/integer>> = JournalBin,
{IsBinary, IsCompressed} = decode_valuetype(Type), {IsBinary, IsCompressed} = decode_valuetype(Type),
revert_value_from_journal(JBin0, Length0, IsBinary, IsCompressed). Length1 = Length0 - KeyChangeLength,
case ToIgnoreKeyChanges of
revert_value_from_journal(ValueBin, ValueLen, IsBinary, IsCompressed) -> true ->
Length1 = ValueLen - 4, <<OBin2:Length1/binary, _KCBin2:KeyChangeLength/binary>> = JBin0,
<<JBin1:Length1/binary, KeyChangeLength:32/integer>> = ValueBin, {deserialise_object(OBin2, IsBinary, IsCompressed), []};
Length2 = Length1 - KeyChangeLength, false ->
<<OBin2:Length2/binary, KCBin2:KeyChangeLength/binary>> = JBin1, <<OBin2:Length1/binary, KCBin2:KeyChangeLength/binary>> = JBin0,
{deserialise_object(OBin2, IsBinary, IsCompressed), {deserialise_object(OBin2, IsBinary, IsCompressed),
binary_to_term(KCBin2)}. binary_to_term(KCBin2)}
end.
deserialise_object(Binary, true, true) -> deserialise_object(Binary, true, true) ->
zlib:uncompress(Binary); zlib:uncompress(Binary);

View file

@ -246,7 +246,7 @@ handle_call({put, Key, Object, KeyChanges}, _From, State) ->
{reply, {ok, UpdState#state.journal_sqn, ObjSize}, UpdState} {reply, {ok, UpdState#state.journal_sqn, ObjSize}, UpdState}
end; end;
handle_call({fetch, Key, SQN}, _From, State) -> handle_call({fetch, Key, SQN}, _From, State) ->
case get_object(Key, SQN, State#state.manifest) of case get_object(Key, SQN, State#state.manifest, true) of
{{SQN, Key}, {Value, _IndexSpecs}} -> {{SQN, Key}, {Value, _IndexSpecs}} ->
{reply, {ok, Value}, State}; {reply, {ok, Value}, State};
Other -> Other ->
@ -452,13 +452,16 @@ put_object(LedgerKey, Object, KeyChanges, State) ->
get_object(LedgerKey, SQN, Manifest) -> get_object(LedgerKey, SQN, Manifest) ->
get_object(LedgerKey, SQN, Manifest, false).
get_object(LedgerKey, SQN, Manifest, ToIgnoreKeyChanges) ->
JournalP = leveled_imanifest:find_entry(SQN, Manifest), JournalP = leveled_imanifest:find_entry(SQN, Manifest),
{InkerKey, _V, true} = leveled_codec:to_inkerkv(LedgerKey, {InkerKey, _V, true} = leveled_codec:to_inkerkv(LedgerKey,
SQN, SQN,
to_fetch, to_fetch,
null), null),
Obj = leveled_cdb:cdb_get(JournalP, InkerKey), Obj = leveled_cdb:cdb_get(JournalP, InkerKey),
leveled_codec:from_inkerkv(Obj). leveled_codec:from_inkerkv(Obj, ToIgnoreKeyChanges).
key_check(LedgerKey, SQN, Manifest) -> key_check(LedgerKey, SQN, Manifest) ->
JournalP = leveled_imanifest:find_entry(SQN, Manifest), JournalP = leveled_imanifest:find_entry(SQN, Manifest),