You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ra...@apache.org on 2011/12/16 02:00:29 UTC

[1/3] git commit: Fix COUCHDB-1363 - race condition in couch_changes

Updated Branches:
  refs/heads/1.0.x 9c377a1af -> e82a0c989
  refs/heads/1.1.x c9b20f290 -> 6a04e3336
  refs/heads/1.2.x 7f9376ce6 -> 1bbe61973


Fix COUCHDB-1363 - race condition in couch_changes

It's necessary to re-open the #db after subscribing to notifications
so that updates are not lost. In practice, this is rarely problematic
because the next change will cause everything to catch up, but if a
quick burst of changes happens while replication is starting the
replication can go stale. Detected by intermittent replicator_db js
test failures.


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/e82a0c98
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/e82a0c98
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/e82a0c98

Branch: refs/heads/1.0.x
Commit: e82a0c98924b999b91eaadfd9106c153c9ed4b64
Parents: 9c377a1
Author: Randall Leeds <ra...@apache.org>
Authored: Wed Dec 14 20:12:08 2011 -0800
Committer: Randall Leeds <ra...@apache.org>
Committed: Thu Dec 15 16:55:28 2011 -0800

----------------------------------------------------------------------
 src/couchdb/couch_changes.erl |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/e82a0c98/src/couchdb/couch_changes.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_changes.erl b/src/couchdb/couch_changes.erl
index c0bc7ad..0cc284d 100644
--- a/src/couchdb/couch_changes.erl
+++ b/src/couchdb/couch_changes.erl
@@ -19,23 +19,28 @@
 handle_changes(#changes_args{style=Style}=Args1, Req, Db) ->
     Args = Args1#changes_args{filter=
             make_filter_fun(Args1#changes_args.filter, Style, Req, Db)},
-    StartSeq = case Args#changes_args.dir of
-    rev ->
-        couch_db:get_update_seq(Db);
-    fwd ->
-        Args#changes_args.since
+    Start = fun() ->
+        {ok, Db} = couch_db:reopen(Db0),
+        StartSeq = case Dir of
+        rev ->
+            couch_db:get_update_seq(Db);
+        fwd ->
+            Since
+        end,
+        {Db, StartSeq}
     end,
     if Args#changes_args.feed == "continuous" orelse
         Args#changes_args.feed == "longpoll" ->
         fun(Callback) ->
             Self = self(),
             {ok, Notify} = couch_db_update_notifier:start_link(
-                fun({_, DbName}) when DbName == Db#db.name ->
+                fun({_, DbName}) when  Db0#db.name == DbName ->
                     Self ! db_updated;
                 (_) ->
                     ok
                 end
             ),
+            {Db, StartSeq} = Start(),
             start_sending_changes(Callback, Args#changes_args.feed),
             {Timeout, TimeoutFun} = get_changes_timeout(Args, Callback),
             try
@@ -55,6 +60,7 @@ handle_changes(#changes_args{style=Style}=Args1, Req, Db) ->
         end;
     true ->
         fun(Callback) ->
+            {Db, StartSeq} = Start(),
             start_sending_changes(Callback, Args#changes_args.feed),
             {ok, {_, LastSeq, _Prepend, _, _, _, _, _, _}} =
                 send_changes(