151 lines
4.4 KiB
Erlang
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().
|