summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Anderson <brad@cloudant.com>2010-05-27 11:41:03 -0400
committerBrad Anderson <brad@cloudant.com>2010-05-27 11:41:03 -0400
commitcdec6e0fb82f862f7c7d0c712535a712cdc683d5 (patch)
treeb50dc8e5bea55b69d972776a736d9441c9e3960f /src
parent63c0e5eac30acbb6ed8926dc5dfbf5157f416369 (diff)
allow for single-node cluster 'init'
Diffstat (limited to 'src')
-rw-r--r--src/mem3.erl20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/mem3.erl b/src/mem3.erl
index d5a96605..11c39ef7 100644
--- a/src/mem3.erl
+++ b/src/mem3.erl
@@ -386,13 +386,17 @@ gossip(#mem{args=Args} = NewState) ->
-spec gossip(test(), mem_state()) -> mem_state().
gossip(undefined, #mem{nodes=StateNodes} = State) ->
{_, Nodes, _} = lists:unzip3(StateNodes),
- TargetNode = next_up_node(Nodes),
- showroom_log:message(info, "membership: firing gossip from ~p to ~p",
- [node(), TargetNode]),
- case gen_server:call({?SERVER, TargetNode}, {gossip, State}) of
- ok -> State;
- {new_state, NewState} -> NewState;
- Error -> throw({unknown_gossip_response, Error})
+ case next_up_node(Nodes) of
+ no_gossip_targets_available ->
+ State; % skip gossip, I'm the only node
+ TargetNode ->
+ showroom_log:message(info, "membership: firing gossip from ~p to ~p",
+ [node(), TargetNode]),
+ case gen_server:call({?SERVER, TargetNode}, {gossip, State}) of
+ ok -> State;
+ {new_state, NewState} -> NewState;
+ Error -> throw({unknown_gossip_response, Error})
+ end
end;
gossip(_,_) ->
@@ -411,7 +415,7 @@ next_up_node(Node, Nodes, UpNodes) ->
DownNodes = Nodes -- UpNodes,
case List -- DownNodes of
[Target|_] -> Target;
- [] -> throw({error, no_gossip_targets_available})
+ [] -> no_gossip_targets_available
end.