summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2020-01-30 17:25:53 +0300
committerMichael Klishin <michael@clojurewerkz.org>2020-01-30 17:25:53 +0300
commit91b3a783bfc227f67969c251fd8c74216c11d435 (patch)
treec748c72b2839ce516d1fc587b09b0ac9b249b704
parentd621ec907a4b7f33e85e4bc61f10d1c6e1ef0601 (diff)
downloadrabbitmq-server-git-91b3a783bfc227f67969c251fd8c74216c11d435.tar.gz
Introduce a persistent internal cluster ID
That the operator cannot and are not supposed to control. The ID is cluster-wide and stored as a global runtime parameter to make sure it is replicated across all nodes. It is intentionally excluded from imported definitions because it is not meant to be reused. This ID would be useful in several features/plugins under development.
-rw-r--r--src/rabbit_definitions.erl13
-rw-r--r--src/rabbit_nodes.erl43
-rw-r--r--test/clustering_management_SUITE.erl19
3 files changed, 64 insertions, 11 deletions
diff --git a/src/rabbit_definitions.erl b/src/rabbit_definitions.erl
index 8c70b5aa6c..1923e2947e 100644
--- a/src/rabbit_definitions.erl
+++ b/src/rabbit_definitions.erl
@@ -27,7 +27,8 @@
-export([
list_users/0, list_vhosts/0, list_permissions/0, list_topic_permissions/0,
list_runtime_parameters/0, list_global_runtime_parameters/0, list_policies/0,
- list_exchanges/0, list_queues/0, list_bindings/0
+ list_exchanges/0, list_queues/0, list_bindings/0,
+ is_internal_parameter/1
]).
-export([decode/1, decode/2, args/1]).
@@ -677,12 +678,20 @@ runtime_parameter_definition(Param) ->
}.
list_global_runtime_parameters() ->
- [global_runtime_parameter_definition(P) || P <- rabbit_runtime_parameters:list_global()].
+ [global_runtime_parameter_definition(P) || P <- rabbit_runtime_parameters:list_global(), not is_internal_parameter(P)].
global_runtime_parameter_definition(P0) ->
P = [{rabbit_data_coercion:to_binary(K), V} || {K, V} <- P0],
maps:from_list(P).
+-define(INTERNAL_GLOBAL_PARAM_PREFIX, "internal").
+
+is_internal_parameter(Param) ->
+ Name = rabbit_data_coercion:to_list(pget(name, Param)),
+ %% if global parameter name starts with an "internal", consider it to be internal
+ %% and exclude it from definition export
+ string:left(Name, length(?INTERNAL_GLOBAL_PARAM_PREFIX)) =:= ?INTERNAL_GLOBAL_PARAM_PREFIX.
+
list_policies() ->
[policy_definition(P) || P <- rabbit_policy:list()].
diff --git a/src/rabbit_nodes.erl b/src/rabbit_nodes.erl
index 3d499c8a0b..6a03e74adf 100644
--- a/src/rabbit_nodes.erl
+++ b/src/rabbit_nodes.erl
@@ -23,23 +23,22 @@
all_running/0, name_type/0, running_count/0,
await_running_count/2,
boot/0]).
+-export([persistent_cluster_id/0, seed_internal_cluster_id/0, seed_user_provided_cluster_name/0]).
-include_lib("kernel/include/inet.hrl").
-include_lib("rabbit_common/include/rabbit.hrl").
-define(SAMPLING_INTERVAL, 1000).
+-define(INTERNAL_CLUSTER_ID_PARAM_NAME, internal_cluster_id).
+
%%----------------------------------------------------------------------------
%% API
%%----------------------------------------------------------------------------
boot() ->
- case application:get_env(rabbit, cluster_name) of
- undefined -> ok;
- {ok, Name} ->
- rabbit_log:info("Setting cluster name to '~s' as configured", [Name]),
- set_cluster_name(rabbit_data_coercion:to_binary(Name))
- end.
+ seed_internal_cluster_id(),
+ seed_user_provided_cluster_name().
name_type() ->
case os:getenv("RABBITMQ_USE_LONGNAME") of
@@ -90,6 +89,38 @@ cluster_name_default() ->
FQDN = rabbit_net:hostname(),
list_to_binary(atom_to_list(make({ID, FQDN}))).
+-spec persistent_cluster_id() -> binary().
+persistent_cluster_id() ->
+ case rabbit_runtime_parameters:lookup_global(?INTERNAL_CLUSTER_ID_PARAM_NAME) of
+ not_found ->
+ seed_internal_cluster_id(),
+ persistent_cluster_id();
+ Param ->
+ #{value := Val, name := ?INTERNAL_CLUSTER_ID_PARAM_NAME} = maps:from_list(Param),
+ Val
+ end.
+
+-spec seed_internal_cluster_id() -> binary().
+seed_internal_cluster_id() ->
+ case rabbit_runtime_parameters:lookup_global(?INTERNAL_CLUSTER_ID_PARAM_NAME) of
+ not_found ->
+ Id = rabbit_guid:binary(rabbit_guid:gen(), "rabbitmq-cluster-id"),
+ rabbit_log:info("Seeding internal cluster ID to '~p'", [Id]),
+ rabbit_runtime_parameters:set_global(?INTERNAL_CLUSTER_ID_PARAM_NAME, Id, ?INTERNAL_USER),
+ Id;
+ Param ->
+ #{value := Val, name := ?INTERNAL_CLUSTER_ID_PARAM_NAME} = maps:from_list(Param),
+ Val
+ end.
+
+seed_user_provided_cluster_name() ->
+ case application:get_env(rabbit, cluster_name) of
+ undefined -> ok;
+ {ok, Name} ->
+ rabbit_log:info("Setting cluster name to '~s' as configured", [Name]),
+ set_cluster_name(rabbit_data_coercion:to_binary(Name))
+ end.
+
-spec set_cluster_name(binary()) -> 'ok'.
set_cluster_name(Name) ->
diff --git a/test/clustering_management_SUITE.erl b/test/clustering_management_SUITE.erl
index 8566b23130..43029153b0 100644
--- a/test/clustering_management_SUITE.erl
+++ b/test/clustering_management_SUITE.erl
@@ -56,7 +56,8 @@ groups() ->
status_with_alarm,
pid_file_and_await_node_startup,
await_running_count,
- start_with_invalid_schema_in_path
+ start_with_invalid_schema_in_path,
+ persistent_cluster_id
]},
{cluster_size_4, [], [
forget_promotes_offline_slave
@@ -120,10 +121,9 @@ end_per_testcase(Testcase, Config) ->
rabbit_ct_helpers:testcase_finished(Config1, Testcase).
%% -------------------------------------------------------------------
-%% Testcases.
+%% Test cases
%% -------------------------------------------------------------------
-
start_with_invalid_schema_in_path(Config) ->
[Rabbit, Hare] = cluster_members(Config),
stop_app(Rabbit),
@@ -137,6 +137,19 @@ start_with_invalid_schema_in_path(Config) ->
ErrRabbit -> error({unable_to_start_with_bad_schema_in_work_dir, ErrRabbit})
end.
+persistent_cluster_id(Config) ->
+ [Rabbit, Hare] = cluster_members(Config),
+ ClusterIDA1 = rpc:call(Rabbit, rabbit_nodes, persistent_cluster_id, []),
+ ClusterIDB1 = rpc:call(Hare, rabbit_nodes, persistent_cluster_id, []),
+ ?assertEqual(ClusterIDA1, ClusterIDB1),
+
+ rabbit_ct_broker_helpers:restart_node(Config, Rabbit),
+ ClusterIDA2 = rpc:call(Rabbit, rabbit_nodes, persistent_cluster_id, []),
+ rabbit_ct_broker_helpers:restart_node(Config, Hare),
+ ClusterIDB2 = rpc:call(Hare, rabbit_nodes, persistent_cluster_id, []),
+ ?assertEqual(ClusterIDA1, ClusterIDA2),
+ ?assertEqual(ClusterIDA2, ClusterIDB2).
+
create_bad_schema(Rabbit, Hare, Config) ->
{ok, RabbitMnesiaDir} = rpc:call(Rabbit, application, get_env, [mnesia, dir]),