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),