You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2024/10/31 16:57:56 UTC
(couchdb) branch tollerate-js-engine-mistakes created (now df6b2ccd8)
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a change to branch tollerate-js-engine-mistakes
in repository https://gitbox.apache.org/repos/asf/couchdb.git
at df6b2ccd8 Do not crash the server on invalid js_engine setting
This branch includes the following new commits:
new df6b2ccd8 Do not crash the server on invalid js_engine setting
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(couchdb) 01/01: Do not crash the server on invalid js_engine setting
Posted by va...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch tollerate-js-engine-mistakes
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit df6b2ccd8a52644d8ba6323a31ffb87b9312b3e0
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Thu Oct 31 12:47:07 2024 -0400
Do not crash the server on invalid js_engine setting
In the previous PR [1] Jessica had discovered that an invalid engine setting
crashes the server. Initially I had thought we would be strict about it and just
let it crash, but that seems a bit harsh for this. Especially if there is a
large cluster and configuration is pushed to all nodes. It would crash the
whole cluster.
Instead, since we have a default, stick with that. Especially now users can
validate if a non-default js_engine is active from the welcome endpoint.
[1] https://github.com/apache/couchdb/pull/5327
---
src/couch/src/couch_server.erl | 8 +++++++-
src/couch_quickjs/test/couch_quickjs_tests.erl | 23 ++++++++++++++++++++++-
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl
index 8f36f1c7f..ca12a56fa 100644
--- a/src/couch/src/couch_server.erl
+++ b/src/couch/src/couch_server.erl
@@ -42,6 +42,7 @@
-define(MAX_DBS_OPEN, 500).
-define(RELISTEN_DELAY, 5000).
-define(DEFAULT_ENGINE, "couch").
+-define(AVAILABLE_JS_ENGINES, ["spidermonkey", "quickjs"]).
-record(server, {
root_dir = [],
@@ -92,7 +93,12 @@ get_stats() ->
[{start_time, ?l2b(Time)}, {dbs_open, Open}].
get_js_engine() ->
- list_to_binary(config:get("couchdb", "js_engine", ?COUCHDB_JS_ENGINE)).
+ Engine = config:get("couchdb", "js_engine", ?COUCHDB_JS_ENGINE),
+ % If user misconfigured it by accident, don't crash, use defaults
+ case lists:member(Engine, ?AVAILABLE_JS_ENGINES) of
+ true -> list_to_binary(Engine);
+ false -> list_to_binary(?COUCHDB_JS_ENGINE)
+ end.
get_spidermonkey_version() -> list_to_binary(?COUCHDB_SPIDERMONKEY_VERSION).
diff --git a/src/couch_quickjs/test/couch_quickjs_tests.erl b/src/couch_quickjs/test/couch_quickjs_tests.erl
index 200586c10..6126e64d6 100644
--- a/src/couch_quickjs/test/couch_quickjs_tests.erl
+++ b/src/couch_quickjs/test/couch_quickjs_tests.erl
@@ -33,7 +33,8 @@ quickjs_test_() ->
?TDEF_FE(t_get_coffee_cmd),
?TDEF_FE(t_can_configure_memory_limit),
?TDEF_FE(t_bad_memory_limit),
- ?TDEF_FE(t_couch_jsengine_config_triggers_proc_server_reload)
+ ?TDEF_FE(t_couch_jsengine_config_triggers_proc_server_reload),
+ ?TDEF_FE(t_invalid_jsengine_config)
]
}.
@@ -93,6 +94,26 @@ t_couch_jsengine_config_triggers_proc_server_reload(_) ->
?assertEqual(OldVal, get_proc_manager_default_js())
end.
+t_invalid_jsengine_config(_) ->
+ config:delete("couchdb", "js_engine", false),
+ Default = couch_server:get_js_engine(),
+ ProcManagerPid = whereis(couch_proc_manager),
+ ?assert(is_process_alive(ProcManagerPid)),
+ % Try invalid settings
+ config:set("couchdb", "js_engine", "non_existent_test_engine", false),
+ % Wait to make sure couch_proc_manager hasn't crashed
+ timer:sleep(100),
+ ?assertEqual(ProcManagerPid, whereis(couch_proc_manager)),
+ ?assertEqual(Default, couch_server:get_js_engine()),
+ % Use valid settings
+ config:set("couchdb", "js_engine", "spidermonkey", false),
+ ?assertEqual(<<"spidermonkey">>, couch_server:get_js_engine()),
+ config:set("couchdb", "js_engine", "quickjs", false),
+ ?assertEqual(<<"quickjs">>, couch_server:get_js_engine()),
+ % Return back to the defaults by deleting the config
+ config:delete("couchdb", "js_engine", false),
+ ?assertEqual(Default, couch_server:get_js_engine()).
+
os_cmd(Cmd) ->
Opts = [stream, {line, 4096}, binary, exit_status, hide],
Port = open_port({spawn, Cmd}, Opts),