Sending values from sender_client to keepers made synchronous.
authorStanislaw Klekot <dozzie@jarowit.net>
Sun, 6 Aug 2017 13:14:19 +0000 (15:14 +0200)
committerStanislaw Klekot <dozzie@jarowit.net>
Sun, 6 Aug 2017 13:14:19 +0000 (15:14 +0200)
This solves the problem of overflowing the queue of a busy keeper (this causes
BEAM crash after long StateTip downtime).

src/statip_keeper_related.erl
src/statip_keeper_unrelated.erl

index 6c453ad..53b3343 100644 (file)
@@ -83,7 +83,7 @@ restore(Pid, Values) ->
   ok.
 
 add(Pid, Value = #value{}) ->
-  gen_server:cast(Pid, {add, Value}).
+  gen_server:call(Pid, {add, Value}).
 
 %% @doc Shutdown a keeper, effectively deleting all the keys.
 
@@ -186,6 +186,14 @@ handle_call({get_value, Key} = _Request, _From,
   Result = get_value(Key, CurEntries, OldEntries),
   {reply, Result, State, 1000};
 
+handle_call({add, Value = #value{}} = _Request, _From,
+            State = #state{group_name = GroupName,
+                           group_origin = GroupOrigin}) ->
+  % XXX: `add_value()' can send a "rotate" record, so `set()' goes after that
+  NewState = add_value(Value, State),
+  statip_state_log:set(GroupName, GroupOrigin, related, Value),
+  {reply, ok, NewState, 1000};
+
 %% unknown calls
 handle_call(_Request, _From, State) ->
   {reply, {error, unknown_call}, State}.
@@ -193,14 +201,6 @@ handle_call(_Request, _From, State) ->
 %% @private
 %% @doc Handle {@link gen_server:cast/2}.
 
-handle_cast({add, Value = #value{}} = _Request,
-            State = #state{group_name = GroupName,
-                           group_origin = GroupOrigin}) ->
-  % XXX: `add_value()' can send a "rotate" record, so `set()' goes after that
-  NewState = add_value(Value, State),
-  statip_state_log:set(GroupName, GroupOrigin, related, Value),
-  {noreply, NewState, 1000};
-
 handle_cast({delete, Key} = _Request,
             State = #state{group_name = GroupName,
                            group_origin = GroupOrigin}) ->
index dfe8eb0..2989a93 100644 (file)
@@ -80,7 +80,7 @@ restore(Pid, Values) ->
   ok.
 
 add(Pid, Value = #value{}) ->
-  gen_server:cast(Pid, {add, Value}).
+  gen_server:call(Pid, {add, Value}).
 
 %% @doc Shutdown a keeper, effectively deleting all the keys.
 
@@ -188,14 +188,7 @@ handle_call({get_value, Key} = _Request, _From,
   Result = store_get_value(Key, Entries),
   {reply, Result, State, 1000};
 
-%% unknown calls
-handle_call(_Request, _From, State) ->
-  {reply, {error, unknown_call}, State, 1000}.
-
-%% @private
-%% @doc Handle {@link gen_server:cast/2}.
-
-handle_cast({add, Value = #value{}} = _Request,
+handle_call({add, Value = #value{}} = _Request, _From,
             State = #state{entries = Entries, expiry = ExpiryQ,
                            group_name = GroupName,
                            group_origin = GroupOrigin}) ->
@@ -205,7 +198,14 @@ handle_cast({add, Value = #value{}} = _Request,
     entries = NewEntries,
     expiry = NewExpiryQ
   },
-  {noreply, NewState, 1000};
+  {reply, ok, NewState, 1000};
+
+%% unknown calls
+handle_call(_Request, _From, State) ->
+  {reply, {error, unknown_call}, State, 1000}.
+
+%% @private
+%% @doc Handle {@link gen_server:cast/2}.
 
 handle_cast({delete, _Key} = _Request,
             State = #state{entries = undefined, expiry = undefined}) ->