From 6143fcb66404610047f3e06a3f2b99632a62ecce Mon Sep 17 00:00:00 2001 From: martinsumner Date: Wed, 29 Mar 2017 15:37:04 +0100 Subject: [PATCH] Remove binary_to_term when fetching don't need to binary_to_term key changes --- src/leveled_codec.erl | 50 +++++++++++++++++++++++++++++-------------- src/leveled_inker.erl | 7 ++++-- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/leveled_codec.erl b/src/leveled_codec.erl index 484d927..f3d8b08 100644 --- a/src/leveled_codec.erl +++ b/src/leveled_codec.erl @@ -48,6 +48,7 @@ from_ledgerkey/1, to_inkerkv/4, from_inkerkv/1, + from_inkerkv/2, from_journalkey/1, compact_inkerkvc/2, split_inkvalue/1, @@ -191,17 +192,23 @@ to_inkerkv(LedgerKey, SQN, Object, KeyChanges) -> %% Used when fetching objects, so only handles standard, hashable entries from_inkerkv(Object) -> + from_inkerkv(Object, false). + +from_inkerkv(Object, ToIgnoreKeyChanges) -> case Object of {{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, PK}, Term}; _ -> Object 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]), + create_value_for_journal({Object, KeyChangeBin}, Compress); +create_value_for_journal({Object, KeyChangeBin}, Compress) -> KeyChangeBinLen = byte_size(KeyChangeBin), ObjectBin = serialise_object(Object, Compress), TypeCode = encode_valuetype(is_binary(Object), Compress), @@ -213,14 +220,19 @@ create_value_for_journal({Object, KeyChanges}, Compress) -> maybe_compress({null, KeyChanges}) -> create_value_for_journal({null, KeyChanges}, false); maybe_compress(JournalBin) -> - Length0 = byte_size(JournalBin) - 1, - <> = JournalBin, + Length0 = byte_size(JournalBin) - 5, + <> = JournalBin, {IsBinary, IsCompressed} = decode_valuetype(Type), case IsCompressed of true -> JournalBin; false -> - V0 = revert_value_from_journal(JBin0, Length0, IsBinary, false), + Length1 = Length0 - KeyChangeLength, + <> = JBin0, + V0 = {deserialise_object(OBin2, IsBinary, IsCompressed), + binary_to_term(KCBin2)}, create_value_for_journal(V0, true) end. @@ -234,18 +246,24 @@ serialise_object(Object, true) -> term_to_binary(Object, [compressed]). revert_value_from_journal(JournalBin) -> - Length0 = byte_size(JournalBin) - 1, - <> = JournalBin, + revert_value_from_journal(JournalBin, false). + +revert_value_from_journal(JournalBin, ToIgnoreKeyChanges) -> + Length0 = byte_size(JournalBin) - 5, + <> = JournalBin, {IsBinary, IsCompressed} = decode_valuetype(Type), - revert_value_from_journal(JBin0, Length0, IsBinary, IsCompressed). - -revert_value_from_journal(ValueBin, ValueLen, IsBinary, IsCompressed) -> - Length1 = ValueLen - 4, - <> = ValueBin, - Length2 = Length1 - KeyChangeLength, - <> = JBin1, - {deserialise_object(OBin2, IsBinary, IsCompressed), - binary_to_term(KCBin2)}. + Length1 = Length0 - KeyChangeLength, + case ToIgnoreKeyChanges of + true -> + <> = JBin0, + {deserialise_object(OBin2, IsBinary, IsCompressed), []}; + false -> + <> = JBin0, + {deserialise_object(OBin2, IsBinary, IsCompressed), + binary_to_term(KCBin2)} + end. deserialise_object(Binary, true, true) -> zlib:uncompress(Binary); diff --git a/src/leveled_inker.erl b/src/leveled_inker.erl index 01b755d..acfed4d 100644 --- a/src/leveled_inker.erl +++ b/src/leveled_inker.erl @@ -246,7 +246,7 @@ handle_call({put, Key, Object, KeyChanges}, _From, State) -> {reply, {ok, UpdState#state.journal_sqn, ObjSize}, UpdState} end; 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}} -> {reply, {ok, Value}, State}; Other -> @@ -452,13 +452,16 @@ put_object(LedgerKey, Object, KeyChanges, State) -> get_object(LedgerKey, SQN, Manifest) -> + get_object(LedgerKey, SQN, Manifest, false). + +get_object(LedgerKey, SQN, Manifest, ToIgnoreKeyChanges) -> JournalP = leveled_imanifest:find_entry(SQN, Manifest), {InkerKey, _V, true} = leveled_codec:to_inkerkv(LedgerKey, SQN, to_fetch, null), Obj = leveled_cdb:cdb_get(JournalP, InkerKey), - leveled_codec:from_inkerkv(Obj). + leveled_codec:from_inkerkv(Obj, ToIgnoreKeyChanges). key_check(LedgerKey, SQN, Manifest) -> JournalP = leveled_imanifest:find_entry(SQN, Manifest),