You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2014/08/07 17:37:45 UTC

[23/50] couch commit: updated refs/heads/windsor-merge to 6e60cbe

Verify that DB is in couch_dbs before updating

This patch fixes a bug where there could be a db_updated message in the
couch_server message queue, but the updater process could be dead and
removed from the couch_dbs ets table. While this patch doesn't change
the possibility of that state, it makes the couch_server db_updated
function clause to verify that 1) the DB is in the couch_dbs ets table
and 2) that the instance_start_time of the updated DB matches the
instance_start_time of the couch_dbs entry. If the DB isn't in the
couch_dbs ets table it means that it was removed from the LRU. If the
two instance_start_times don't match, it means that the old couch_dbs
entry was expired from the LRU and re-inserted before the monitor exit
message was processed.

BugzID: 21179


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

Branch: refs/heads/windsor-merge
Commit: 41b61b9a2f07e62dc20a84be85f328dd225f89c9
Parents: 9f16b07
Author: Benjamin Bastian <be...@gmail.com>
Authored: Mon Jul 22 15:41:54 2013 -0700
Committer: Robert Newson <rn...@apache.org>
Committed: Tue Aug 5 17:35:48 2014 +0100

----------------------------------------------------------------------
 src/couch_server.erl | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/41b61b9a/src/couch_server.erl
----------------------------------------------------------------------
diff --git a/src/couch_server.erl b/src/couch_server.erl
index e741720..fd4691c 100644
--- a/src/couch_server.erl
+++ b/src/couch_server.erl
@@ -483,13 +483,22 @@ handle_call({delete, DbName, Options}, _From, Server) ->
     Error ->
         {reply, Error, Server}
     end;
-handle_call({db_updated, #db{name = DbName} = Db}, _From, Server) ->
-    true = ets:insert(couch_dbs, Db),
-    Lru = case couch_db:is_system_db(Db) of
-        false -> couch_lru:update(DbName, Server#server.lru);
-        true -> Server#server.lru
+handle_call({db_updated, #db{}=Db}, _From, Server0) ->
+    #db{name = DbName, instance_start_time = StartTime} = Db,
+    Server = try ets:lookup_element(couch_dbs, DbName, #db.instance_start_time) of
+        StartTime ->
+            true = ets:insert(couch_dbs, Db),
+            Lru = case couch_db:is_system_db(Db) of
+                false -> couch_lru:update(DbName, Server0#server.lru);
+                true -> Server0#server.lru
+            end,
+            Server0#server{lru = Lru};
+        _ ->
+            Server0
+    catch _:_ ->
+        Server0
     end,
-    {reply, ok, Server#server{lru = Lru}}.
+    {reply, ok, Server}.
 
 handle_cast({update_lru, DbName}, #server{lru = Lru, update_lru_on_read=true} = Server) ->
     {noreply, Server#server{lru = couch_lru:update(DbName, Lru)}};