rabbitmq-server/deps/rabbit/src/rabbit_db_cluster.erl

151 lines
4.4 KiB
Erlang

%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2007-2023 VMware, Inc. or its affiliates. All rights reserved.
%%
-module(rabbit_db_cluster).
-include_lib("kernel/include/logger.hrl").
-include_lib("stdlib/include/assert.hrl").
-include_lib("rabbit_common/include/logging.hrl").
-export([join/2,
forget_member/2]).
-export([change_node_type/1]).
-export([is_clustered/0,
members/0,
disc_members/0,
node_type/0,
check_consistency/0,
cli_cluster_status/0]).
-type node_type() :: disc_node_type() | ram_node_type().
-type disc_node_type() :: disc.
-type ram_node_type() :: ram.
-export_type([node_type/0, disc_node_type/0, ram_node_type/0]).
-define(
IS_NODE_TYPE(NodeType),
((NodeType) =:= disc orelse (NodeType) =:= ram)).
%% -------------------------------------------------------------------
%% Cluster formation.
%% -------------------------------------------------------------------
-spec join(RemoteNode, NodeType) -> Ret when
RemoteNode :: node(),
NodeType :: rabbit_db_cluster:node_type(),
Ret :: Ok | Error,
Ok :: ok | {ok, already_member},
Error :: {error, {inconsistent_cluster, string()}}.
%% @doc Adds this node to a cluster using `RemoteNode' to reach it.
join(RemoteNode, NodeType)
when is_atom(RemoteNode) andalso ?IS_NODE_TYPE(NodeType) ->
?LOG_DEBUG(
"DB: joining cluster using remote node `~ts`", [RemoteNode],
#{domain => ?RMQLOG_DOMAIN_DB}),
join_using_mnesia(RemoteNode, NodeType).
join_using_mnesia(RemoteNode, NodeType) ->
rabbit_mnesia:join_cluster(RemoteNode, NodeType).
-spec forget_member(Node, RemoveWhenOffline) -> ok when
Node :: node(),
RemoveWhenOffline :: boolean().
%% @doc Removes `Node' from the cluster.
forget_member(Node, RemoveWhenOffline) ->
forget_member_using_mnesia(Node, RemoveWhenOffline).
forget_member_using_mnesia(Node, RemoveWhenOffline) ->
rabbit_mnesia:forget_cluster_node(Node, RemoveWhenOffline).
%% -------------------------------------------------------------------
%% Cluster update.
%% -------------------------------------------------------------------
-spec change_node_type(NodeType) -> ok when
NodeType :: rabbit_db_cluster:node_type().
%% @doc Changes the node type to `NodeType'.
%%
%% Node types may not all be valid with all databases.
change_node_type(NodeType) ->
change_node_type_using_mnesia(NodeType).
change_node_type_using_mnesia(NodeType) ->
rabbit_mnesia:change_cluster_node_type(NodeType).
%% -------------------------------------------------------------------
%% Cluster status.
%% -------------------------------------------------------------------
-spec is_clustered() -> IsClustered when
IsClustered :: boolean().
%% @doc Indicates if this node is clustered with other nodes or not.
is_clustered() ->
is_clustered_using_mnesia().
is_clustered_using_mnesia() ->
rabbit_mnesia:is_clustered().
-spec members() -> Members when
Members :: [node()].
%% @doc Returns the list of cluster members.
members() ->
members_using_mnesia().
members_using_mnesia() ->
mnesia:system_info(db_nodes).
-spec disc_members() -> Members when
Members :: [node()].
%% @private
disc_members() ->
disc_members_using_mnesia().
disc_members_using_mnesia() ->
rabbit_mnesia:cluster_nodes(disc).
-spec node_type() -> NodeType when
NodeType :: rabbit_db_cluster:node_type().
%% @doc Returns the type of this node, `disc' or `ram'.
%%
%% Node types may not all be relevant with all databases.
node_type() ->
node_type_using_mnesia().
node_type_using_mnesia() ->
rabbit_mnesia:node_type().
-spec check_consistency() -> ok.
%% @doc Ensures the cluster is consistent.
check_consistency() ->
check_consistency_using_mnesia().
check_consistency_using_mnesia() ->
rabbit_mnesia:check_cluster_consistency().
-spec cli_cluster_status() -> ClusterStatus when
ClusterStatus :: [{nodes, [{rabbit_db_cluster:node_type(), [node()]}]} |
{running_nodes, [node()]} |
{partitions, [{node(), [node()]}]}].
%% @doc Returns information from the cluster for the `cluster_status' CLI
%% command.
cli_cluster_status() ->
cli_cluster_status_using_mnesia().
cli_cluster_status_using_mnesia() ->
rabbit_mnesia:status().