diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2015-05-10 21:15:43 +0300 |
|---|---|---|
| committer | Michael Klishin <mklishin@pivotal.io> | 2015-05-10 21:15:43 +0300 |
| commit | 54c63a2eeaccdd36381d12283e244e7133c6ab27 (patch) | |
| tree | 616ce3b1e59b01ab301a2ebb407dd04407afaf7e /src | |
| parent | 9a8e7b0a243daa2b3778dbf342a0229f7cfd40f9 (diff) | |
| download | rabbitmq-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.erl | 34 |
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), |
