diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2017-05-30 13:30:20 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2017-05-30 13:30:20 -0500 |
commit | 68c3008b8909c53d610ee839593b60c0912b636f (patch) | |
tree | 3eede33edee22152ff5fe1d02fca943627670bd3 | |
parent | 0d8a45f19a8002e5760b171270bc4ce5d7910a06 (diff) | |
download | couchdb-68c3008b8909c53d610ee839593b60c0912b636f.tar.gz |
Add error and test for invalid engine
-rw-r--r-- | src/couch/src/couch_server.erl | 68 | ||||
-rw-r--r-- | 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 986cc343c..1ad033411 100644 --- a/src/couch/src/couch_server.erl +++ b/src/couch/src/couch_server.erl @@ -437,7 +437,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} @@ -457,28 +457,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} @@ -510,7 +514,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 -> @@ -617,12 +621,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) @@ -639,7 +643,7 @@ get_engine(Server, DbName) -> [] -> get_default_engine(Server, DbName); [Engine] -> - Engine; + {ok, Engine}; _ -> erlang:error(engine_conflict) end. @@ -667,17 +671,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 c52b3f6b0..a79f20f9b 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!">>}}). |