|
99 | 99 | -record(state, |
100 | 100 | {cfg :: #cfg{}, |
101 | 101 | queue_states = rabbit_queue_type:init() :: rabbit_queue_type:state(), |
| 102 | + queue_types_published = sets:new([{version, 2}]) :: |
| 103 | + sets:set(rabbit_queue_type:queue_type()), |
102 | 104 | %% Packet IDs published to queues but not yet confirmed. |
103 | 105 | unacked_client_pubs = rabbit_mqtt_confirms:init() :: rabbit_mqtt_confirms:state(), |
104 | 106 | %% Packet IDs published to MQTT subscribers but not yet acknowledged. |
@@ -1697,14 +1699,19 @@ deliver_to_queues(Message, |
1697 | 1699 | Options, |
1698 | 1700 | RoutedToQNames, |
1699 | 1701 | State0 = #state{queue_states = QStates0, |
| 1702 | + queue_types_published = QTs0, |
1700 | 1703 | cfg = #cfg{proto_ver = ProtoVer}}) -> |
1701 | 1704 | Qs0 = rabbit_db_queue:get_targets(RoutedToQNames), |
1702 | 1705 | Qs = rabbit_amqqueue:prepend_extra_bcc(Qs0), |
1703 | 1706 | case rabbit_queue_type:deliver(Qs, Message, Options, QStates0) of |
1704 | 1707 | {ok, QStates, Actions} -> |
1705 | 1708 | rabbit_global_counters:messages_routed(ProtoVer, length(Qs)), |
1706 | | - State = process_routing_confirm(Options, Qs, |
1707 | | - State0#state{queue_states = QStates}), |
| 1709 | + QTs1 = sets:from_list(rabbit_amqqueue:queue_types(Qs), |
| 1710 | + [{version, 2}]), |
| 1711 | + QTs = sets:union(QTs0, QTs1), |
| 1712 | + State1 = State0#state{queue_states = QStates, |
| 1713 | + queue_types_published = QTs}, |
| 1714 | + State = process_routing_confirm(Options, Qs, State1), |
1708 | 1715 | %% Actions must be processed after registering confirms as actions may |
1709 | 1716 | %% contain rejections of publishes. |
1710 | 1717 | {ok, handle_queue_actions(Actions, State)}; |
@@ -2362,10 +2369,18 @@ is_socket_busy(Socket) -> |
2362 | 2369 | false |
2363 | 2370 | end. |
2364 | 2371 |
|
2365 | | --spec throttle(boolean(), state()) -> boolean(). |
2366 | | -throttle(Conserve, #state{queues_soft_limit_exceeded = QSLE, |
2367 | | - cfg = #cfg{published = Published}}) -> |
2368 | | - Conserve andalso Published orelse |
| 2372 | +-spec throttle(sets:set(rabbit_alarm:resource_alarm_source()), state()) -> |
| 2373 | + boolean(). |
| 2374 | +throttle(BlockedBy, #state{queues_soft_limit_exceeded = QSLE, |
| 2375 | + queue_types_published = QTs, |
| 2376 | + cfg = #cfg{published = Published}}) -> |
| 2377 | + Alarmed = sets:fold( |
| 2378 | + fun ({disk, QT}, Acc) -> |
| 2379 | + Acc orelse sets:is_element(QT, QTs); |
| 2380 | + (_, _) -> |
| 2381 | + true |
| 2382 | + end, false, BlockedBy), |
| 2383 | + Alarmed andalso Published orelse |
2369 | 2384 | not sets:is_empty(QSLE) orelse |
2370 | 2385 | credit_flow:blocked(). |
2371 | 2386 |
|
|
0 commit comments