Skip to content

Commit 3f0d187

Browse files
committed
rabbit_db: Add init/0, is_virgin_node/0, dir/0 and ensure_dir_exists/0 functions
These functions sit on top of their equivalent in `rabbit_mnesia`. In the future, they will take care of picking the right database layer, whatever it is. The start of `mnesia_sync` is now part of this initialization instead of a separate boot step in `rabbit` because it is specific to our use of Mnesia. In addition, `rabbit_db` provides `is_virgin_node/1` to query the state of a remote node. This is used by `rabbit_ff_controller` in the feature flags subsystem. At this point, the underlying equivalent functions in `rabbit_mnesia` become private to this module (and other modules implementing the interaction with Mnesia). Other parts of RabbitMQ, including plugins, should now use `rabbit_db`, not `rabbit_mnesia`.
1 parent 8788e65 commit 3f0d187

File tree

5 files changed

+115
-24
lines changed

5 files changed

+115
-24
lines changed

deps/rabbit/src/rabbit.erl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,10 @@
6464
{enables, external_infrastructure}]}).
6565

6666
-rabbit_boot_step({database,
67-
[{mfa, {rabbit_mnesia, init, []}},
67+
[{mfa, {rabbit_db, init, []}},
6868
{requires, file_handle_cache},
6969
{enables, external_infrastructure}]}).
7070

71-
-rabbit_boot_step({database_sync,
72-
[{description, "database sync"},
73-
{mfa, {rabbit_sup, start_child, [mnesia_sync]}},
74-
{requires, database},
75-
{enables, external_infrastructure}]}).
76-
7771
-rabbit_boot_step({networking_metadata_store,
7872
[{description, "networking infrastructure"},
7973
{mfa, {rabbit_sup, start_child, [rabbit_networking_store]}},
@@ -1113,7 +1107,6 @@ get_default_data_param(Param) ->
11131107

11141108
data_dir() ->
11151109
{ok, DataDir} = application:get_env(rabbit, data_dir),
1116-
?assertEqual(DataDir, rabbit_mnesia:dir()),
11171110
DataDir.
11181111

11191112
%%---------------------------------------------------------------------------

deps/rabbit/src/rabbit_db.erl

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,114 @@
1010
-include_lib("kernel/include/logger.hrl").
1111
-include_lib("stdlib/include/assert.hrl").
1212

13+
-include_lib("rabbit_common/include/logging.hrl").
14+
15+
-export([init/0,
16+
is_virgin_node/0, is_virgin_node/1,
17+
dir/0,
18+
ensure_dir_exists/0]).
1319
-export([run/1]).
1420

21+
%% Default timeout for operations on remote nodes.
22+
-define(TIMEOUT, 60000).
23+
24+
%% -------------------------------------------------------------------
25+
%% DB initialization.
26+
%% -------------------------------------------------------------------
27+
28+
-spec init() -> Ret when
29+
Ret :: ok | {error, any()}.
30+
%% @doc Initializes the DB layer.
31+
32+
init() ->
33+
IsVirgin = is_virgin_node(),
34+
?LOG_DEBUG(
35+
"DB: this node is virgin: ~ts", [IsVirgin],
36+
#{domain => ?RMQLOG_DOMAIN_DB}),
37+
ensure_dir_exists(),
38+
case init_mnesia() of
39+
ok ->
40+
?LOG_DEBUG(
41+
"DB: initialization successeful",
42+
#{domain => ?RMQLOG_DOMAIN_DB}),
43+
ok;
44+
Error ->
45+
?LOG_DEBUG(
46+
"DB: initialization failed: ~0p", [Error],
47+
#{domain => ?RMQLOG_DOMAIN_DB}),
48+
Error
49+
end.
50+
51+
init_mnesia() ->
52+
?LOG_DEBUG(
53+
"DB: initialize Mnesia",
54+
#{domain => ?RMQLOG_DOMAIN_DB}),
55+
ok = rabbit_mnesia:init(),
56+
?assertEqual(rabbit:data_dir(), mnesia_dir()),
57+
rabbit_sup:start_child(mnesia_sync).
58+
59+
-spec is_virgin_node() -> IsVirgin when
60+
IsVirgin :: boolean().
61+
%% @doc Indicates if this RabbitMQ node is virgin.
62+
%%
63+
%% @returns `true' if the node is virgin, `false' if it is not.
64+
%%
65+
%% @see is_virgin_node/1.
66+
67+
is_virgin_node() ->
68+
ThisNode = node(),
69+
is_virgin_node(ThisNode).
70+
71+
-spec is_virgin_node(Node) -> IsVirgin | undefined when
72+
Node :: node(),
73+
IsVirgin :: boolean().
74+
%% @doc Indicates if the given RabbitMQ node is virgin.
75+
%%
76+
%% A virgin node is a node starting for the first time. It could be a brand
77+
%% new node or a node having been reset.
78+
%%
79+
%% @returns `true' if the node is virgin, `false' if it is not, or `undefined'
80+
%% if the given node is remote and we couldn't determine it.
81+
82+
is_virgin_node(Node) when is_atom(Node) ->
83+
is_virgin_node_with_mnesia(Node).
84+
85+
is_virgin_node_with_mnesia(Node) when Node =:= node() ->
86+
rabbit_mnesia:is_virgin_node();
87+
is_virgin_node_with_mnesia(Node) ->
88+
try
89+
erpc:call(Node, rabbit_mnesia, is_virgin_node, [], ?TIMEOUT)
90+
catch
91+
_:_ ->
92+
undefined
93+
end.
94+
95+
-spec dir() -> DBDir when
96+
DBDir :: file:filename().
97+
%% @doc Returns the directory where the database stores its data.
98+
%%
99+
%% @returns the directory path.
100+
101+
dir() ->
102+
mnesia_dir().
103+
104+
mnesia_dir() ->
105+
rabbit_mnesia:dir().
106+
107+
-spec ensure_dir_exists() -> ok | no_return().
108+
%% @doc Ensures the database directory exists.
109+
%%
110+
%% @returns `ok' if it exists or throws an exception if it does not.
111+
112+
ensure_dir_exists() ->
113+
DBDir = dir() ++ "/",
114+
case filelib:ensure_dir(DBDir) of
115+
ok ->
116+
ok;
117+
{error, Reason} ->
118+
throw({error, {cannot_create_db_dir, DBDir, Reason}})
119+
end.
120+
15121
%% -------------------------------------------------------------------
16122
%% run().
17123
%% -------------------------------------------------------------------

deps/rabbit/src/rabbit_ff_controller.erl

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ check_required_and_enable(
762762
VirginNodesWhereDisabled =
763763
lists:filter(
764764
fun(Node) ->
765-
case is_virgin_node(Node) of
765+
case rabbit_db:is_virgin_node(Node) of
766766
IsVirgin when is_boolean(IsVirgin) ->
767767
IsVirgin;
768768
undefined ->
@@ -853,14 +853,6 @@ update_feature_state_and_enable(
853853
Error
854854
end.
855855

856-
is_virgin_node(Node) ->
857-
case rpc_call(Node, rabbit_mnesia, is_virgin_node, [], ?TIMEOUT) of
858-
IsVirgin when is_boolean(IsVirgin) ->
859-
IsVirgin;
860-
{error, _} ->
861-
undefined
862-
end.
863-
864856
restore_feature_flag_state(
865857
Nodes, NodesWhereDisabled, Inventory, FeatureName) ->
866858
NodesWhereEnabled = Nodes -- NodesWhereDisabled,

deps/rabbit/src/rabbit_node_monitor.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
6262
-spec running_nodes_filename() -> string().
6363

6464
running_nodes_filename() ->
65-
filename:join(rabbit_mnesia:dir(), "nodes_running_at_shutdown").
65+
filename:join(rabbit:data_dir(), "nodes_running_at_shutdown").
6666

6767
-spec cluster_status_filename() -> string().
6868

6969
cluster_status_filename() ->
70-
filename:join(rabbit_mnesia:dir(), "cluster_nodes.config").
70+
filename:join(rabbit:data_dir(), "cluster_nodes.config").
7171

7272
coordination_filename() ->
7373
filename:join(rabbit:data_dir(), "coordination").
@@ -81,7 +81,7 @@ default_quorum_filename() ->
8181
-spec prepare_cluster_status_files() -> 'ok' | no_return().
8282

8383
prepare_cluster_status_files() ->
84-
rabbit_mnesia:ensure_mnesia_dir(),
84+
rabbit_db:ensure_dir_exists(),
8585
RunningNodes1 = case try_read_file(running_nodes_filename()) of
8686
{ok, [Nodes]} when is_list(Nodes) -> Nodes;
8787
{ok, Other} -> corrupt_cluster_status_files(Other);

deps/rabbit/test/feature_flags_v2_SUITE.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,11 +1272,11 @@ have_required_feature_flag_in_cluster_and_add_member_without_it(
12721272
?assert(rabbit_feature_flags:is_supported(FeatureName)),
12731273
?assertNot(rabbit_feature_flags:is_enabled(FeatureName)),
12741274

1275-
MnesiaDir = rabbit_mnesia:dir(),
1276-
ok = filelib:ensure_path(MnesiaDir),
1277-
SomeFile = filename:join(MnesiaDir, "some-mnesia-file.db"),
1275+
DBDir = rabbit_db:dir(),
1276+
ok = filelib:ensure_path(DBDir),
1277+
SomeFile = filename:join(DBDir, "some-file.db"),
12781278
ok = file:write_file(SomeFile, <<>>),
1279-
?assertNot(rabbit_mnesia:is_virgin_node()),
1279+
?assertNot(rabbit_db:is_virgin_node()),
12801280
ok
12811281
end,
12821282
[]),

0 commit comments

Comments
 (0)