3535-behaviour (gen_server2 ).
3636
3737-export ([start_link /0 ,
38- deliver /5 ]).
38+ deliver /2 ]).
3939
4040-export ([init /1 , handle_call /3 , handle_cast /2 , handle_info /2 ,
4141 terminate /2 , code_change /3 ]).
5050-ifdef (use_specs ).
5151
5252-spec (start_link / 0 :: () -> {'ok' , pid ()} | 'ignore' | {'error' , any ()}).
53- -spec (deliver / 5 :: ([pid ()], bool (), bool (), maybe (txn ()), message ()) ->
54- {routing_result (), [pid ()]}).
53+ -spec (deliver / 2 :: ([pid ()], delivery ()) -> {routing_result (), [pid ()]}).
5554
5655-endif .
5756
@@ -62,13 +61,13 @@ start_link() ->
6261
6362-ifdef (BUG19758 ).
6463
65- deliver (QPids , Mandatory , Immediate , Txn , Message ) ->
66- check_delivery (Mandatory , Immediate ,
67- run_bindings (QPids , Mandatory , Immediate , Txn , Message )).
64+ deliver (QPids , Delivery ) ->
65+ check_delivery (Delivery # delivery . mandatory , Delivery # delivery . immediate ,
66+ run_bindings (QPids , Delivery )).
6867
6968-else .
7069
71- deliver (QPids , Mandatory , Immediate , Txn , Message ) ->
70+ deliver (QPids , Delivery ) ->
7271 % % we reduce inter-node traffic by grouping the qpids by node and
7372 % % only delivering one copy of the message to each node involved,
7473 % % which then in turn delivers it to its queues.
@@ -81,16 +80,14 @@ deliver(QPids, Mandatory, Immediate, Txn, Message) ->
8180 [QPid ], D )
8281 end ,
8382 dict :new (), QPids )),
84- Mandatory , Immediate , Txn , Message ).
83+ Delivery ).
8584
86- deliver_per_node ([{Node , QPids }], Mandatory , Immediate ,
87- Txn , Message )
88- when Node == node () ->
85+ deliver_per_node ([{Node , QPids }], Delivery ) when Node == node () ->
8986 % % optimisation
90- check_delivery (Mandatory , Immediate ,
91- run_bindings (QPids , Mandatory , Immediate , Txn , Message ));
92- deliver_per_node (NodeQPids , Mandatory = false , Immediate = false ,
93- Txn , Message ) ->
87+ check_delivery (Delivery # delivery . mandatory , Delivery # delivery . immediate ,
88+ run_bindings (QPids , Delivery ));
89+ deliver_per_node (NodeQPids , Delivery = # delivery { mandatory = false ,
90+ immediate = false } ) ->
9491 % % optimisation: when Mandatory = false and Immediate = false,
9592 % % rabbit_amqqueue:deliver in run_bindings below will deliver the
9693 % % message to the queue process asynchronously, and return true,
@@ -101,20 +98,16 @@ deliver_per_node(NodeQPids, Mandatory = false, Immediate = false,
10198 {routed ,
10299 lists :flatmap (
103100 fun ({Node , QPids }) ->
104- gen_server2 :cast (
105- {? SERVER , Node },
106- {deliver , QPids , Mandatory , Immediate , Txn , Message }),
101+ gen_server2 :cast ({? SERVER , Node }, {deliver , QPids , Delivery }),
107102 QPids
108103 end ,
109104 NodeQPids )};
110- deliver_per_node (NodeQPids , Mandatory , Immediate ,
111- Txn , Message ) ->
105+ deliver_per_node (NodeQPids , Delivery ) ->
112106 R = rabbit_misc :upmap (
113107 fun ({Node , QPids }) ->
114- try gen_server2 :call (
115- {? SERVER , Node },
116- {deliver , QPids , Mandatory , Immediate , Txn , Message },
117- infinity )
108+ try gen_server2 :call ({? SERVER , Node },
109+ {deliver , QPids , Delivery },
110+ infinity )
118111 catch
119112 _Class :_Reason ->
120113 % % TODO: figure out what to log (and do!) here
@@ -131,7 +124,8 @@ deliver_per_node(NodeQPids, Mandatory, Immediate,
131124 end ,
132125 {false , []},
133126 R ),
134- check_delivery (Mandatory , Immediate , {Routed , lists :append (Handled )}).
127+ check_delivery (Delivery # delivery .mandatory , Delivery # delivery .immediate ,
128+ {Routed , lists :append (Handled )}).
135129
136130-endif .
137131
@@ -140,19 +134,17 @@ deliver_per_node(NodeQPids, Mandatory, Immediate,
140134init ([]) ->
141135 {ok , no_state }.
142136
143- handle_call ({deliver , QPids , Mandatory , Immediate , Txn , Message },
144- From , State ) ->
137+ handle_call ({deliver , QPids , Delivery }, From , State ) ->
145138 spawn (
146139 fun () ->
147- R = run_bindings (QPids , Mandatory , Immediate , Txn , Message ),
140+ R = run_bindings (QPids , Delivery ),
148141 gen_server2 :reply (From , R )
149142 end ),
150143 {noreply , State }.
151144
152- handle_cast ({deliver , QPids , Mandatory , Immediate , Txn , Message },
153- State ) ->
145+ handle_cast ({deliver , QPids , Delivery }, State ) ->
154146 % % in order to preserve message ordering we must not spawn here
155- run_bindings (QPids , Mandatory , Immediate , Txn , Message ),
147+ run_bindings (QPids , Delivery ),
156148 {noreply , State }.
157149
158150handle_info (_Info , State ) ->
@@ -166,11 +158,10 @@ code_change(_OldVsn, State, _Extra) ->
166158
167159% %--------------------------------------------------------------------
168160
169- run_bindings (QPids , IsMandatory , IsImmediate , Txn , Message ) ->
161+ run_bindings (QPids , Delivery ) ->
170162 lists :foldl (
171163 fun (QPid , {Routed , Handled }) ->
172- case catch rabbit_amqqueue :deliver (IsMandatory , IsImmediate ,
173- Txn , Message , QPid ) of
164+ case catch rabbit_amqqueue :deliver (QPid , Delivery ) of
174165 true -> {true , [QPid | Handled ]};
175166 false -> {true , Handled };
176167 {'EXIT' , _Reason } -> {Routed , Handled }
0 commit comments