You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by fd...@apache.org on 2011/05/13 14:44:29 UTC

svn commit: r1102699 - /couchdb/trunk/src/couchdb/couch_replicator.erl

Author: fdmanana
Date: Fri May 13 12:44:29 2011
New Revision: 1102699

URL: http://svn.apache.org/viewvc?rev=1102699&view=rev
Log:
Replicator: avoid stagnant remote _changes progress

If there's no progress with a remote _changes stream, retry
up to 10 times with an increasing pause period before each
retry attempt. If there's progress retry immediately - any
other connection (worker connections) that fails 10 times will
end up aborting the replication process.



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

Modified: couchdb/trunk/src/couchdb/couch_replicator.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_replicator.erl?rev=1102699&r1=1102698&r2=1102699&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_replicator.erl (original)
+++ couchdb/trunk/src/couchdb/couch_replicator.erl Fri May 13 12:44:29 2011
@@ -581,6 +581,7 @@ fold_replication_logs([Db | Rest] = Dbs,
 spawn_changes_reader(StartSeq, #httpdb{} = Db, ChangesQueue, Options) ->
     spawn_link(fun() ->
         put(last_seq, StartSeq),
+        put(retries_left, Db#httpdb.retries),
         read_changes(StartSeq, Db#httpdb{retries = 0}, ChangesQueue, Options)
     end);
 spawn_changes_reader(StartSeq, Db, ChangesQueue, Options) ->
@@ -594,11 +595,27 @@ read_changes(StartSeq, Db, ChangesQueue,
                 put(last_seq, Seq)
             end, Options),
         couch_work_queue:close(ChangesQueue)
-    catch exit:{http_request_failed, _, _, _} ->
-        Url = couch_util:url_strip_password(couch_api_wrap_httpc:full_url(Db, [])),
-        ?LOG_INFO("Retrying _changes request to source database ~s with since=~p",
-            [Url, get(last_seq)]),
-        read_changes(get(last_seq), Db, ChangesQueue, Options)
+    catch exit:{http_request_failed, _, _, _} = Error ->
+        case get(retries_left) of
+        N when N > 0 ->
+            put(retries_left, N - 1),
+            LastSeq = get(last_seq),
+            Db2 = case LastSeq of
+            StartSeq ->
+                ?LOG_INFO("Retrying _changes request to source database ~s"
+                    " with since=~p in ~p seconds",
+                    [couch_api_wrap:db_uri(Db), LastSeq, Db#httpdb.wait / 1000]),
+                ok = timer:sleep(Db#httpdb.wait),
+                Db#httpdb{wait = 2 * Db#httpdb.wait};
+            _ ->
+                ?LOG_INFO("Retrying _changes request to source database ~s"
+                    " with since=~p", [couch_api_wrap:db_uri(Db), LastSeq]),
+                Db
+            end,
+            read_changes(LastSeq, Db2, ChangesQueue, Options);
+        _ ->
+            exit(Error)
+        end
     end.