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>.