|
26 | 26 | peek_serial/1,
|
27 | 27 | next_serial/1,
|
28 | 28 | delete/2,
|
| 29 | + delete_all/1, |
29 | 30 | delete_serial/1,
|
30 | 31 | recover/1,
|
31 | 32 | match/1,
|
@@ -657,6 +658,69 @@ delete_in_khepri(X = #exchange{name = XName}, OnlyDurable, RemoveBindingsForSour
|
657 | 658 | ok = khepri_tx:delete(khepri_exchange_path(XName)),
|
658 | 659 | rabbit_db_binding:delete_all_for_exchange_in_khepri(X, OnlyDurable, RemoveBindingsForSource).
|
659 | 660 |
|
| 661 | +%% ------------------------------------------------------------------- |
| 662 | +%% delete_all(). |
| 663 | +%% ------------------------------------------------------------------- |
| 664 | + |
| 665 | +-spec delete_all(VHostName) -> Ret when |
| 666 | + VHostName :: vhost:name(), |
| 667 | + Deletions :: rabbit_binding:deletions(), |
| 668 | + Ret :: {ok, Deletions}. |
| 669 | +%% @doc Deletes all exchanges for a given vhost. |
| 670 | +%% |
| 671 | +%% @returns an `{ok, Deletions}' tuple containing the {@link |
| 672 | +%% rabbit_binding:deletions()} caused by deleting the exchanges under the given |
| 673 | +%% vhost. |
| 674 | +%% |
| 675 | +%% @private |
| 676 | + |
| 677 | +delete_all(VHostName) -> |
| 678 | + rabbit_khepri:handle_fallback( |
| 679 | + #{mnesia => fun() -> delete_all_in_mnesia(VHostName) end, |
| 680 | + khepri => fun() -> delete_all_in_khepri(VHostName) end |
| 681 | + }). |
| 682 | + |
| 683 | +delete_all_in_mnesia(VHostName) -> |
| 684 | + rabbit_mnesia:execute_mnesia_transaction( |
| 685 | + fun() -> |
| 686 | + delete_all_in_mnesia_tx(VHostName) |
| 687 | + end). |
| 688 | + |
| 689 | +delete_all_in_mnesia_tx(VHostName) -> |
| 690 | + Match = #exchange{name = rabbit_misc:r(VHostName, exchange), _ = '_'}, |
| 691 | + Xs = mnesia:match_object(?MNESIA_TABLE, Match, write), |
| 692 | + Deletions = |
| 693 | + lists:foldl( |
| 694 | + fun(X, Acc) -> |
| 695 | + {deleted, #exchange{name = XName}, Bindings, XDeletions} = |
| 696 | + unconditional_delete_in_mnesia( X, false), |
| 697 | + XDeletions1 = rabbit_binding:add_deletion( |
| 698 | + XName, {X, deleted, Bindings}, XDeletions), |
| 699 | + rabbit_binding:combine_deletions(Acc, XDeletions1) |
| 700 | + end, rabbit_binding:new_deletions(), Xs), |
| 701 | + {ok, Deletions}. |
| 702 | + |
| 703 | +delete_all_in_khepri(VHostName) -> |
| 704 | + rabbit_khepri:transaction( |
| 705 | + fun() -> |
| 706 | + delete_all_in_khepri_tx(VHostName) |
| 707 | + end, rw, #{timeout => infinity}). |
| 708 | + |
| 709 | +delete_all_in_khepri_tx(VHostName) -> |
| 710 | + Pattern = khepri_exchange_path(VHostName, ?KHEPRI_WILDCARD_STAR), |
| 711 | + {ok, NodeProps} = khepri_tx_adv:delete_many(Pattern), |
| 712 | + Deletions = |
| 713 | + maps:fold( |
| 714 | + fun(_Path, #{data := X}, Deletions) -> |
| 715 | + {deleted, #exchange{name = XName}, Bindings, XDeletions} = |
| 716 | + rabbit_db_binding:delete_all_for_exchange_in_khepri( |
| 717 | + X, false, true), |
| 718 | + Deletions1 = rabbit_binding:add_deletion( |
| 719 | + XName, {X, deleted, Bindings}, XDeletions), |
| 720 | + rabbit_binding:combine_deletions(Deletions, Deletions1) |
| 721 | + end, rabbit_binding:new_deletions(), NodeProps), |
| 722 | + {ok, Deletions}. |
| 723 | + |
660 | 724 | %% -------------------------------------------------------------------
|
661 | 725 | %% delete_serial().
|
662 | 726 | %% -------------------------------------------------------------------
|
|
0 commit comments