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

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit fd2f47b806edb315a639193584eeb8e48c23dd21
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Wed Jan 14 17:09:36 2026 -0500

    Stop scanner plugins if upgrade_in_progress is set
    
    Use the new upgrade_in_progress config to pause scanner plugins when cluster
    upgrades happen.
---
 src/couch_scanner/src/couch_scanner_server.erl      |  5 ++++-
 src/couch_scanner/test/eunit/couch_scanner_test.erl | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/couch_scanner/src/couch_scanner_server.erl 
b/src/couch_scanner/src/couch_scanner_server.erl
index 2ec1ac540..ecb7e73f0 100644
--- a/src/couch_scanner/src/couch_scanner_server.erl
+++ b/src/couch_scanner/src/couch_scanner_server.erl
@@ -177,7 +177,7 @@ stop_in_maintenance(#st{pids = Pids} = St) ->
     end.
 
 start_stop(#st{stopped = Stopped} = St) ->
-    case in_maintenance() orelse Stopped of
+    case in_maintenance() orelse Stopped orelse upgrade_in_progress() of
         true -> stop_in_maintenance(St);
         false -> start_stop_cfg(St)
     end.
@@ -279,6 +279,9 @@ penalize(Now, #sched{error_count = ErrorCount} = Sched) ->
 in_maintenance() ->
     "false" /= config:get("couchdb", "maintenance_mode", "false").
 
+upgrade_in_progress() ->
+    config:get_boolean("couchdb", "upgrade_in_progress", false).
+
 tsec() ->
     erlang:system_time(second).
 
diff --git a/src/couch_scanner/test/eunit/couch_scanner_test.erl 
b/src/couch_scanner/test/eunit/couch_scanner_test.erl
index b4a56e818..9cce06f38 100644
--- a/src/couch_scanner/test/eunit/couch_scanner_test.erl
+++ b/src/couch_scanner/test/eunit/couch_scanner_test.erl
@@ -24,6 +24,7 @@ couch_scanner_test_() ->
             ?TDEF_FE(t_top_level_api),
             ?TDEF_FE(t_start_stop),
             ?TDEF_FE(t_start_stop_mm_mode, 10),
+            ?TDEF_FE(t_start_stop_upgrade_in_progress, 10),
             ?TDEF_FE(t_stop_auto_purge_on_dead_nodes, 10),
             ?TDEF_FE(t_run_through_all_callbacks_basic, 10),
             ?TDEF_FE(t_find_reporting_works, 10),
@@ -107,6 +108,7 @@ setup() ->
 
 teardown({Ctx, {DbName1, DbName2, DbName3}}) ->
     config:delete("couchdb", "maintenance_mode", false),
+    config:delete("couchdb", "upgrade_in_progress", false),
     config_delete_section("couch_scanner"),
     config_delete_section("couch_scanner_plugins"),
     config_delete_section(atom_to_list(?FEATURES_PLUGIN)),
@@ -162,6 +164,22 @@ t_start_stop_mm_mode(_) ->
     ?assertMatch(#{<<"couch_scanner_plugin_find">> := Pid} when is_pid(Pid), 
Pids2),
     ?assertEqual(ok, couch_scanner:stop()).
 
+t_start_stop_upgrade_in_progress(_) ->
+    ?assertEqual(ok, couch_scanner:stop()),
+    Plugin = atom_to_list(?FIND_PLUGIN),
+    config:set("couch_scanner_plugins", Plugin, "true", false),
+    meck:expect(?FIND_PLUGIN, shards, fun(_, _) -> timer:sleep(10000) end),
+    config:set("couchdb", "upgrade_in_progress", "true", true),
+    ?assertEqual(ok, couch_scanner:resume()),
+    #{pids := Pids1, stopped := false} = couch_scanner:status(),
+    ?assertEqual(#{}, Pids1),
+    config:set("couchdb", "upgrade_in_progress", "false", true),
+    ?assertEqual(ok, couch_scanner:stop()),
+    ?assertEqual(ok, couch_scanner:resume()),
+    #{pids := Pids2, stopped := false} = couch_scanner:status(),
+    ?assertMatch(#{<<"couch_scanner_plugin_find">> := Pid} when is_pid(Pid), 
Pids2),
+    ?assertEqual(ok, couch_scanner:stop()).
+
 t_stop_auto_purge_on_dead_nodes(_) ->
     meck:reset(couch_scanner_server),
     meck:reset(couch_scanner_util),

Reply via email to