summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Anderson <brad@cloudant.com>2010-04-28 22:24:34 -0400
committerBrad Anderson <brad@cloudant.com>2010-05-09 22:56:25 -0400
commitccf67d04af1cb14d91ba5a5ac1c4bc85317ffe01 (patch)
treee548eaadc1f7c5d05afe2e15331f9e6e5d264d89 /src
parent7233933976709eca1eddf5471790ec786cb33bc2 (diff)
switch join types to init,join,replace,leave and add first json-rpc handler for membership (init) - BugzID 9726
Diffstat (limited to 'src')
-rw-r--r--src/mem3.erl42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/mem3.erl b/src/mem3.erl
index b3416219..b2aa4394 100644
--- a/src/mem3.erl
+++ b/src/mem3.erl
@@ -41,7 +41,7 @@
-define(STATE_FILE_PREFIX, "membership").
%% types - stick somewhere in includes?
--type join_type() :: first | new | replace.
+-type join_type() :: init | join | replace | leave.
-type join_order() :: non_neg_integer().
-type options() :: list().
-type mem_node() :: {join_order(), node(), options()}.
@@ -173,15 +173,17 @@ init(Args) ->
%% new node(s) joining to this node
handle_call({join, JoinType, ExtNodes, PingNode}, _From, State) ->
- % NewState = handle_join(JoinType, ExtNodes, PingNode, State),
- % {reply, ok, NewState};
- try
- NewState = handle_join(JoinType, ExtNodes, PingNode, State),
- {reply, ok, NewState}
- catch _:Error ->
- showroom_log:message(error, "~p", [Error]),
- {reply, Error, State}
- end;
+ % {ok, NewState} = handle_join(JoinType, ExtNodes, PingNode, State),
+ % {reply, ok, NewState};
+ try
+ case handle_join(JoinType, ExtNodes, PingNode, State) of
+ {ok, NewState} -> {reply, ok, NewState};
+ Other -> {reply, Other, State}
+ end
+ catch _:Error ->
+ showroom_log:message(error, "~p", [Error]),
+ {reply, Error, State}
+ end;
%% clock
handle_call(clock, _From, #mem{clock=Clock} = State) ->
@@ -306,13 +308,13 @@ handle_init(_Test, #mem{nodes=Nodes, args=Args} = OldState) ->
end.
-%% handle join activities, return NewState
-handle_join(first, ExtNodes, nil, State) ->
+%% handle join activities, return {ok,NewState}
+handle_join(init, ExtNodes, nil, State) ->
{_,Nodes,_} = lists:unzip3(ExtNodes),
ping_all_yall(Nodes),
int_join(ExtNodes, State);
-handle_join(new, ExtNodes, PingNode, #mem{args=Args} = State) ->
+handle_join(join, ExtNodes, PingNode, #mem{args=Args} = State) ->
NewState = case get_test(Args) of
undefined -> get_pingnode_state(PingNode);
_ -> State % testing, so meh
@@ -324,10 +326,14 @@ handle_join(replace, [_OldNode | _], _PingNode, _State) ->
% TODO implement me
ok;
+handle_join(leave, [_OldNode | _], _PingNode, _State) ->
+ % TODO implement me
+ ok;
+
handle_join(JoinType, _, PingNode, _) ->
showroom_log:message(info, "membership: unknown join type: ~p "
"for ping node: ~p", [JoinType, PingNode]),
- {error, {unknown_join_type, JoinType}}.
+ {error, unknown_join_type}.
int_join(ExtNodes, #mem{nodes=Nodes, clock=Clock} = State) ->
@@ -339,7 +345,7 @@ int_join(ExtNodes, #mem{nodes=Nodes, clock=Clock} = State) ->
NewClock = vector_clock:increment(node(), Clock),
NewState = State#mem{nodes=NewNodes1, clock=NewClock},
install_new_state(NewState),
- NewState.
+ {ok, NewState}.
get_pingnode_state(PingNode) ->
@@ -507,9 +513,11 @@ check_pos(Pos, Node, Nodes) ->
{_,OldNode,_} = Found,
if
OldNode =:= Node ->
- throw({error, {node_exists_at_position, Pos, Node}});
+ Msg = "node_exists_at_position_" ++ integer_to_list(Pos),
+ throw({error, list_to_binary(Msg)});
true ->
- throw({error, {position_exists, Pos, OldNode}})
+ Msg = "position_exists_" ++ integer_to_list(Pos),
+ throw({error, list_to_binary(Msg)})
end
end.