diff options
| -rw-r--r-- | merge/src/merge_backup.erl | 16 | ||||
| -rw-r--r-- | merge/src/merge_sth.erl | 21 | ||||
| -rw-r--r-- | merge/src/merge_util.erl | 32 | 
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. | 
