Skip to content

Commit 93194fb

Browse files
committed
reset
1 parent 74e8807 commit 93194fb

File tree

3 files changed

+72
-24
lines changed

3 files changed

+72
-24
lines changed

deps/rabbit/src/rabbit_db.erl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ clear_init_finished() ->
129129
%% @doc Resets the database and the node.
130130

131131
reset() ->
132+
ok = rabbit:stop(),
132133
ok = case rabbit_khepri:is_enabled() of
133134
true -> reset_using_khepri();
134135
false -> reset_using_mnesia()
@@ -198,6 +199,8 @@ force_load_on_next_boot_using_mnesia() ->
198199
post_reset() ->
199200
rabbit_feature_flags:reset(),
200201

202+
wipe_data_dir(),
203+
201204
%% The cluster status files that RabbitMQ uses when Mnesia is the database
202205
%% are initially created from rabbit_prelaunch_cluster. However, it will
203206
%% only be done once the `rabbit` app is restarted. Meanwhile, they are
@@ -210,6 +213,17 @@ post_reset() ->
210213

211214
ok.
212215

216+
wipe_data_dir() ->
217+
DataDir = dir(),
218+
Glob = filename:join(DataDir, "*"),
219+
FilesToRemove = filelib:wildcard(Glob),
220+
?LOG_DEBUG(
221+
"DB: wipe files in data directory `~ts`:~p",
222+
[DataDir, FilesToRemove],
223+
#{domain => ?RMQLOG_DOMAIN_DB}),
224+
ok = rabbit_file:recursive_delete(FilesToRemove),
225+
ok.
226+
213227
%% -------------------------------------------------------------------
214228
%% is_virgin_node().
215229
%% -------------------------------------------------------------------

deps/rabbit/src/rabbit_db_cluster.erl

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -379,19 +379,42 @@ forget_member_locked(Node, RemoveWhenOffline)
379379
ok -> post_forget_member_locked(Node, RemoveWhenOffline);
380380
_ -> ok
381381
end,
382-
Ret.
382+
Ret;
383+
forget_member_locked(Node, RemoveWhenOffline)
384+
when is_atom(Node) andalso Node =:= node() ->
385+
OtherNodes = members() -- [Node],
386+
forget_member_locked_remotely(OtherNodes, Node, RemoveWhenOffline).
383387

384-
post_forget_member_locked(Node, false = _RemoveWhenOffline) ->
385-
?LOG_DEBUG(
386-
"DB: removing node `~s` from various Ra clusters", [Node],
387-
#{domain => ?RMQLOG_DOMAIN_DB}),
388-
_ = rabbit_amqqueue:forget_all(Node),
389-
_ = rabbit_quorum_queue:shrink_all(Node),
390-
_ = rabbit_stream_queue:delete_all_replicas(Node),
391-
_ = rabbit_stream_coordinator:forget_node(Node),
392-
rabbit_node_monitor:notify_left_cluster(Node),
393-
ok;
394-
post_forget_member_locked(_Node, true = _RemoveWhenOffline) ->
388+
forget_member_locked_remotely([OtherNode | Rest], Node, RemoveWhenOffline) ->
389+
try
390+
?LOG_DEBUG(
391+
"DB: removing cluster member `~ts` (this node); doing it from "
392+
"remote node `~s`",
393+
[Node, OtherNode],
394+
#{domain => ?RMQLOG_DOMAIN_DB}),
395+
Ret = erpc:call(
396+
OtherNode,
397+
?MODULE, forget_member_locked, [Node, RemoveWhenOffline]),
398+
case Ret of
399+
ok ->
400+
ok;
401+
Error ->
402+
?LOG_DEBUG(
403+
"DB: failed to remove cluster member `~ts` from node "
404+
"`~s`: ~0p",
405+
[Node, OtherNode, Error],
406+
#{domain => ?RMQLOG_DOMAIN_DB}),
407+
forget_member_locked_remotely(Rest, Node, RemoveWhenOffline)
408+
end
409+
catch
410+
_:Reason ->
411+
?LOG_DEBUG(
412+
"DB: failed to remove cluster member `~ts` from node `~s`: ~0p",
413+
[Node, OtherNode, Reason],
414+
#{domain => ?RMQLOG_DOMAIN_DB}),
415+
forget_member_locked_remotely(Rest, Node, RemoveWhenOffline)
416+
end;
417+
forget_member_locked_remotely([], _Node, _RemoveWhenOffline) ->
395418
ok.
396419

397420
forget_member_using_mnesia(Node, RemoveWhenOffline) ->
@@ -406,6 +429,19 @@ forget_member_using_khepri(_Node, true) ->
406429
forget_member_using_khepri(Node, false = _RemoveWhenOffline) ->
407430
rabbit_khepri:remove_member(Node).
408431

432+
post_forget_member_locked(Node, false = _RemoveWhenOffline) ->
433+
?LOG_DEBUG(
434+
"DB: removing node `~s` from various Ra clusters", [Node],
435+
#{domain => ?RMQLOG_DOMAIN_DB}),
436+
_ = rabbit_amqqueue:forget_all(Node),
437+
_ = rabbit_quorum_queue:shrink_all(Node),
438+
_ = rabbit_stream_queue:delete_all_replicas(Node),
439+
_ = rabbit_stream_coordinator:forget_node(Node),
440+
rabbit_node_monitor:notify_left_cluster(Node),
441+
ok;
442+
post_forget_member_locked(_Node, true = _RemoveWhenOffline) ->
443+
ok.
444+
409445
lock_cluster_changes(ChangingNode) ->
410446
RabbitWasRunning = stop_rabbit_if_running(ChangingNode),
411447
InitialState = #{changing_node => ChangingNode,

deps/rabbit/src/rabbit_khepri.erl

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ ensure_ra_system_started() ->
302302
{ok, _} = application:ensure_all_started(khepri),
303303
ok = rabbit_ra_systems:ensure_ra_system_started(?RA_SYSTEM).
304304

305+
ensure_ra_system_stopped() ->
306+
ok = rabbit_ra_systems:ensure_ra_system_stopped(?RA_SYSTEM).
307+
305308
retry_timeout() ->
306309
case application:get_env(rabbit, khepri_leader_wait_retry_timeout) of
307310
{ok, T} when is_integer(T) andalso T >= 0 -> T;
@@ -372,19 +375,14 @@ await_replication() ->
372375
%% @private
373376

374377
reset() ->
375-
case rabbit:is_running() of
376-
false ->
377-
%% Rabbit should be stopped, but Khepri needs to be running.
378-
%% Restart it.
379-
ok = setup(),
380-
ok = khepri_cluster:reset(?RA_CLUSTER_NAME),
381-
ok = khepri:stop(?RA_CLUSTER_NAME),
378+
?assertNot(rabbit:is_running()),
382379

383-
_ = file:delete(rabbit_guid:filename()),
384-
ok;
385-
true ->
386-
throw({error, rabbitmq_unexpectedly_running})
387-
end.
380+
ok = setup(),
381+
ThisNode = node(),
382+
rabbit_db_cluster:forget_member(ThisNode),
383+
ok = khepri:stop(?RA_CLUSTER_NAME),
384+
ok = ensure_ra_system_stopped(),
385+
ok.
388386

389387
-spec dir() -> Dir when
390388
Dir :: file:filename_all().

0 commit comments

Comments
 (0)