Skip to content

Commit 4840ca9

Browse files
authored
Merge pull request #6866 from rabbitmq/init-db-from-rabbit_db
rabbit_db: Add `init/0`, `is_virgin_node/0`, `dir/0` and `ensure_dir_exists/0` functions
2 parents 3bd5e25 + 950c4ef commit 4840ca9

File tree

10 files changed

+137
-45
lines changed

10 files changed

+137
-45
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
[]),

deps/rabbit/test/per_vhost_msg_store_SUITE.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ folder_size(Dir) ->
193193
fun(F,Acc) -> filelib:file_size(F) + Acc end, 0).
194194

195195
get_global_folder_size(Config) ->
196-
BaseDir = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_mnesia, dir, []),
196+
BaseDir = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit, data_dir, []),
197197
folder_size(BaseDir).
198198

199199
vhost_dir(Vhost, Config) ->

deps/rabbit_common/include/logging.hrl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
-define(RMQLOG_DOMAIN_CHAN, ?DEFINE_RMQLOG_DOMAIN(channel)).
66
-define(RMQLOG_DOMAIN_CONN, ?DEFINE_RMQLOG_DOMAIN(connection)).
7+
-define(RMQLOG_DOMAIN_DB, ?DEFINE_RMQLOG_DOMAIN(db)).
78
-define(RMQLOG_DOMAIN_FEAT_FLAGS, ?DEFINE_RMQLOG_DOMAIN(feature_flags)).
89
-define(RMQLOG_DOMAIN_MIRRORING, ?DEFINE_RMQLOG_DOMAIN(mirroring)).
910
-define(RMQLOG_DOMAIN_PRELAUNCH, ?DEFINE_RMQLOG_DOMAIN(prelaunch)).

deps/rabbitmq_cli/test/ctl/force_boot_command_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ defmodule ForceBootCommandTest do
4040
stop_rabbitmq_app()
4141
on_exit(fn -> start_rabbitmq_app() end)
4242
assert @command.run([], context[:opts]) == :ok
43-
data_dir = :rpc.call(get_rabbit_hostname(), :rabbit_mnesia, :dir, [])
43+
data_dir = :rpc.call(get_rabbit_hostname(), :rabbit, :data_dir, [])
4444

4545
path = Path.join(data_dir, "force_load")
4646
assert File.exists?(path)

deps/rabbitmq_cli/test/ctl/forget_cluster_node_command_test.exs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ defmodule ForgetClusterNodeCommandTest do
2020
:rabbit_misc.rpc_call(node, :application, :get_env, [:rabbit, :plugins_dir])
2121

2222
rabbitmq_home = :rabbit_misc.rpc_call(node, :code, :lib_dir, [:rabbit])
23-
data_dir = :rabbit_misc.rpc_call(node, :rabbit_mnesia, :dir, [])
23+
data_dir = :rabbit_misc.rpc_call(node, :rabbit, :data_dir, [])
2424

2525
feature_flags_file =
2626
:rabbit_misc.rpc_call(node, :rabbit_feature_flags, :enabled_feature_flags_list_file, [])
@@ -63,34 +63,34 @@ defmodule ForgetClusterNodeCommandTest do
6363
)
6464
end
6565

66-
test "validate_execution_environment: offline forget without mnesia dir fails", context do
66+
test "validate_execution_environment: offline forget without data dir fails", context do
6767
offline_opts =
6868
Map.merge(
6969
context[:opts],
7070
%{offline: true, node: :non_exist@localhost}
7171
)
7272

73-
opts_without_mnesia = Map.delete(offline_opts, :data_dir)
74-
Application.put_env(:mnesia, :dir, "/tmp")
75-
on_exit(fn -> Application.delete_env(:mnesia, :dir) end)
73+
opts_without_data_dir = Map.delete(offline_opts, :data_dir)
74+
Application.put_env(:rabbit, :data_dir, "/tmp")
75+
on_exit(fn -> Application.delete_env(:rabbit, :data_dir) end)
7676

7777
assert match?(
7878
:ok,
7979
@command.validate_execution_environment(
8080
["other_node@localhost"],
81-
opts_without_mnesia
81+
opts_without_data_dir
8282
)
8383
)
8484

85-
Application.delete_env(:mnesia, :dir)
85+
Application.delete_env(:rabbit, :data_dir)
8686
System.put_env("RABBITMQ_MNESIA_DIR", "/tmp")
8787
on_exit(fn -> System.delete_env("RABBITMQ_MNESIA_DIR") end)
8888

8989
assert match?(
9090
:ok,
9191
@command.validate_execution_environment(
9292
["other_node@localhost"],
93-
opts_without_mnesia
93+
opts_without_data_dir
9494
)
9595
)
9696

@@ -102,15 +102,15 @@ defmodule ForgetClusterNodeCommandTest do
102102
)
103103
end
104104

105-
test "validate_execution_environment: online mode does not fail is mnesia is not loaded",
105+
test "validate_execution_environment: online mode does not fail if database is not loaded",
106106
context do
107-
opts_without_mnesia = Map.delete(context[:opts], :data_dir)
107+
opts_without_data_dir = Map.delete(context[:opts], :data_dir)
108108

109109
assert match?(
110110
:ok,
111111
@command.validate_execution_environment(
112112
["other_node@localhost"],
113-
opts_without_mnesia
113+
opts_without_data_dir
114114
)
115115
)
116116
end

deps/rabbitmq_cli/test/ctl/rename_cluster_node_command_test.exs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ defmodule RenameClusterNodeCommandTest do
2020
:rabbit_misc.rpc_call(node, :application, :get_env, [:rabbit, :plugins_dir])
2121

2222
rabbitmq_home = :rabbit_misc.rpc_call(node, :code, :lib_dir, [:rabbit])
23-
data_dir = :rabbit_misc.rpc_call(node, :rabbit_mnesia, :dir, [])
23+
data_dir = :rabbit_misc.rpc_call(node, :rabbit, :data_dir, [])
2424

2525
on_exit([], fn ->
2626
start_rabbitmq_app()
@@ -67,26 +67,26 @@ defmodule RenameClusterNodeCommandTest do
6767
)
6868
end
6969

70-
test "validate_execution_environment: not providing node mnesia dir fails validation",
70+
test "validate_execution_environment: not providing node data dir fails validation",
7171
context do
72-
opts_without_mnesia = Map.delete(context[:opts], :data_dir)
73-
Application.put_env(:mnesia, :dir, "/tmp")
74-
on_exit(fn -> Application.delete_env(:mnesia, :dir) end)
72+
opts_without_data_dir = Map.delete(context[:opts], :data_dir)
73+
Application.put_env(:rabbit, :data_dir, "/tmp")
74+
on_exit(fn -> Application.delete_env(:rabbit, :data_dir) end)
7575

7676
assert :ok ==
7777
@command.validate(
7878
["some_node@localhost", "other_node@localhost"],
79-
opts_without_mnesia
79+
opts_without_data_dir
8080
)
8181

82-
Application.delete_env(:mnesia, :dir)
82+
Application.delete_env(:rabbit, :data_dir)
8383
System.put_env("RABBITMQ_MNESIA_DIR", "/tmp")
8484
on_exit(fn -> System.delete_env("RABBITMQ_MNESIA_DIR") end)
8585

8686
assert :ok ==
8787
@command.validate(
8888
["some_node@localhost", "other_node@localhost"],
89-
opts_without_mnesia
89+
opts_without_data_dir
9090
)
9191

9292
System.delete_env("RABBITMQ_MNESIA_DIR")

0 commit comments

Comments
 (0)