|
10 | 10 | -include_lib("kernel/include/logger.hrl"). |
11 | 11 | -include_lib("stdlib/include/assert.hrl"). |
12 | 12 |
|
| 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]). |
13 | 18 | -export([run/1]). |
14 | 19 |
|
| 20 | +%% Default timeout for operations on remote nodes. |
| 21 | +-define(TIMEOUT, 60000). |
| 22 | + |
| 23 | +%% ------------------------------------------------------------------- |
| 24 | +%% DB initialization. |
| 25 | +%% ------------------------------------------------------------------- |
| 26 | + |
| 27 | +-spec init() -> Ret when |
| 28 | + Ret :: ok | {error, any()}. |
| 29 | +%% @doc Initializes the DB layer. |
| 30 | + |
| 31 | +init() -> |
| 32 | + IsVirgin = is_virgin_node(), |
| 33 | + ?LOG_DEBUG( |
| 34 | + "DB: this node is virgin: ~ts", |
| 35 | + [IsVirgin], |
| 36 | + #{domain => ?RMQLOG_DOMAIN_DB}), |
| 37 | + case init_mnesia() of |
| 38 | + ok -> |
| 39 | + ?LOG_DEBUG( |
| 40 | + "DB: initialization successeful", |
| 41 | + #{domain => ?RMQLOG_DOMAIN_DB}), |
| 42 | + ok; |
| 43 | + Error -> |
| 44 | + ?LOG_DEBUG( |
| 45 | + "DB: initialization failed: ~0p", |
| 46 | + [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 | + |
15 | 107 | %% ------------------------------------------------------------------- |
16 | 108 | %% run(). |
17 | 109 | %% ------------------------------------------------------------------- |
|
0 commit comments