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