Skip to content

Commit 6271a58

Browse files
committed
Replace match_object with dirty_match_object for binding cleanup.
match_object locks entire table, we'd like to avoid that. It's possible to not call delete_for_source if exchange is autodeleted. Checking an autodelete exchange will lock table on scanning for outgoing bindings anyway. But other cases will not lock the table.
1 parent 68a3f30 commit 6271a58

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

src/rabbit_binding.erl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,8 @@ remove_for_source(SrcName) ->
319319
Match = #route{binding = #binding{source = SrcName, _ = '_'}},
320320
remove_routes(
321321
lists:usort(
322-
mnesia:match_object(rabbit_route, Match, read) ++
323-
mnesia:match_object(rabbit_semi_durable_route, Match, read))).
322+
mnesia:dirty_match_object(rabbit_route, Match) ++
323+
mnesia:dirty_match_object(rabbit_semi_durable_route, Match))).
324324

325325
remove_for_destination(DstName, OnlyDurable) ->
326326
remove_for_destination(DstName, OnlyDurable, fun remove_routes/1).
@@ -443,13 +443,13 @@ remove_for_destination(DstName, OnlyDurable, Fun) ->
443443
Routes = case OnlyDurable of
444444
false ->
445445
[reverse_route(R) ||
446-
R <- mnesia:match_object(
447-
rabbit_reverse_route, MatchRev, read)];
446+
R <- mnesia:dirty_match_object(
447+
rabbit_reverse_route, MatchRev)];
448448
true -> lists:usort(
449-
mnesia:match_object(
450-
rabbit_durable_route, MatchFwd, read) ++
451-
mnesia:match_object(
452-
rabbit_semi_durable_route, MatchFwd, read))
449+
mnesia:dirty_match_object(
450+
rabbit_durable_route, MatchFwd) ++
451+
mnesia:dirty_match_object(
452+
rabbit_semi_durable_route, MatchFwd))
453453
end,
454454
Bindings = Fun(Routes),
455455
group_bindings_fold(fun maybe_auto_delete/4, new_deletions(),

src/rabbit_exchange.erl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -492,15 +492,21 @@ maybe_auto_delete(#exchange{auto_delete = true} = X, OnlyDurable) ->
492492

493493
conditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
494494
case rabbit_binding:has_for_source(XName) of
495-
false -> unconditional_delete(X, OnlyDurable);
495+
false -> internal_delete(X, OnlyDurable, false);
496496
true -> {error, in_use}
497497
end.
498498

499-
unconditional_delete(X = #exchange{name = XName}, OnlyDurable) ->
499+
unconditional_delete(X, OnlyDurable) ->
500+
internal_delete(X, OnlyDurable, true).
501+
502+
internal_delete(X = #exchange{name = XName}, OnlyDurable, RemoveBindingsForSource) ->
500503
ok = mnesia:delete({rabbit_exchange, XName}),
501504
ok = mnesia:delete({rabbit_exchange_serial, XName}),
502505
mnesia:delete({rabbit_durable_exchange, XName}),
503-
Bindings = rabbit_binding:remove_for_source(XName),
506+
Bindings = case RemoveBindingsForSource of
507+
true -> rabbit_binding:remove_for_source(XName);
508+
false -> []
509+
end,
504510
{deleted, X, Bindings, rabbit_binding:remove_for_destination(
505511
XName, OnlyDurable)}.
506512

0 commit comments

Comments
 (0)