Skip to content

Commit 1281e1a

Browse files
authored
Merge pull request #242 from keynslug/fix/autocluster-eager-stop
fix(autocluster): avoid stopping autocluster too eagerly
2 parents f11855f + b7ef3f0 commit 1281e1a

4 files changed

+65
-14
lines changed

src/ekka.appup.src

+36-4
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,59 @@
11
%% -*- mode: erlang -*-
22
%% Unless you know what you are doing, DO NOT edit manually!!
33
{VSN,
4-
[{"0.8.1.13", []},
4+
[{"0.8.1.14",
5+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
6+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]}]},
7+
{"0.8.1.13",
8+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
9+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]}]},
510
{"0.8.1.12",
6-
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
11+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
12+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
13+
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
714
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]}]},
815
{"0.8.1.11",
916
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
1017
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
1118
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
19+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
1220
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]}]},
1321
{"0.8.1.10",
1422
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
1523
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
1624
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
25+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
1726
{load_module,ekka_dist,brutal_purge,soft_purge,[]},
1827
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
1928
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]}]},
2029
{"0.8.1.9",
2130
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
2231
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
2332
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
33+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
2434
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
2535
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
2636
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
2737
{"0.8.1.8",
2838
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
2939
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
3040
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
41+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
3142
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
3243
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
3344
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
3445
{"0.8.1.7",
3546
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
3647
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
3748
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
49+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
3850
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
3951
{load_module,ekka_locker,brutal_purge,soft_purge,[]},
4052
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
4153
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
4254
{<<"0\\.8\\.1\\.[3-6]">>,
4355
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
56+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
4457
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
4558
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
4659
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
@@ -50,6 +63,7 @@
5063
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
5164
{"0.8.1.2",
5265
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
66+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
5367
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
5468
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
5569
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
@@ -62,6 +76,7 @@
6276
{"0.8.1.1",
6377
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
6478
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
79+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
6580
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
6681
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
6782
{load_module,ekka_httpc,brutal_purge,soft_purge,[]},
@@ -73,6 +88,7 @@
7388
{"0.8.1",
7489
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
7590
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
91+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
7692
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
7793
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
7894
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
@@ -81,46 +97,59 @@
8197
{load_module,ekka_httpc,brutal_purge,soft_purge,[]},
8298
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
8399
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]}],
84-
[{"0.8.1.13", []},
100+
[{"0.8.1.14",
101+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
102+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]}]},
103+
{"0.8.1.13",
104+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
105+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]}]},
85106
{"0.8.1.12",
86-
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
107+
[{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
108+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
109+
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
87110
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]}]},
88111
{"0.8.1.11",
89112
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
90113
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
91114
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
115+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
92116
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]}]},
93117
{"0.8.1.10",
94118
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
95119
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
96120
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
121+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
97122
{load_module,ekka_dist,brutal_purge,soft_purge,[]},
98123
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
99124
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]}]},
100125
{"0.8.1.9",
101126
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
102127
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
103128
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
129+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
104130
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
105131
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
106132
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
107133
{"0.8.1.8",
108134
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
109135
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
110136
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
137+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
111138
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
112139
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
113140
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
114141
{"0.8.1.7",
115142
[{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
116143
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
117144
{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
145+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
118146
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
119147
{load_module,ekka_locker,brutal_purge,soft_purge,[]},
120148
{load_module,ekka_mnesia,brutal_purge,soft_purge,[]},
121149
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
122150
{<<"0\\.8\\.1\\.[3-6]">>,
123151
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
152+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
124153
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
125154
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},
126155
{load_module,ekka_autoheal,brutal_purge,soft_purge,[]},
@@ -130,6 +159,7 @@
130159
{load_module,ekka_dist,brutal_purge,soft_purge,[]}]},
131160
{"0.8.1.2",
132161
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
162+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
133163
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
134164
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
135165
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
@@ -142,6 +172,7 @@
142172
{"0.8.1.1",
143173
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
144174
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
175+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
145176
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
146177
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
147178
{load_module,ekka_httpc,brutal_purge,soft_purge,[]},
@@ -153,6 +184,7 @@
153184
{"0.8.1",
154185
[{load_module,ekka_cluster_strategy,brutal_purge,soft_purge,[]},
155186
{load_module,ekka_cluster_dns,brutal_purge,soft_purge,[]},
187+
{load_module,ekka_cluster_static,brutal_purge,soft_purge,[]},
156188
{load_module,ekka_ring,brutal_purge,soft_purge,[]},
157189
{load_module,ekka_node_monitor,brutal_purge,soft_purge,[]},
158190
{load_module,ekka_autocluster,brutal_purge,soft_purge,[]},

src/ekka_autocluster.erl

+8-9
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ strategy_module(Strategy) ->
173173
discover_and_join(Mod, Options) ->
174174
?tp(ekka_autocluster_discover_and_join, #{mod => Mod}),
175175
try ekka_cluster_strategy:discover(Mod, Options) of
176+
{ok, []} ->
177+
?LOG(info, "Discovery result is empty", []),
178+
error;
176179
{ok, Nodes} ->
177180
{AliveNodes, DeadNodes} = lists:partition(
178181
fun ekka_node:is_aliving/1,
@@ -202,8 +205,6 @@ discover_and_join(Mod, Options) ->
202205
end.
203206

204207
-spec maybe_join([node()]) -> ignore | ok | {error, _}.
205-
maybe_join([]) ->
206-
ignore;
207208
maybe_join(Nodes0) ->
208209
Nodes = lists:usort(Nodes0),
209210
KnownNodes = lists:usort(ekka_mnesia:cluster_nodes(all)),
@@ -212,16 +213,13 @@ maybe_join(Nodes0) ->
212213
?LOG(info, "all discovered nodes already in cluster; ignoring", []),
213214
ignore;
214215
false ->
215-
OldestNode = find_oldest_node(Nodes),
216-
?LOG(info, "joining with ~p", [OldestNode]),
217-
join_with(OldestNode)
216+
join_with(find_oldest_node(Nodes -- [node()]))
218217
end.
219218

220219
join_with(false) ->
221-
ignore;
222-
join_with(Node) when Node =:= node() ->
223-
ignore;
220+
{error, no_member};
224221
join_with(Node) ->
222+
?LOG(info, "joining with ~p", [Node]),
225223
ekka_cluster:join(Node).
226224

227225
find_oldest_node([Node]) ->
@@ -241,4 +239,5 @@ find_oldest_node(Nodes) ->
241239

242240
log_error(Format, {error, Reason}) ->
243241
?LOG(error, Format ++ " error: ~p", [Reason]);
244-
log_error(_Format, _Ok) -> ok.
242+
log_error(_Format, _Ok) ->
243+
ok.

src/ekka_cluster_static.erl

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
]).
2727

2828
discover(Options) ->
29-
{ok, proplists:get_value(seeds, Options, [])}.
29+
{ok, proplists:get_value(seeds, Options, [node()])}.
3030

3131
lock(_Options) ->
3232
ignore.

test/ekka_autocluster_SUITE.erl

+20
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,26 @@ t_autocluster_via_dns(_Config) ->
147147
ok = ekka_ct:stop_slave(N1)
148148
end.
149149

150+
t_autocluster_via_dns_laggy(_Config) ->
151+
N1 = ekka_ct:start_slave(ekka, n1),
152+
?check_trace(
153+
#{timetrap => 15000},
154+
try
155+
ok = ekka_ct:wait_running(N1),
156+
ok = set_app_env(N1, {dns, [{name, "thishostnameshouldnotexist"},
157+
{app, "ct"}
158+
]}),
159+
{ok, {ok, #{}}} = ?wait_async_action(
160+
rpc:call(N1, ekka, autocluster, []),
161+
#{?snk_kind := ekka_maybe_run_app_again}),
162+
ok = set_app_env(N1, {dns, ?DNS_OPTIONS}),
163+
ok = wait_for_node(N1),
164+
ok = ekka:force_leave(N1)
165+
after
166+
ok = ekka_ct:stop_slave(N1)
167+
end,
168+
[]).
169+
150170
%%--------------------------------------------------------------------
151171
%% Autocluster via 'etcd' strategy
152172

0 commit comments

Comments
 (0)