summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nordberg <linus@nordu.net>2017-02-08 02:08:40 +0100
committerLinus Nordberg <linus@nordu.net>2017-02-08 02:08:40 +0100
commitc5506779dac2d13ca407ae26f97ba6e6e85a6ad7 (patch)
tree28858be0ff31339249766804baed9a98c87714d7
parentce28e5b6ce3adf400b17f34e006426b411332af4 (diff)
merge_backup: Do not read logorder past what fetched indicates.
-rw-r--r--merge/src/merge_backup.erl16
-rw-r--r--merge/src/merge_sth.erl21
-rw-r--r--merge/src/merge_util.erl32
3 files changed, 29 insertions, 40 deletions
diff --git a/merge/src/merge_backup.erl b/merge/src/merge_backup.erl
index 5f4f3d5..768bd32 100644
--- a/merge/src/merge_backup.erl
+++ b/merge/src/merge_backup.erl
@@ -28,7 +28,7 @@ handle_cast(_Request, State) ->
{noreply, State}.
handle_info({timeout, _Timer, backup}, State) ->
- backup(merge_util:readfile(fetched_path), State).
+ backup(merge_util:nfetched(), State).
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
@@ -40,19 +40,9 @@ terminate(Reason, #state{timer = Timer}) ->
%%%%%%%%%%%%%%%%%%%%
-backup(noentry, State) ->
+backup(Size, State) when Size < 0 ->
{noreply, State#state{timer = erlang:start_timer(1000, self(), backup)}};
-backup({struct, Fetched}, State) ->
- Index = proplists:get_value(<<"index">>, Fetched),
- Hash = proplists:get_value(<<"hash">>, Fetched),
- backup(Index, Hash, State).
-
-backup(-1, _, State) ->
- {noreply, State#state{timer = erlang:start_timer(1000, self(), backup)}};
-backup(Index, Hash,
- #state{node_name = NodeName, node_address = NodeAddress} = State) ->
- ok = merge_util:verify_logorder_and_fetched_consistency(Index, Hash),
- Size = index:indexsize(logorder),
+backup(Size, #state{node_name = NodeName, node_address = NodeAddress} = State) ->
lager:debug("~p: logorder size ~B", [NodeName, Size]),
ht:load_tree(Size - 1), % TODO: Make sure this is OK to do from multiple processes and that it's not "moving backwards".
try
diff --git a/merge/src/merge_sth.erl b/merge/src/merge_sth.erl
index a34179d..3dffaca 100644
--- a/merge/src/merge_sth.erl
+++ b/merge/src/merge_sth.erl
@@ -58,7 +58,7 @@ make_sth(CurSize, State) ->
%% entry with the size found in the 'fetched' file, sort the list
%% (highest tree size first) and index it with backup quorum to
%% get our new tree size.
- Sizes = [fetched() | verified_sizes(MergeSecondaryNames)],
+ Sizes = [merge_util:nfetched() | verified_sizes(MergeSecondaryNames)],
BackupQuorumSize = plopconfig:get_env(backup_quorum, 0),
true = BackupQuorumSize =< length(MergeSecondaryNames),
NewSize = lists:nth(BackupQuorumSize + 1, Sizes),
@@ -143,25 +143,6 @@ validate_tree_head(Treesize, Roothash) ->
root_mismatch
end.
-fetched() ->
- case read_fetched() of
- {-1, _} ->
- 0;
- {Index, Hash} ->
- ok = merge_util:verify_logorder_and_fetched_consistency(Index, Hash),
- Index + 1
- end.
-
-read_fetched() -> % FIXME: merge with backup implementation
- case merge_util:readfile(fetched_path) of
- noentry ->
- {-1, <<>>};
- {struct, PropList} ->
- {proplists:get_value(<<"index">>, PropList),
- proplists:get_value(<<"hash">>, PropList)}
- end.
-
-
read_sth_treesize() ->
case plop:sth() of
noentry ->
diff --git a/merge/src/merge_util.erl b/merge/src/merge_util.erl
index 4a4340d..1df1409 100644
--- a/merge/src/merge_util.erl
+++ b/merge/src/merge_util.erl
@@ -4,7 +4,7 @@
-module(merge_util).
-export([sendlog/4, sendentries/3]).
-export([request/2, request/4]).
--export([readfile/1, verify_logorder_and_fetched_consistency/2]).
+-export([readfile/1, nfetched/0]).
request(DebugTag, URL) ->
request(DebugTag, URL, [], <<>>).
@@ -87,13 +87,31 @@ readfile(FileInConfig) ->
noentry
end.
-verify_logorder_and_fetched_consistency(Index, Hash) ->
- HashString = binary_to_list(Hash),
+nfetched() ->
+ {Index, Hash} = read_fetched(),
+ case Index >= 0 of
+ true ->
+ ok = verify_logorder_entry(Index, binary_to_list(Hash));
+ false ->
+ ok
+ end,
+ Index + 1.
+
+read_fetched() ->
+ case merge_util:readfile(fetched_path) of
+ noentry ->
+ {-1, <<>>};
+ {struct, PropList} ->
+ {proplists:get_value(<<"index">>, PropList),
+ proplists:get_value(<<"hash">>, PropList)}
+ end.
+
+verify_logorder_entry(Index, HashAsString) ->
case hex:bin_to_hexstr(index:get(logorder, Index)) of
- HashString ->
+ HashAsString ->
ok;
Mismatch ->
- lager:error("fetched file hash=~p doesn't match logorder[~B]=~p",
- [HashString, Index, Mismatch]),
- fetched_mismatch
+ lager:error("hash in fetched file ~p doesn't match logorder[~B]=~p",
+ [HashAsString, Index, Mismatch]),
+ mismatch
end.