You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2017/07/12 21:44:08 UTC

[couchdb] 02/02: Avoid a race when restarting an index updater

This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch 649-fix-mrview-changes-since-test
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit a17894596cda291461e6ca412f8be3fb3c3552ec
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Wed Jul 12 16:00:33 2017 -0500

    Avoid a race when restarting an index updater
    
    This was encountered during the test suite runs on Travis. It turns out
    that when we restart the indexer its possible to already have the 'EXIT'
    message in our mailbox. When we do we'll then crash with an unknown_info
    error since our updater pid was changed during the restart.
    
    This change simple filters any 'EXIT' message from the old updater from
    the mailbox before restarting thew new index updater.
    
    Fixes #649
---
 src/couch_index/src/couch_index_updater.erl | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/couch_index/src/couch_index_updater.erl b/src/couch_index/src/couch_index_updater.erl
index ad48f40..4f63e9f 100644
--- a/src/couch_index/src/couch_index_updater.erl
+++ b/src/couch_index/src/couch_index_updater.erl
@@ -73,12 +73,20 @@ handle_call({update, IdxState}, _From, #st{idx=Idx, mod=Mod}=State) ->
 handle_call({restart, IdxState}, _From, #st{idx=Idx, mod=Mod}=State) ->
     Args = [Mod:get(db_name, IdxState), Mod:get(idx_name, IdxState)],
     couch_log:info("Restarting index update for db: ~s idx: ~s", Args),
-    case is_pid(State#st.pid) of
+    Pid = State#st.pid,
+    case is_pid(Pid) of
         true -> couch_util:shutdown_sync(State#st.pid);
         _ -> ok
     end,
-    Pid = spawn_link(?MODULE, update, [Idx, State#st.mod, IdxState]),
-    {reply, ok, State#st{pid=Pid}};
+    % Make sure and flush a possible 'EXIT' message
+    % that's already in our mailbox
+    receive
+        {'EXIT', Pid, _} -> ok
+    after 0 ->
+        ok
+    end,
+    NewPid = spawn_link(?MODULE, update, [Idx, State#st.mod, IdxState]),
+    {reply, ok, State#st{pid=NewPid}};
 handle_call(is_running, _From, #st{pid=Pid}=State) when is_pid(Pid) ->
     {reply, true, State};
 handle_call(is_running, _From, State) ->

-- 
To stop receiving notification emails like this one, please contact
"commits@couchdb.apache.org" <co...@couchdb.apache.org>.