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