parent
eedd09a23d
commit
2e0b20a071
3 changed files with 32 additions and 63 deletions
|
@ -136,7 +136,6 @@
|
|||
|
||||
-export_type([tag/0,
|
||||
key/0,
|
||||
sqn/0,
|
||||
object_spec/0,
|
||||
segment_hash/0,
|
||||
ledger_status/0,
|
||||
|
|
|
@ -749,9 +749,7 @@ handle_call({fetch, Key, Hash, UseL0Index}, _From, State) ->
|
|||
{reply, R, State#state{timings=UpdTimings0, timings_countdown=CountDown}};
|
||||
handle_call({check_sqn, Key, Hash, SQN}, _From, State) ->
|
||||
{reply,
|
||||
compare_to_sqn(
|
||||
fetch_sqn(
|
||||
Key,
|
||||
compare_to_sqn(plain_fetch_mem(Key,
|
||||
Hash,
|
||||
State#state.manifest,
|
||||
State#state.levelzero_cache,
|
||||
|
@ -1458,18 +1456,14 @@ timed_fetch_mem(Key, Hash, Manifest, L0Cache, L0Index, Timings) ->
|
|||
{R, UpdTimings}.
|
||||
|
||||
|
||||
-spec fetch_sqn(
|
||||
leveled_codec:ledger_key(),
|
||||
leveled_codec:segment_hash(),
|
||||
leveled_pmanifest:manifest(),
|
||||
list(),
|
||||
leveled_pmem:index_array()) ->
|
||||
not_present|leveled_codec:ledger_kv()|leveled_codec:ledger_sqn().
|
||||
-spec plain_fetch_mem(tuple(), {integer(), integer()},
|
||||
leveled_pmanifest:manifest(), list(),
|
||||
leveled_pmem:index_array()) -> not_present|tuple().
|
||||
%% @doc
|
||||
%% Fetch the result from the penciller, starting by looking in the memory,
|
||||
%% and if it is not found looking down level by level through the LSM tree.
|
||||
fetch_sqn(Key, Hash, Manifest, L0Cache, L0Index) ->
|
||||
R = fetch_mem(Key, Hash, Manifest, L0Cache, L0Index, fun sst_getsqn/4),
|
||||
plain_fetch_mem(Key, Hash, Manifest, L0Cache, L0Index) ->
|
||||
R = fetch_mem(Key, Hash, Manifest, L0Cache, L0Index, fun sst_get/4),
|
||||
element(1, R).
|
||||
|
||||
fetch_mem(Key, Hash, Manifest, L0Cache, L0Index, FetchFun) ->
|
||||
|
@ -1522,8 +1516,8 @@ timed_sst_get(PID, Key, Hash, Level) ->
|
|||
T0 = timer:now_diff(os:timestamp(), SW),
|
||||
log_slowfetch(T0, R, PID, Level, ?SLOW_FETCH).
|
||||
|
||||
sst_getsqn(PID, Key, Hash, _Level) ->
|
||||
leveled_sst:sst_getsqn(PID, Key, Hash).
|
||||
sst_get(PID, Key, Hash, Level) ->
|
||||
leveled_sst:sst_get(PID, Key, Hash).
|
||||
|
||||
log_slowfetch(T0, R, PID, Level, FetchTolerance) ->
|
||||
case {T0, R} of
|
||||
|
@ -1538,26 +1532,29 @@ log_slowfetch(T0, R, PID, Level, FetchTolerance) ->
|
|||
end.
|
||||
|
||||
|
||||
-spec compare_to_sqn(
|
||||
leveled_codec:ledger_kv()|leveled_codec:sqn()|not_present,
|
||||
integer()) -> sqn_check().
|
||||
-spec compare_to_sqn(tuple()|not_present, integer()) -> sqn_check().
|
||||
%% @doc
|
||||
%% Check to see if the SQN in the penciller is after the SQN expected for an
|
||||
%% object (used to allow the journal to check compaction status from a cache
|
||||
%% of the ledger - objects with a more recent sequence number can be compacted).
|
||||
compare_to_sqn(not_present, _SQN) ->
|
||||
compare_to_sqn(Obj, SQN) ->
|
||||
case Obj of
|
||||
not_present ->
|
||||
missing;
|
||||
compare_to_sqn(ObjSQN, SQN) when is_integer(ObjSQN), ObjSQN > SQN ->
|
||||
Obj ->
|
||||
SQNToCompare = leveled_codec:strip_to_seqonly(Obj),
|
||||
if
|
||||
SQNToCompare > SQN ->
|
||||
replaced;
|
||||
compare_to_sqn(ObjSQN, _SQN) when is_integer(ObjSQN) ->
|
||||
true ->
|
||||
% Normally we would expect the SQN to be equal here, but
|
||||
% this also allows for the Journal to have a more advanced
|
||||
% value. We return true here as we wouldn't want to
|
||||
% compact thta more advanced value, but this may cause
|
||||
% confusion in snapshots.
|
||||
current;
|
||||
compare_to_sqn(Obj, SQN) ->
|
||||
compare_to_sqn(leveled_codec:strip_to_seqonly(Obj), SQN).
|
||||
current
|
||||
end
|
||||
end.
|
||||
|
||||
|
||||
%%%============================================================================
|
||||
|
|
|
@ -96,7 +96,6 @@
|
|||
-define(TOMB_COUNT, true).
|
||||
-define(USE_SET_FOR_SPEED, 64).
|
||||
-define(STARTUP_TIMEOUT, 10000).
|
||||
-define(HIBERNATE_TIMEOUT, 60000).
|
||||
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
|
@ -120,7 +119,6 @@
|
|||
sst_open/4,
|
||||
sst_get/2,
|
||||
sst_get/3,
|
||||
sst_getsqn/3,
|
||||
sst_expandpointer/5,
|
||||
sst_getmaxsequencenumber/1,
|
||||
sst_setfordelete/2,
|
||||
|
@ -436,15 +434,6 @@ sst_get(Pid, LedgerKey) ->
|
|||
sst_get(Pid, LedgerKey, Hash) ->
|
||||
gen_fsm:sync_send_event(Pid, {get_kv, LedgerKey, Hash}, infinity).
|
||||
|
||||
-spec sst_getsqn(pid(),
|
||||
leveled_codec:ledger_key(),
|
||||
leveled_codec:segment_hash()) -> leveled_codec:sqn()|not_present.
|
||||
%% @doc
|
||||
%% Return a SQN for the key or not_present if the key is not in
|
||||
%% the store (with the magic hash precalculated).
|
||||
sst_getsqn(Pid, LedgerKey, Hash) ->
|
||||
gen_fsm:sync_send_event(Pid, {get_sqn, LedgerKey, Hash}, infinity).
|
||||
|
||||
-spec sst_getmaxsequencenumber(pid()) -> integer().
|
||||
%% @doc
|
||||
%% Get the maximume sequence number for this SST file
|
||||
|
@ -706,11 +695,6 @@ starting({sst_returnslot, FetchedSlot, FetchFun, SlotCount}, State) ->
|
|||
State#state{new_slots = FetchedSlots}}
|
||||
end.
|
||||
|
||||
reader({get_sqn, LedgerKey, Hash}, _From, State) ->
|
||||
% Get a KV value and potentially take sample timings
|
||||
{Result, UpdState, _UpdTimings} =
|
||||
fetch(LedgerKey, Hash, State, no_timing),
|
||||
{reply, sqn_only(Result), reader, UpdState, ?HIBERNATE_TIMEOUT};
|
||||
reader({get_kv, LedgerKey, Hash}, _From, State) ->
|
||||
% Get a KV value and potentially take sample timings
|
||||
{Result, UpdState, UpdTimings} =
|
||||
|
@ -816,11 +800,6 @@ reader({switch_levels, NewLevel}, State) ->
|
|||
{next_state, reader, State#state{level = NewLevel}, hibernate}.
|
||||
|
||||
|
||||
delete_pending({get_sqn, LedgerKey, Hash}, _From, State) ->
|
||||
% Get a KV value and potentially take sample timings
|
||||
{Result, UpdState, _UpdTimings} =
|
||||
fetch(LedgerKey, Hash, State, no_timing),
|
||||
{reply, sqn_only(Result), delete_pending, UpdState, ?DELETE_TIMEOUT};
|
||||
delete_pending({get_kv, LedgerKey, Hash}, _From, State) ->
|
||||
{Result, UpdState, _Ts} = fetch(LedgerKey, Hash, State, no_timing),
|
||||
{reply, Result, delete_pending, UpdState, ?DELETE_TIMEOUT};
|
||||
|
@ -1115,12 +1094,6 @@ member_check(Hash, {sets, HashSet}) ->
|
|||
member_check(_Miss, _Checker) ->
|
||||
false.
|
||||
|
||||
-spec sqn_only(leveled_codec:ledger_kv()|not_present)
|
||||
-> leveled_codec:sqn()|not_present.
|
||||
sqn_only(not_present) ->
|
||||
not_present;
|
||||
sqn_only(KV) ->
|
||||
leveled_codec:strip_to_seqonly(KV).
|
||||
|
||||
extract_hash({SegHash, _ExtraHash}) when is_integer(SegHash) ->
|
||||
tune_hash(SegHash);
|
||||
|
@ -1140,7 +1113,7 @@ fetch_from_cache(CacheHash, Cache) ->
|
|||
|
||||
-spec add_to_cache(
|
||||
non_neg_integer(),
|
||||
leveled_codec:ledger_kv(),
|
||||
leveled_codec:ledger_kv()
|
||||
fetch_cache()) -> fetch_cache().
|
||||
add_to_cache(_CacheHash, _KV, no_cache) ->
|
||||
no_cache;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue