You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2017/09/12 20:09:01 UTC

[couchdb] 18/28: Add error and test for invalid engine

This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch COUCHDB-3287-pluggable-storage-engines
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit f1dc55e6f7f6e2d529a101a4dbc508e27951122e
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Tue May 30 13:30:20 2017 -0500

    Add error and test for invalid engine
---
 src/couch/src/couch_server.erl        | 68 ++++++++++++++++++-----------------
 src/couch/test/couch_server_tests.erl | 16 +++++++++
 2 files changed, 52 insertions(+), 32 deletions(-)

diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl
index c1d2aec..5f0be20 100644
--- a/src/couch/src/couch_server.erl
+++ b/src/couch/src/couch_server.erl
@@ -447,7 +447,7 @@ handle_call({open, DbName, Options}, From, Server) ->
         ok ->
             case make_room(Server, Options) of
             {ok, Server2} ->
-                Engine = get_engine(Server2, DbNameList),
+                {ok, Engine} = get_engine(Server2, DbNameList),
                 {noreply, open_async(Server2, From, DbName, Engine, Options)};
             CloseError ->
                 {reply, CloseError, Server}
@@ -467,28 +467,32 @@ handle_call({open, DbName, Options}, From, Server) ->
     end;
 handle_call({create, DbName, Options}, From, Server) ->
     DbNameList = binary_to_list(DbName),
-    Engine = get_engine(Server, DbNameList, Options),
-    case check_dbname(Server, DbNameList) of
-    ok ->
-        case ets:lookup(couch_dbs, DbName) of
-        [] ->
-            case make_room(Server, Options) of
-            {ok, Server2} ->
-                {noreply, open_async(Server2, From, DbName, Engine,
-                        [create | Options])};
-            CloseError ->
-                {reply, CloseError, Server}
+    case get_engine(Server, DbNameList, Options) of
+    {ok, Engine} ->
+        case check_dbname(Server, DbNameList) of
+        ok ->
+            case ets:lookup(couch_dbs, DbName) of
+            [] ->
+                case make_room(Server, Options) of
+                {ok, Server2} ->
+                    {noreply, open_async(Server2, From, DbName, Engine,
+                            [create | Options])};
+                CloseError ->
+                    {reply, CloseError, Server}
+                end;
+            [#entry{req_type = open} = Entry] ->
+                % We're trying to create a database while someone is in
+                % the middle of trying to open it. We allow one creator
+                % to wait while we figure out if it'll succeed.
+                CrOptions = [create | Options],
+                Req = {create, DbName, Engine, CrOptions, From},
+                true = ets:insert(couch_dbs, Entry#entry{req_type = Req}),
+                {noreply, Server};
+            [_AlreadyRunningDb] ->
+                {reply, file_exists, Server}
             end;
-        [#entry{req_type = open} = Entry] ->
-            % We're trying to create a database while someone is in
-            % the middle of trying to open it. We allow one creator
-            % to wait while we figure out if it'll succeed.
-            CrOptions = [create | Options],
-            Req = {create, DbName, Engine, CrOptions, From},
-            true = ets:insert(couch_dbs, Entry#entry{req_type = Req}),
-            {noreply, Server};
-        [_AlreadyRunningDb] ->
-            {reply, file_exists, Server}
+        Error ->
+            {reply, Error, Server}
         end;
     Error ->
         {reply, Error, Server}
@@ -520,7 +524,7 @@ handle_call({delete, DbName, Options}, _From, Server) ->
         % Make sure and remove all compaction data
         delete_compaction_files(DbNameList, DelOpt),
 
-        {Engine, FilePath} = get_engine(Server, DbNameList),
+        {ok, {Engine, FilePath}} = get_engine(Server, DbNameList),
         RootDir = Server#server.root_dir,
         case couch_db_engine:delete(Engine, RootDir, FilePath, DelOpt) of
         ok ->
@@ -647,12 +651,12 @@ get_engine(Server, DbName, Options) ->
     case couch_util:get_value(engine, Options) of
         Ext when is_binary(Ext) ->
             ExtStr = binary_to_list(Ext),
-            case couch_util:get_value(ExtStr, Engines) of
-                Engine when is_atom(Engine) ->
+            case lists:keyfind(ExtStr, 1, Engines) of
+                {ExtStr, Engine} ->
                     Path = make_filepath(RootDir, DbName, ExtStr),
-                    {Engine, Path};
-                _ ->
-                    get_engine(Server, DbName)
+                    {ok, {Engine, Path}};
+                false ->
+                    {error, {invalid_engine_extension, Ext}}
             end;
         _ ->
             get_engine(Server, DbName)
@@ -669,7 +673,7 @@ get_engine(Server, DbName) ->
         [] ->
             get_default_engine(Server, DbName);
         [Engine] ->
-            Engine;
+            {ok, Engine};
         _ ->
             erlang:error(engine_conflict)
     end.
@@ -697,17 +701,17 @@ get_default_engine(Server, DbName) ->
         Extension when is_list(Extension) ->
             case lists:keyfind(Extension, 1, Engines) of
                 {Extension, Module} ->
-                    {Module, make_filepath(RootDir, DbName, Extension)};
+                    {ok, {Module, make_filepath(RootDir, DbName, Extension)}};
                 false ->
                     Fmt = "Invalid storage engine extension ~s,"
                             " configured engine extensions are: ~s",
                     Exts = [E || {E, _} <- Engines],
                     Args = [Extension, string:join(Exts, ", ")],
                     couch_log:error(Fmt, Args),
-                    Default
+                    {ok, Default}
             end;
         _ ->
-            Default
+            {ok, Default}
     end.
 
 
diff --git a/src/couch/test/couch_server_tests.erl b/src/couch/test/couch_server_tests.erl
index c52b3f6..a79f20f 100644
--- a/src/couch/test/couch_server_tests.erl
+++ b/src/couch/test/couch_server_tests.erl
@@ -89,3 +89,19 @@ should_delete(_, Db) ->
 
 deleted_files(ViewFile) ->
     filelib:wildcard(filename:rootname(ViewFile) ++ "*.deleted.*").
+
+
+bad_engine_option_test_() ->
+    {
+        setup,
+        fun start/0,
+        fun test_util:stop/1,
+        [
+            fun t_bad_engine_option/0
+        ]
+    }.
+
+
+t_bad_engine_option() ->
+    Resp = couch_server:create(?tempdb(), [{engine, <<"cowabunga!">>}]),
+    ?assertEqual(Resp, {error, {invalid_engine_extension, <<"cowabunga!">>}}).

-- 
To stop receiving notification emails like this one, please contact
"commits@couchdb.apache.org" <co...@couchdb.apache.org>.