@@ -1206,7 +1206,7 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12061206 last = Last0 ,
12071207 state = Outcome ,
12081208 settled = DispositionSettled } = Disposition ,
1209- # state {outgoing_unsettled_map = UnsettledMap ,
1209+ # state {outgoing_unsettled_map = UnsettledMap0 ,
12101210 queue_states = QStates0 } = State0 ) ->
12111211 Last = case Last0 of
12121212 ? UINT (L ) ->
@@ -1215,19 +1215,20 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12151215 % % "If not set, this is taken to be the same as first." [2.7.6]
12161216 First
12171217 end ,
1218- UnsettledMapSize = map_size (UnsettledMap ),
1218+ UnsettledMapSize = map_size (UnsettledMap0 ),
12191219 case UnsettledMapSize of
12201220 0 ->
12211221 {noreply , State0 };
12221222 _ ->
12231223 DispositionRangeSize = diff (Last , First ) + 1 ,
1224- {Settled , UnsettledMap1 } =
1224+ {Settled , UnsettledMap } =
12251225 case DispositionRangeSize =< UnsettledMapSize of
12261226 true ->
12271227 % % It is cheaper to iterate over the range of settled delivery IDs.
1228- serial_number :foldl (fun settle_delivery_id /2 , {#{}, UnsettledMap }, First , Last );
1228+ serial_number :foldl (fun settle_delivery_id /2 , {#{}, UnsettledMap0 }, First , Last );
12291229 false ->
12301230 % % It is cheaper to iterate over the outgoing unsettled map.
1231+ {Settled0 , UnsettledList } =
12311232 maps :fold (
12321233 fun (DeliveryId ,
12331234 # outgoing_unsettled {queue_name = QName ,
@@ -1243,10 +1244,11 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12431244 SettledAcc ),
12441245 {SettledAcc1 , UnsettledAcc };
12451246 false ->
1246- {SettledAcc , UnsettledAcc # {DeliveryId => Unsettled }}
1247+ {SettledAcc , [ {DeliveryId , Unsettled } | UnsettledAcc ] }
12471248 end
12481249 end ,
1249- {#{}, #{}}, UnsettledMap )
1250+ {#{}, []}, UnsettledMap0 ),
1251+ {Settled0 , maps :from_list (UnsettledList )}
12501252 end ,
12511253
12521254 SettleOp = settle_op_from_outcome (Outcome ),
@@ -1263,7 +1265,7 @@ handle_control(#'v1_0.disposition'{role = ?AMQP_ROLE_RECEIVER,
12631265 end
12641266 end , {QStates0 , []}, Settled ),
12651267
1266- State1 = State0 # state {outgoing_unsettled_map = UnsettledMap1 ,
1268+ State1 = State0 # state {outgoing_unsettled_map = UnsettledMap ,
12671269 queue_states = QStates },
12681270 Reply = case DispositionSettled of
12691271 true -> [];
0 commit comments