diff options
author | Brad Anderson <brad@cloudant.com> | 2010-03-31 12:40:50 -0400 |
---|---|---|
committer | Brad Anderson <brad@cloudant.com> | 2010-05-09 22:56:23 -0400 |
commit | 99a4d65b3b4158e26bdf97c644b8a60f6146c92d (patch) | |
tree | e77681ed6a3dfd694c688fa43dfbb3644d6cf90c | |
parent | 23c494acf0967770a08ba9d72085887dedbc8ccd (diff) |
first stab at mem3's join new node functionality
-rw-r--r-- | src/mem3.erl | 26 | ||||
-rw-r--r-- | test/mem3_test.erl | 19 |
2 files changed, 32 insertions, 13 deletions
diff --git a/src/mem3.erl b/src/mem3.erl index b64915d6..44ab4d4c 100644 --- a/src/mem3.erl +++ b/src/mem3.erl @@ -106,14 +106,14 @@ nodes_for_part(Part) -> nodes_for_part(Part, NodePartList) -> - Filtered = lists:filter(fun({_N, P, _T}) -> P =:= Part end, NodePartList), - {Nodes, _Parts, _Types} = lists:unzip3(Filtered), + Filtered = lists:filter(fun({_N, P}) -> P =:= Part end, NodePartList), + {Nodes, _Parts} = lists:unzip(Filtered), lists:usort(Nodes). %% @doc return the partitions that reside on a given node parts_for_node(Node) -> - lists:sort(lists:foldl(fun({N,P,_Type}, AccIn) -> + lists:sort(lists:foldl(fun({N,P}, AccIn) -> case N of Node -> [P | AccIn]; _ -> AccIn @@ -245,15 +245,14 @@ handle_init(_OldState) -> %% handle join activities, return NewState -handle_join(first, ExtNodes, #mem{node=Node, clock=Clock} = State, Config) -> - {Pmap, Fullmap} = create_maps(Config, ExtNodes), +handle_join(JoinType, ExtNodes, #mem{node=Node, clock=Clock} = State, Config) + when JoinType == first orelse JoinType == new -> + {Pmap, Fullmap} = create_maps(Config, JoinType, ExtNodes), update_cache(Pmap, Fullmap), NewClock = vector_clock:increment(Node, Clock), + % TODO: gossip State#mem{nodes=ExtNodes, clock=NewClock}; -handle_join(new, _ExtNodes, _State, _Config) -> - ok; - handle_join(replace, [_OldNode | _], _State, _Config) -> ok; @@ -300,14 +299,17 @@ read_latest_state_file(_, Config) -> %% @doc given Config and a list of Nodes, construct a {Pmap,Fullmap} %% This is basically replaying all the mem events that have happened. -create_maps(#config{q=Q} = Config, Nodes) -> +create_maps(#config{q=Q} = Config, JoinType, Nodes) -> [{_,FirstNode,_}|_] = Nodes, Fun = fun({_Pos, Node, Options}, Map) -> Hints = proplists:get_value(hints, Options), {ok, NewMap} = partitions:join(Node, Map, Hints), NewMap end, - Acc0 = partitions:create_partitions(Q, FirstNode), + Acc0 = case JoinType of + first -> partitions:create_partitions(Q, FirstNode); + new -> mochiglobal:get(pmap) + end, Pmap = lists:foldl(Fun, Acc0, lists:keysort(1, Nodes)), {Pmap, make_fullmap(Pmap, Config)}. @@ -319,8 +321,8 @@ make_fullmap(PMap, Config) -> NodeParts = lists:flatmap( fun({Node,Part}) -> Partners = replication:partners(Node, lists:usort(Nodes), Config), - PartnerList = [{Partner, Part, partner} || Partner <- Partners], - [{Node, Part, primary} | PartnerList] + PartnerList = [{Partner, Part} || Partner <- Partners], + [{Node, Part} | PartnerList] end, PMap), NodeParts. diff --git a/test/mem3_test.erl b/test/mem3_test.erl index d5420ba3..139187df 100644 --- a/test/mem3_test.erl +++ b/test/mem3_test.erl @@ -6,6 +6,12 @@ -define(HINT_C1, 365375409332725729550921208179070754913983135744). -define(HINT_C2, 1096126227998177188652763624537212264741949407232). +-define(PARTS_FOR_D1, [365375409332725729550921208179070754913983135744, + 548063113999088594326381812268606132370974703616, + 730750818665451459101842416358141509827966271488, + 913438523331814323877303020447676887284957839360, + 1096126227998177188652763624537212264741949407232, + 1278813932664540053428224228626747642198940975104]). %% TEST SETUP @@ -21,7 +27,8 @@ all_tests_test_() -> fun init/1, fun clock/1, fun join_first/1, - fun join_first_with_hints/1 + fun join_first_with_hints/1, + fun join_new_node/1 ]} end} ] @@ -76,3 +83,13 @@ join_first_with_hints(_Pid) -> ?assertEqual([c,d,e], mem3:nodes_for_part(?HINT_C1)), ?assertEqual([c,d,e], mem3:nodes_for_part(?HINT_C2)), ok. + + +join_new_node(_Pid) -> + mem3:join(first, [{1, a, []}, {2, b, []}, {3, c, []}]), + ?assertEqual(24, length(mem3:fullmap())), + ?assertEqual([], mem3:parts_for_node(d)), + mem3:join(new, [{4, d, []}]), + ?assertEqual(?PARTS_FOR_D1, mem3:parts_for_node(d)), + ?debugFmt("~nFullmap: ~p~n", [mem3:fullmap()]), + ok. |