diff options
author | Matthias Radestock <matthias@lshift.net> | 2010-04-09 15:31:31 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@lshift.net> | 2010-04-09 15:31:31 +0100 |
commit | 620acd5c4cf7cd919ab63dcb6bf8afc64e47fc54 (patch) | |
tree | 83d8198c97b198b9f000ea6a138d561809651005 | |
parent | 03fe4ade50b2e46d87f1db8dc05a299e7a059d54 (diff) | |
download | rabbitmq-server-620acd5c4cf7cd919ab63dcb6bf8afc64e47fc54.tar.gz |
refactor: introduce rabbit_misc:dict_cons/3
This has been cherry-picked from the bug21673 branch.
-rw-r--r-- | src/rabbit_channel.erl | 13 | ||||
-rw-r--r-- | src/rabbit_misc.erl | 5 | ||||
-rw-r--r-- | src/rabbit_persister.erl | 20 | ||||
-rw-r--r-- | src/rabbit_router.erl | 10 |
4 files changed, 19 insertions, 29 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 3597fcd7..7f8ba12f 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -966,14 +966,11 @@ fold_per_queue(F, Acc0, UAQ) -> D = rabbit_misc:queue_fold( fun ({_DTag, _CTag, {_QName, QPid, MsgId, _Redelivered, _Message}}, D) -> - %% dict:append would be simpler and avoid the - %% lists:reverse in handle_message({recover, true}, - %% ...). However, it is significantly slower when - %% going beyond a few thousand elements. - dict:update(QPid, - fun (MsgIds) -> [MsgId | MsgIds] end, - [MsgId], - D) + %% dict:append would avoid the lists:reverse in + %% handle_message({recover, true}, ...). However, it + %% is significantly slower when going beyond a few + %% thousand elements. + rabbit_misc:dict_cons(QPid, MsgId, D) end, dict:new(), UAQ), dict:fold(fun (QPid, MsgIds, Acc) -> F(QPid, MsgIds, Acc) end, Acc0, D). diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl index 81cecb38..ab088192 100644 --- a/src/rabbit_misc.erl +++ b/src/rabbit_misc.erl @@ -59,6 +59,7 @@ -export([sort_field_table/1]). -export([pid_to_string/1, string_to_pid/1]). -export([version_compare/2, version_compare/3]). +-export([dict_cons/3]). -import(mnesia). -import(lists). @@ -133,6 +134,7 @@ -spec(sort_field_table/1 :: (amqp_table()) -> amqp_table()). -spec(pid_to_string/1 :: (pid()) -> string()). -spec(string_to_pid/1 :: (string()) -> pid()). +-spec(dict_cons/3 :: (any(), any(), dict()) -> dict()). -endif. @@ -601,3 +603,6 @@ version_compare(A, B) -> ANum < BNum -> lt; ANum > BNum -> gt end. + +dict_cons(Key, Value, Dict) -> + dict:update(Key, fun (List) -> [Value | List] end, [Value], Dict). diff --git a/src/rabbit_persister.erl b/src/rabbit_persister.erl index 019d2a26..e69c4bdc 100644 --- a/src/rabbit_persister.erl +++ b/src/rabbit_persister.erl @@ -406,7 +406,10 @@ check_version(_Other) -> requeue_messages(Snapshot = #psnapshot{messages = Messages, queues = Queues}) -> - Work = ets:foldl(fun accumulate_requeues/2, dict:new(), Queues), + Work = ets:foldl( + fun ({{QName, PKey}, Delivered}, Acc) -> + rabbit_misc:dict_cons(QName, {PKey, Delivered}, Acc) + end, dict:new(), Queues), %% unstable parallel map, because order doesn't matter L = lists:append( rabbit_misc:upmap( @@ -425,13 +428,6 @@ requeue_messages(Snapshot = #psnapshot{messages = Messages, %% contains the mutated messages and queues tables Snapshot. -accumulate_requeues({{QName, PKey}, Delivered}, Acc) -> - Requeue = {PKey, Delivered}, - dict:update(QName, - fun (Requeues) -> [Requeue | Requeues] end, - [Requeue], - Acc). - requeue(QName, Requeues, Messages) -> case rabbit_amqqueue:lookup(QName) of {ok, #amqqueue{pid = QPid}} -> @@ -474,12 +470,8 @@ internal_integrate_messages(Items, Snapshot) -> internal_integrate1({extend_transaction, Key, MessageList}, Snapshot = #psnapshot {transactions = Transactions}) -> - NewTransactions = - dict:update(Key, - fun (MessageLists) -> [MessageList | MessageLists] end, - [MessageList], - Transactions), - Snapshot#psnapshot{transactions = NewTransactions}; + Snapshot#psnapshot{transactions = rabbit_misc:dict_cons(Key, MessageList, + Transactions)}; internal_integrate1({rollback_transaction, Key}, Snapshot = #psnapshot{transactions = Transactions}) -> Snapshot#psnapshot{transactions = dict:erase(Key, Transactions)}; diff --git a/src/rabbit_router.erl b/src/rabbit_router.erl index 884ea4ab..a449e19e 100644 --- a/src/rabbit_router.erl +++ b/src/rabbit_router.erl @@ -76,13 +76,9 @@ deliver(QPids, Delivery) -> %% which then in turn delivers it to its queues. deliver_per_node( dict:to_list( - lists:foldl( - fun (QPid, D) -> - dict:update(node(QPid), - fun (QPids1) -> [QPid | QPids1] end, - [QPid], D) - end, - dict:new(), QPids)), + lists:foldl(fun (QPid, D) -> + rabbit_misc:dict_cons(node(QPid), QPid, D) + end, dict:new(), QPids)), Delivery). deliver_per_node([{Node, QPids}], Delivery) when Node == node() -> |