Handle requests that occur when the LRU is down

We don't want to break things if the ddoc cache LRU disappears for any
reason. I've seen this during the first release upgrade as well as
locally during a dev node boot. Its relatively minor but we should be
thorough here.


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

Branch: refs/heads/import
Commit: 077113e16efb3208dded09c1e8e57888a2153f6f
Parents: 304b46f
Author: Paul J. Davis <[email protected]>
Authored: Fri Jan 25 00:12:20 2013 -0600
Committer: Paul J. Davis <[email protected]>
Committed: Fri Jan 25 00:12:20 2013 -0600

----------------------------------------------------------------------
 src/ddoc_cache.erl | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-ddoc-cache/blob/077113e1/src/ddoc_cache.erl
----------------------------------------------------------------------
diff --git a/src/ddoc_cache.erl b/src/ddoc_cache.erl
index e4e16bd..720f9df 100644
--- a/src/ddoc_cache.erl
+++ b/src/ddoc_cache.erl
@@ -33,7 +33,7 @@ open(DbName, DDocId) when is_binary(DDocId) ->
 
 
 open(Key) ->
-    case ets_lru:lookup_d(?CACHE, Key) of
+    try ets_lru:lookup_d(?CACHE, Key) of
         {ok, _} = Resp ->
             Resp;
         _ ->
@@ -43,6 +43,9 @@ open(Key) ->
                 Else ->
                     throw(Else)
             end
+    catch
+        error:badarg ->
+            recover(Key)
     end.
 
 
@@ -50,3 +53,15 @@ evict(ShardDbName, DDocIds) ->
     DbName = mem3:dbname(ShardDbName),
     gen_server:cast(?OPENER, {evict, DbName, DDocIds}).
 
+
+recover({DbName, validation_funs}) ->
+    {ok, DDocs} = fabric:design_docs(mem3:dbname(DbName)),
+    Funs = lists:flatmap(fun(DDoc) ->
+        case couch_doc:get_validate_doc_fun(DDoc) of
+            nil -> [];
+            Fun -> [Fun]
+        end
+    end, DDocs),
+    {ok, Funs};
+recover({DbName, DDocId}) ->
+    fabric:open_doc(DbName, DDocId, []).

Reply via email to