Skip to content

Commit 52e6bf5

Browse files
committed
Merge pull request #7 from helium/bugfix/cluster-ops
Tie up some cluster management loose ends Reviewed-by: kellymclaughlin
2 parents 3346b41 + 2d31848 commit 52e6bf5

6 files changed

+95
-17
lines changed

src/plumtree_broadcast.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ handle_cast({graft, MessageId, Mod, Round, Root, From}, State) ->
278278
State1 = handle_graft(Result, MessageId, Mod, Round, Root, From, State),
279279
{noreply, State1};
280280
handle_cast({update, LocalState}, State=#state{all_members=BroadcastMembers}) ->
281-
CurrentMembers = ordsets:from_list(LocalState),
281+
Members = riak_dt_orswot:value(LocalState),
282+
CurrentMembers = ordsets:from_list(Members),
282283
New = ordsets:subtract(CurrentMembers, BroadcastMembers),
283284
Removed = ordsets:subtract(BroadcastMembers, CurrentMembers),
284285
State1 = case ordsets:size(New) > 0 of

src/plumtree_peer_service.erl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
join/3,
2626
attempt_join/1,
2727
attempt_join/2,
28-
leave/0,
28+
leave/1,
2929
stop/0,
3030
stop/1
3131
]).
@@ -67,7 +67,7 @@ attempt_join(Node, Local) ->
6767
_ = [gen_server:cast({plumtree_peer_service_gossip, P}, {receive_state, Merged}) || P <- Members, P /= node()],
6868
ok.
6969

70-
leave() ->
70+
leave(_Args) when is_list(_Args) ->
7171
{ok, Local} = plumtree_peer_service_manager:get_local_state(),
7272
{ok, Actor} = plumtree_peer_service_manager:get_actor(),
7373
{ok, Leave} = riak_dt_orswot:update({remove, node()}, Actor, Local),
@@ -81,14 +81,16 @@ leave() ->
8181
case [P || P <- Remote2List, P =:= node()] of
8282
[] ->
8383
%% leaving the cluster shuts down the node
84-
plumtree_peer_service_manager:reset_state(),
84+
plumtree_peer_service_manager:delete_state(),
8585
stop("Leaving cluster");
8686
_ ->
87-
leave()
87+
leave([])
8888
end;
8989
{error, singleton} ->
9090
lager:warning("Cannot leave, not a member of a cluster.")
91-
end.
91+
end;
92+
leave(_Args) ->
93+
leave([]).
9294

9395
stop() ->
9496
stop("received stop request").

src/plumtree_peer_service_console.erl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
%% -------------------------------------------------------------------
2+
%%
3+
%% Copyright (c) 2015 Helium Systems, Inc. All Rights Reserved.
4+
%%
5+
%% This file is provided to you under the Apache License,
6+
%% Version 2.0 (the "License"); you may not use this file
7+
%% except in compliance with the License. You may obtain
8+
%% a copy of the License at
9+
%%
10+
%% http://www.apache.org/licenses/LICENSE-2.0
11+
%%
12+
%% Unless required by applicable law or agreed to in writing,
13+
%% software distributed under the License is distributed on an
14+
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
%% KIND, either express or implied. See the License for the
16+
%% specific language governing permissions and limitations
17+
%% under the License.
18+
%%
19+
%% -------------------------------------------------------------------
20+
21+
-module(plumtree_peer_service_console).
22+
23+
-export([members/1]).
24+
25+
members([]) ->
26+
{ok, LocalState} = plumtree_peer_service_manager:get_local_state(),
27+
Members = riak_dt_orswot:value(LocalState),
28+
print_members(Members).
29+
30+
print_members(Members) ->
31+
_ = io:format("~29..=s Cluster Membership ~30..=s~n", ["",""]),
32+
_ = io:format("Connected Nodes:~n~n", []),
33+
_ = [io:format("~p~n", [Node]) || Node <- Members],
34+
_ = io:format("~79..=s~n", [""]),
35+
ok.

src/plumtree_peer_service_events.erl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ update(LocalState) ->
6565

6666
init([Fn]) ->
6767
{ok, LocalState} = plumtree_peer_service_manager:get_local_state(),
68-
Members = riak_dt_orswot:value(LocalState),
69-
Fn(Members),
68+
Fn(LocalState),
7069
{ok, #state { callback = Fn }}.
7170

7271
handle_event({update, LocalState}, State) ->

src/plumtree_peer_service_manager.erl

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
-define(TBL, cluster_state).
2424

25-
-export([init/0, get_local_state/0, get_actor/0, update_state/1, reset_state/0]).
25+
-export([init/0, get_local_state/0, get_actor/0, update_state/1, delete_state/0]).
2626

2727
init() ->
2828
%% setup ETS table for cluster_state
@@ -61,11 +61,8 @@ update_state(State) ->
6161
write_state_to_disk(State),
6262
ets:insert(?TBL, {cluster_state, State}).
6363

64-
reset_state() ->
65-
add_self(),
66-
{ok, State} = get_local_state(),
67-
write_state_to_disk(State),
68-
ets:insert(?TBL, {cluster_state, State}).
64+
delete_state() ->
65+
delete_state_from_disk().
6966

7067
%%% ------------------------------------------------------------------
7168
%%% internal functions
@@ -106,6 +103,21 @@ write_state_to_disk(State) ->
106103
riak_dt_orswot:to_binary(State))
107104
end.
108105

