summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <mklishin@pivotal.io>2015-05-10 21:15:43 +0300
committerMichael Klishin <mklishin@pivotal.io>2015-05-10 21:15:43 +0300
commit54c63a2eeaccdd36381d12283e244e7133c6ab27 (patch)
tree616ce3b1e59b01ab301a2ebb407dd04407afaf7e /src
parent9a8e7b0a243daa2b3778dbf342a0229f7cfd40f9 (diff)
downloadrabbitmq-server-git-54c63a2eeaccdd36381d12283e244e7133c6ab27.tar.gz
Use a set to look up previously seen {queue, reason} keys
For O(1) lookup complexity.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_dead_letter.erl34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/rabbit_dead_letter.erl b/src/rabbit_dead_letter.erl
index f013c2e984..050e661b5a 100644
--- a/src/rabbit_dead_letter.erl
+++ b/src/rabbit_dead_letter.erl
@@ -84,10 +84,10 @@ x_death_event_key(Info, Key, KeyType) ->
{value, {Key, KeyType, Val}} -> Val
end.
-maybe_append_to_event_group(Table, _Queue, _Reason, []) ->
+maybe_append_to_event_group(Table, _Key, _SeenKeys, []) ->
[Table];
-maybe_append_to_event_group(Table, Queue, Reason, Acc) ->
- case lists:any(queue_and_reason_matcher(Queue, Reason), Acc) of
+maybe_append_to_event_group(Table, {_Queue, _Reason} = Key, SeenKeys, Acc) ->
+ case sets:is_element(Key, SeenKeys) of
true -> Acc;
false -> [Table | Acc]
end.
@@ -97,18 +97,22 @@ group_by_queue_and_reason([]) ->
group_by_queue_and_reason([Table]) ->
[Table];
group_by_queue_and_reason(Tables) ->
- lists:foldl(fun ({table, Info}, Acc) ->
- Q = x_death_event_key(Info, <<"queue">>, longstr),
- R = x_death_event_key(Info, <<"reason">>, longstr),
- Matcher = queue_and_reason_matcher(Q, R),
- {Matches, _} = lists:partition(Matcher, Tables),
- {Augmented, N} = case Matches of
- [X] -> {X, 1};
- [X|_] = Xs -> {X, length(Xs)}
- end,
- maybe_append_to_event_group(
- ensure_xdeath_event_count(Augmented, N), Q, R, Acc)
- end, [], Tables).
+ {_, Grouped} =
+ lists:foldl(fun ({table, Info}, {SeenKeys, Acc}) ->
+ Q = x_death_event_key(Info, <<"queue">>, longstr),
+ R = x_death_event_key(Info, <<"reason">>, longstr),
+ Matcher = queue_and_reason_matcher(Q, R),
+ {Matches, _} = lists:partition(Matcher, Tables),
+ {Augmented, N} = case Matches of
+ [X] -> {X, 1};
+ [X|_] = Xs -> {X, length(Xs)}
+ end,
+ Key = {Q, R},
+ Acc1 = maybe_append_to_event_group(
+ ensure_xdeath_event_count(Augmented, N), Key, SeenKeys, Acc),
+ {sets:add_element(Key, SeenKeys), Acc1}
+ end, {sets:new(), []}, Tables),
+ Grouped.
update_x_death_header(Info, Headers) ->
Q = x_death_event_key(Info, <<"queue">>, longstr),