Pass through responses and errors directly

There was a bit of a mismatch in the behavior of ddoc_cache:open/2 and
fabric:open_doc/3. This just makes sure that return values are returned
and any exceptions are reraised with the same semantics of
throw/error/exit as they were generated.


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/cb9906ca
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-ddoc-cache/tree/cb9906ca
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-ddoc-cache/diff/cb9906ca

Branch: refs/heads/import
Commit: cb9906ca577347150037021a9d410ba2839b26ba
Parents: 8bd9ba6
Author: Paul J. Davis <[email protected]>
Authored: Tue Jan 29 17:09:52 2013 -0600
Committer: Paul J. Davis <[email protected]>
Committed: Tue Jan 29 17:12:19 2013 -0600

----------------------------------------------------------------------
 src/ddoc_cache.erl        | 10 +++++++---
 src/ddoc_cache_opener.erl | 20 ++++++++++----------
 2 files changed, 17 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-ddoc-cache/blob/cb9906ca/src/ddoc_cache.erl
----------------------------------------------------------------------
diff --git a/src/ddoc_cache.erl b/src/ddoc_cache.erl
index 48cfcdc..35aa610 100644
--- a/src/ddoc_cache.erl
+++ b/src/ddoc_cache.erl
@@ -40,10 +40,14 @@ open(Key) ->
         _ ->
             margaret_counter:increment([ddoc_cache, miss]),
             case gen_server:call(?OPENER, {open, Key}, infinity) of
-                {ok, _} = Resp ->
+                {open_ok, Resp} ->
                     Resp;
-                Else ->
-                    throw(Else)
+                {open_error, throw, Error} ->
+                    throw(Error);
+                {open_error, error, Error} ->
+                    erlang:error(Error);
+                {open_error, exit, Error} ->
+                    exit(Error)
             end
     catch
         error:badarg ->

http://git-wip-us.apache.org/repos/asf/couchdb-ddoc-cache/blob/cb9906ca/src/ddoc_cache_opener.erl
----------------------------------------------------------------------
diff --git a/src/ddoc_cache_opener.erl b/src/ddoc_cache_opener.erl
index 5a899b0..4f8eb65 100644
--- a/src/ddoc_cache_opener.erl
+++ b/src/ddoc_cache_opener.erl
@@ -120,12 +120,12 @@ handle_info({'EXIT', Pid, Reason}, #st{evictor=Pid}=St) ->
     {ok, Evictor} = couch_db_update_notifier:start_link(fun ?MODULE:evictor/1),
     {noreply, St#st{evictor=Evictor}};
 
-handle_info({'EXIT', _Pid, {ddoc_ok, Key, Doc}}, St) ->
-    respond(Key, {ok, Doc}),
+handle_info({'EXIT', _Pid, {open_ok, Key, Resp}}, St) ->
+    respond(Key, {open_ok, Resp}),
     {noreply, St};
 
-handle_info({'EXIT', _Pid, {ddoc_error, Key, Error}}, St) ->
-    respond(Key, Error),
+handle_info({'EXIT', _Pid, {open_error, Key, Type, Error}}, St) ->
+    respond(Key, {open_error, Type, Error}),
     {noreply, St};
 
 handle_info({'EXIT', Pid, Reason}, St) ->
@@ -166,17 +166,17 @@ open_ddoc({DbName, validation_funs}=Key) ->
         end
     end, DDocs),
     ok = ets_lru:insert(ddoc_cache_lru, {DbName, validation_funs}, Funs),
-    exit({ddoc_ok, Key, Funs});
+    exit({open_ok, Key, Funs});
 open_ddoc({DbName, DDocId}=Key) ->
     try fabric:open_doc(DbName, DDocId, []) of
         {ok, Doc} ->
             ok = ets_lru:insert(ddoc_cache_lru, {DbName, DDocId}, Doc),
-            exit({ddoc_ok, Key, Doc})
+            exit({open_ok, Key, {ok, Doc}});
+        Else ->
+            exit({open_ok, Key, Else})
     catch
-        error:database_not_found ->
-            exit({ddoc_error, Key, database_not_found});
-        _Type:Reason ->
-            exit({ddoc_error, Key, Reason})
+        Type:Reason ->
+            exit({open_error, Key, Type, Reason})
     end.
 
 

Reply via email to