106+
delete_state_from_disk() ->
107+
case data_root() of
108+
undefined ->
109+
ok;
110+
Dir ->
111+
File = filename:join(Dir, "cluster_state"),
112+
ok = filelib:ensure_dir(File),
113+
case file:delete(File) of
114+
ok ->
115+
lager:info("Leaving cluster, removed cluster_state");
116+
{error, Reason} ->
117+
lager:info("Unable to remove cluster_state for reason ~p", [Reason])
118+
end
119+
end.
120+
109121
maybe_load_state_from_disk() ->
110122
case data_root() of
111123
undefined ->

test/cluster_membership_SUITE.erl

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
join_nonexistant_node_test/1,
3636
join_self_test/1,
3737
leave_test/1,
38+
leave_rejoin_test/1,
3839
sticky_membership_test/1
3940
]).
4041

@@ -76,7 +77,7 @@ end_per_testcase(_, _Config) ->
7677

7778
all() ->
7879
[singleton_test, join_test, join_nonexistant_node_test, join_self_test,
79-
leave_test, sticky_membership_test].
80+
leave_test, leave_rejoin_test, sticky_membership_test].
8081

8182
singleton_test(Config) ->
8283
Nodes = proplists:get_value(nodes, Config),
@@ -118,7 +119,7 @@ leave_test(Config) ->
118119
[?assertEqual({Node, Expected}, {Node,
119120
lists:sort(plumtree_test_utils:get_cluster_members(Node))})
120121
|| Node <- Nodes],
121-
?assertEqual(ok, rpc:call(Node1, plumtree_peer_service, leave, [])),
122+
?assertEqual(ok, rpc:call(Node1, plumtree_peer_service, leave, [[]])),
122123
Expected2 = lists:sort(OtherNodes),
123124
ok = plumtree_test_utils:wait_until_left(OtherNodes, Node1),
124125
%% should be a 3 node cluster now
@@ -129,6 +130,34 @@ leave_test(Config) ->
129130
?assertEqual(pang, net_adm:ping(Node1)),
130131
ok.
131132

133+
leave_rejoin_test(Config) ->
134+
[Node1|OtherNodes] = Nodes = proplists:get_value(nodes, Config),
135+
[Node2|_Rest] = OtherNodes,
136+
[?assertEqual(ok, rpc:call(Node, plumtree_peer_service, join, [Node1]))
137+
|| Node <- OtherNodes],
138+
Expected = lists:sort(Nodes),
139+
ok = plumtree_test_utils:wait_until_joined(Nodes, Expected),
140+
[?assertEqual({Node, Expected}, {Node,
141+
lists:sort(plumtree_test_utils:get_cluster_members(Node))})
142+
|| Node <- Nodes],
143+
?assertEqual(ok, rpc:call(Node1, plumtree_peer_service, leave, [[]])),
144+
Expected2 = lists:sort(OtherNodes),
145+
ok = plumtree_test_utils:wait_until_left(OtherNodes, Node1),
146+
%% should be a 3 node cluster now
147+
[?assertEqual({Node, Expected2}, {Node,
148+
lists:sort(plumtree_test_utils:get_cluster_members(Node))})
149+
|| Node <- OtherNodes],
150+
%% node1 should be offline
151+
?assertEqual(pang, net_adm:ping(Node1)),
152+
plumtree_test_utils:start_node(jaguar, Config, leave_rejoin_test),
153+
%% rejoin cluster
154+
?assertEqual(ok, rpc:call(Node1, plumtree_peer_service, join, [Node2])),
155+
ok = plumtree_test_utils:wait_until_joined(Nodes, Expected),
156+
[?assertEqual({Node, Expected}, {Node,
157+
lists:sort(plumtree_test_utils:get_cluster_members(Node))})
158+
|| Node <- Nodes],
159+
ok.
160+
132161
sticky_membership_test(Config) ->
133162
[Node1|OtherNodes] = Nodes = proplists:get_value(nodes, Config),
134163
[?assertEqual(ok, rpc:call(Node, plumtree_peer_service, join, [Node1]))
@@ -150,7 +179,7 @@ sticky_membership_test(Config) ->
150179
ct_slave:stop(jaguar),
151180
ok = plumtree_test_utils:wait_until_offline(Node1),
152181
[Node2|LastTwo] = OtherNodes,
153-
?assertEqual(ok, rpc:call(Node2, plumtree_peer_service, leave, [])),
182+
?assertEqual(ok, rpc:call(Node2, plumtree_peer_service, leave, [[]])),
154183
ok = plumtree_test_utils:wait_until_left(LastTwo, Node2),
155184
ok = plumtree_test_utils:wait_until_offline(Node2),
156185
Expected2 = lists:sort(Nodes -- [Node2]),

0 commit comments

Comments
 (0)