summaryrefslogtreecommitdiff
path: root/src/mem3/src/mem3_cluster.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem3/src/mem3_cluster.erl')
-rw-r--r--src/mem3/src/mem3_cluster.erl48
1 files changed, 18 insertions, 30 deletions
diff --git a/src/mem3/src/mem3_cluster.erl b/src/mem3/src/mem3_cluster.erl
index 7e3d477cb..974b2cbef 100644
--- a/src/mem3/src/mem3_cluster.erl
+++ b/src/mem3/src/mem3_cluster.erl
@@ -25,7 +25,6 @@
% That can be configured via the StartPeriod argument. If the time since start
% is less than a full period, then the StartPeriod is used as the period.
-
-module(mem3_cluster).
-behaviour(gen_server).
@@ -44,11 +43,9 @@
code_change/3
]).
-
-callback cluster_stable(Context :: term()) -> NewContext :: term().
-callback cluster_unstable(Context :: term()) -> NewContext :: term().
-
-record(state, {
mod :: atom(),
ctx :: term(),
@@ -59,19 +56,17 @@
timer :: reference()
}).
-
-spec start_link(module(), term(), integer(), integer()) ->
{ok, pid()} | ignore | {error, term()}.
-start_link(Module, Context, StartPeriod, Period)
- when is_atom(Module), is_integer(StartPeriod), is_integer(Period) ->
+start_link(Module, Context, StartPeriod, Period) when
+ is_atom(Module), is_integer(StartPeriod), is_integer(Period)
+->
gen_server:start_link(?MODULE, [Module, Context, StartPeriod, Period], []).
-
-spec set_period(pid(), integer()) -> ok.
set_period(Server, Period) when is_pid(Server), is_integer(Period) ->
gen_server:cast(Server, {set_period, Period}).
-
% gen_server callbacks
init([Module, Context, StartPeriod, Period]) ->
@@ -84,8 +79,7 @@ init([Module, Context, StartPeriod, Period]) ->
period = Period,
start_period = StartPeriod,
timer = new_timer(StartPeriod)
- }}.
-
+ }}.
terminate(_Reason, _State) ->
ok.
@@ -93,32 +87,26 @@ terminate(_Reason, _State) ->
handle_call(_Msg, _From, State) ->
{reply, ignored, State}.
-
handle_cast({set_period, Period}, State) ->
{noreply, State#state{period = Period}}.
-
handle_info({nodeup, _Node}, State) ->
{noreply, cluster_changed(State)};
-
handle_info({nodedown, _Node}, State) ->
{noreply, cluster_changed(State)};
-
handle_info(stability_check, #state{mod = Mod, ctx = Ctx} = State) ->
- erlang:cancel_timer(State#state.timer),
- case now_diff_sec(State#state.last_change) > interval(State) of
- true ->
- {noreply, State#state{ctx = Mod:cluster_stable(Ctx)}};
- false ->
- Timer = new_timer(interval(State)),
- {noreply, State#state{timer = Timer}}
- end.
-
+ erlang:cancel_timer(State#state.timer),
+ case now_diff_sec(State#state.last_change) > interval(State) of
+ true ->
+ {noreply, State#state{ctx = Mod:cluster_stable(Ctx)}};
+ false ->
+ Timer = new_timer(interval(State)),
+ {noreply, State#state{timer = Timer}}
+ end.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
-
%% Internal functions
-spec cluster_changed(#state{}) -> #state{}.
@@ -129,18 +117,19 @@ cluster_changed(#state{mod = Mod, ctx = Ctx} = State) ->
ctx = Mod:cluster_unstable(Ctx)
}.
-
-spec new_timer(non_neg_integer()) -> reference().
new_timer(IntervalSec) ->
erlang:send_after(IntervalSec * 1000, self(), stability_check).
-
% For the first Period seconds after node boot we check cluster stability every
% StartPeriod seconds. Once the initial Period seconds have passed we continue
% to monitor once every Period seconds
-spec interval(#state{}) -> non_neg_integer().
-interval(#state{period = Period, start_period = StartPeriod,
- start_time = T0}) ->
+interval(#state{
+ period = Period,
+ start_period = StartPeriod,
+ start_time = T0
+}) ->
case now_diff_sec(T0) > Period of
true ->
% Normal operation
@@ -150,12 +139,11 @@ interval(#state{period = Period, start_period = StartPeriod,
StartPeriod
end.
-
-spec now_diff_sec(erlang:timestamp()) -> non_neg_integer().
now_diff_sec(Time) ->
case timer:now_diff(os:timestamp(), Time) of
USec when USec < 0 ->
0;
USec when USec >= 0 ->
- USec / 1000000
+ USec / 1000000
end.