From 9fd3a58a0f1965c84588f4b4c778b609be54fe10 Mon Sep 17 00:00:00 2001 From: Serge Tupchii Date: Wed, 27 Mar 2024 20:02:17 +0200 Subject: [PATCH] feat: add API to disable/enable auto clustering The API can be used to prevent a node from re-joining the same cluster after it has (manually) left the cluster. --- rebar.config | 2 +- src/ekka.erl | 15 +++++++++++++++ src/ekka_autocluster.erl | 17 ++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/rebar.config b/rebar.config index d69dfae..bb1921f 100644 --- a/rebar.config +++ b/rebar.config @@ -4,7 +4,7 @@ {deps, [{jiffy, {git, "https://github.com/emqx/jiffy", {tag, "1.0.5"}}}, {eetcd, {git, "https://github.com/zhongwencool/eetcd", {tag, "v0.3.4"}}}, {snabbkaffe, {git, "https://github.com/kafka4beam/snabbkaffe", {tag, "1.0.0"}}}, - {mria, {git, "https://github.com/emqx/mria", {tag, "0.8.4"}}} + {mria, {git, "https://github.com/emqx/mria", {tag, "0.8.5"}}} ]}. {erl_opts, [warn_unused_vars, diff --git a/src/ekka.erl b/src/ekka.erl index f3b3931..310da2d 100644 --- a/src/ekka.erl +++ b/src/ekka.erl @@ -38,6 +38,9 @@ %% Autocluster API -export([ autocluster/0 , autocluster/1 + , autocluster_enabled/0 + , enable_autocluster/0 + , disable_autocluster/0 ]). %% Callbacks @@ -169,6 +172,18 @@ autocluster(App) -> false -> ok end. +autocluster_enabled() -> + env(cluster_enable, true) andalso ekka_autocluster:configured(). + +disable_autocluster() -> + ok = application:set_env(ekka, cluster_enable, false), + ok = mria:disable_core_node_discovery(), + ok = ekka_autocluster:stop(disabled). + +enable_autocluster() -> + ok = application:set_env(ekka, cluster_enable, true), + ok = mria:enable_core_node_discovery(). + %%-------------------------------------------------------------------- %% Callbacks %%-------------------------------------------------------------------- diff --git a/src/ekka_autocluster.erl b/src/ekka_autocluster.erl index f82c58c..de9f8d2 100644 --- a/src/ekka_autocluster.erl +++ b/src/ekka_autocluster.erl @@ -23,9 +23,11 @@ %% API -export([ enabled/0 + , configured/0 , run/1 , unregister_node/0 , core_node_discovery_callback/0 + , stop/1 ]). %% gen_server callbacks @@ -49,9 +51,13 @@ -spec enabled() -> boolean(). enabled() -> + configured() andalso mria_config:role() =:= core. + +-spec configured() -> boolean(). +configured() -> case ekka:env(cluster_discovery) of {ok, {manual, _}} -> false; - {ok, _Strategy} -> mria_config:role() =:= core; + {ok, _Strategy} -> true; undefined -> false end. @@ -74,6 +80,15 @@ unregister_node() -> log_error("Unregister", ekka_cluster_strategy:unregister(Mod, Options)) end). +-spec stop(term()) -> ok. +stop(Reason) -> + try + gen_server:stop(?SERVER, {shutdown, Reason}, 5000) + catch + _:noproc -> + ok + end. + %% @doc Core node discovery used by mria by replicant nodes to find %% the core nodes. -spec core_node_discovery_callback() -> [node()].