couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dam...@apache.org
Subject svn commit: r755009 - /couchdb/trunk/src/couchdb/couch_rep.erl
Date Mon, 16 Mar 2009 21:26:48 GMT
Author: damien
Date: Mon Mar 16 21:26:47 2009
New Revision: 755009

URL: http://svn.apache.org/viewvc?rev=755009&view=rev
Log:
Fix for occasional replication failure where replication would complete before before the
caller had a chance to request the results. No tests, but this should fix this error that
already occurs occasionally: {"error":"normal","reason":"{gen_server,call,[<0.228.0>,get_result,infinity]}"}

Modified:
    couchdb/trunk/src/couchdb/couch_rep.erl

Modified: couchdb/trunk/src/couchdb/couch_rep.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_rep.erl?rev=755009&r1=755008&r2=755009&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_rep.erl (original)
+++ couchdb/trunk/src/couchdb/couch_rep.erl Mon Mar 16 21:26:47 2009
@@ -91,7 +91,8 @@
     stats,
     enum_pid,
     docs_buffer = [],
-    listeners = []
+    listeners = [],
+    done = false
 }).
 
 
@@ -178,7 +179,8 @@
     },
     
     {ok, State}.
-
+handle_call(get_result, From, #state{listeners=L,done=true} = State) ->
+    {stop, normal, State#state{listeners=[From|L]}};
 handle_call(get_result, From, #state{listeners=L} = State) ->
     {noreply, State#state{listeners=[From|L]}};
 
@@ -218,7 +220,13 @@
 
 handle_call({fin, {LastSeq, RevsCount}}, {Pid,_}, #state{enum_pid=Pid} = State) ->
     ets:update_counter(State#state.stats, total_revs, RevsCount),
-    {stop, normal, ok, State#state{current_seq=LastSeq}}.
+    case State#state.listeners of
+    [] ->
+        % still waiting for the first listener to sen a request
+        {noreply, State#state{current_seq=LastSeq}};
+    _ ->
+        {stop, normal, ok, State#state{current_seq=LastSeq}}
+    end.
 
 handle_cast({increment_update_seq, Seq}, State) ->
     couch_task_status:update("Processed source update #~p", [Seq]),
@@ -270,12 +278,8 @@
     ets:delete(Stats),
     close_db(Target),
     
-    case Listeners of
-    [Original|Rest] ->
-        %% reply to original requester
-        gen_server:reply(Original, {ok, NewRepHistory});
-    Rest -> ok
-    end,
+    [Original|Rest] = Listeners,
+    gen_server:reply(Original, {ok, NewRepHistory}),
     
     %% maybe trigger another replication. If this replicator uses a local 
     %% source Db, changes to that Db since we started will not be included in 



Mime
View raw message