Spec and comment Inker
This commit is contained in:
parent
0185b3aa7d
commit
a9db4a0082
1 changed files with 46 additions and 0 deletions
|
@ -145,6 +145,7 @@
|
||||||
|
|
||||||
|
|
||||||
-type inker_options() :: #inker_options{}.
|
-type inker_options() :: #inker_options{}.
|
||||||
|
-type ink_state() :: #state{}.
|
||||||
|
|
||||||
|
|
||||||
%%%============================================================================
|
%%%============================================================================
|
||||||
|
@ -579,6 +580,9 @@ code_change(_OldVsn, State, _Extra) ->
|
||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%============================================================================
|
%%%============================================================================
|
||||||
|
|
||||||
|
-spec start_from_file(inker_options()) -> {ok, ink_state()}.
|
||||||
|
%% @doc
|
||||||
|
%% Start an Inker from the state on disk (i.e. not a snapshot).
|
||||||
start_from_file(InkOpts) ->
|
start_from_file(InkOpts) ->
|
||||||
% Setting the correct CDB options is important when starting the inker, in
|
% Setting the correct CDB options is important when starting the inker, in
|
||||||
% particular for waste retention which is determined by the CDB options
|
% particular for waste retention which is determined by the CDB options
|
||||||
|
@ -646,6 +650,9 @@ shutdown_manifest(Manifest) ->
|
||||||
ManAsList = leveled_imanifest:to_list(Manifest),
|
ManAsList = leveled_imanifest:to_list(Manifest),
|
||||||
close_allmanifest(ManAsList).
|
close_allmanifest(ManAsList).
|
||||||
|
|
||||||
|
-spec get_cdbopts(inker_options()) -> #cdb_options{}.
|
||||||
|
%% @doc
|
||||||
|
%% Extract the options for the indibvidal Journal files from the Inker options
|
||||||
get_cdbopts(InkOpts)->
|
get_cdbopts(InkOpts)->
|
||||||
CDBopts = InkOpts#inker_options.cdb_options,
|
CDBopts = InkOpts#inker_options.cdb_options,
|
||||||
WasteFP =
|
WasteFP =
|
||||||
|
@ -664,6 +671,14 @@ get_cdbopts(InkOpts)->
|
||||||
CDBopts#cdb_options{waste_path = WasteFP}.
|
CDBopts#cdb_options{waste_path = WasteFP}.
|
||||||
|
|
||||||
|
|
||||||
|
-spec put_object(tuple(), any(), list(), ink_state())
|
||||||
|
-> {ok|rolling, ink_state(), integer()}.
|
||||||
|
%% @doc
|
||||||
|
%% Add the object to the current journal if it fits. If it doesn't fit, a new
|
||||||
|
%% journal must be started, and the old journal is set to "roll" into a read
|
||||||
|
%% only Journal.
|
||||||
|
%% The reply contains the byte_size of the object, using the size calculated
|
||||||
|
%% to store the object.
|
||||||
put_object(LedgerKey, Object, KeyChanges, State) ->
|
put_object(LedgerKey, Object, KeyChanges, State) ->
|
||||||
NewSQN = State#state.journal_sqn + 1,
|
NewSQN = State#state.journal_sqn + 1,
|
||||||
ActiveJournal = State#state.active_journaldb,
|
ActiveJournal = State#state.active_journaldb,
|
||||||
|
@ -710,6 +725,12 @@ put_object(LedgerKey, Object, KeyChanges, State) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
-spec get_object(tuple(), integer(), leveled_imanifest:manifest()) -> any().
|
||||||
|
%% @doc
|
||||||
|
%% Find the SQN in the manifest and then fetch the object from the Journal,
|
||||||
|
%% in the manifest. If the fetch is in response to a user GET request then
|
||||||
|
%% the KeyChanges are irrelevant, so no need to process them. In this case
|
||||||
|
%% the KeyChanges are processed (as ToIgnoreKeyChanges will be set to false).
|
||||||
get_object(LedgerKey, SQN, Manifest) ->
|
get_object(LedgerKey, SQN, Manifest) ->
|
||||||
get_object(LedgerKey, SQN, Manifest, false).
|
get_object(LedgerKey, SQN, Manifest, false).
|
||||||
|
|
||||||
|
@ -720,12 +741,28 @@ get_object(LedgerKey, SQN, Manifest, ToIgnoreKeyChanges) ->
|
||||||
Obj = leveled_cdb:cdb_get(JournalP, InkerKey),
|
Obj = leveled_cdb:cdb_get(JournalP, InkerKey),
|
||||||
leveled_codec:from_inkerkv(Obj, ToIgnoreKeyChanges).
|
leveled_codec:from_inkerkv(Obj, ToIgnoreKeyChanges).
|
||||||
|
|
||||||
|
|
||||||
|
-spec key_check(tuple(), integer(), leveled_imanifest:manifest())
|
||||||
|
-> missing|probably.
|
||||||
|
%% @doc
|
||||||
|
%% Checks for the presence of the key at that SQN withing the journal,
|
||||||
|
%% avoiding the cost of actually reading the object from disk.
|
||||||
|
%% a KeyCheck is not absolute proof of the existence of the object - there
|
||||||
|
%% could be a hash collision, or the on-disk object could be corrupted. So
|
||||||
|
%% the positive answer is 'probably' not 'true'
|
||||||
key_check(LedgerKey, SQN, Manifest) ->
|
key_check(LedgerKey, SQN, Manifest) ->
|
||||||
JournalP = leveled_imanifest:find_entry(SQN, Manifest),
|
JournalP = leveled_imanifest:find_entry(SQN, Manifest),
|
||||||
{InkerKey, _V, true} =
|
{InkerKey, _V, true} =
|
||||||
leveled_codec:to_inkerkv(LedgerKey, SQN, to_fetch),
|
leveled_codec:to_inkerkv(LedgerKey, SQN, to_fetch),
|
||||||
leveled_cdb:cdb_keycheck(JournalP, InkerKey).
|
leveled_cdb:cdb_keycheck(JournalP, InkerKey).
|
||||||
|
|
||||||
|
|
||||||
|
-spec build_manifest(list(), list(), #cdb_options{}) ->
|
||||||
|
{leveled_imanifest:manifest(), integer(), integer(), pid()}.
|
||||||
|
%% @doc
|
||||||
|
%% Selectes the correct manifets to open, and the starts a process for each
|
||||||
|
%% file in the manifest, storing the PID for that process within the manifest.
|
||||||
|
%% Opens an active journal if one is not present.
|
||||||
build_manifest(ManifestFilenames,
|
build_manifest(ManifestFilenames,
|
||||||
RootPath,
|
RootPath,
|
||||||
CDBopts) ->
|
CDBopts) ->
|
||||||
|
@ -779,6 +816,10 @@ build_manifest(ManifestFilenames,
|
||||||
{OpenManifest, UpdManifestSQN, JournalSQN, ActiveJournal}.
|
{OpenManifest, UpdManifestSQN, JournalSQN, ActiveJournal}.
|
||||||
|
|
||||||
|
|
||||||
|
-spec close_allmanifest(list()) -> ok.
|
||||||
|
%% @doc
|
||||||
|
%% Close every file in the manifest. Will cause deletion of any delete_pending
|
||||||
|
%% files.
|
||||||
close_allmanifest([]) ->
|
close_allmanifest([]) ->
|
||||||
ok;
|
ok;
|
||||||
close_allmanifest([H|ManifestT]) ->
|
close_allmanifest([H|ManifestT]) ->
|
||||||
|
@ -787,6 +828,11 @@ close_allmanifest([H|ManifestT]) ->
|
||||||
close_allmanifest(ManifestT).
|
close_allmanifest(ManifestT).
|
||||||
|
|
||||||
|
|
||||||
|
-spec open_all_manifest(leveled_imanifest:manifest(), list(), #cdb_options{})
|
||||||
|
-> leveled_imanifest:manifest().
|
||||||
|
%% @doc
|
||||||
|
%% Open all the files in the manifets, and updating the manifest with the PIDs
|
||||||
|
%% of the opened files
|
||||||
open_all_manifest([], RootPath, CDBOpts) ->
|
open_all_manifest([], RootPath, CDBOpts) ->
|
||||||
leveled_log:log("I0011", []),
|
leveled_log:log("I0011", []),
|
||||||
leveled_imanifest:add_entry([],
|
leveled_imanifest:add_entry([],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue