|
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. |
@@ -1702,14 +1704,19 @@ deliver_to_queues(Message, |
1702 | 1704 | Options, |
1703 | 1705 | RoutedToQNames, |
1704 | 1706 | State0 = #state{queue_states = QStates0, |
| 1707 | + queue_types_published = QTs0, |
1705 | 1708 | cfg = #cfg{proto_ver = ProtoVer}}) -> |
1706 | 1709 | Qs0 = rabbit_db_queue:get_targets(RoutedToQNames), |
1707 | 1710 | Qs = rabbit_amqqueue:prepend_extra_bcc(Qs0), |
1708 | 1711 | case rabbit_queue_type:deliver(Qs, Message, Options, QStates0) of |
1709 | 1712 | {ok, QStates, Actions} -> |
1710 | 1713 | rabbit_global_counters:messages_routed(ProtoVer, length(Qs)), |
1711 | | - State = process_routing_confirm(Options, Qs, |
1712 | | - State0#state{queue_states = QStates}), |
| 1714 | + QTs1 = sets:from_list(rabbit_amqqueue:queue_types(Qs), |
| 1715 | + [{version, 2}]), |
| 1716 | + QTs = sets:union(QTs0, QTs1), |
| 1717 | + State1 = State0#state{queue_states = QStates, |
| 1718 | + queue_types_published = QTs}, |
| 1719 | + State = process_routing_confirm(Options, Qs, State1), |
1713 | 1720 | %% Actions must be processed after registering confirms as actions may |
1714 | 1721 | %% contain rejections of publishes. |
1715 | 1722 | {ok, handle_queue_actions(Actions, State)}; |
@@ -2389,10 +2396,18 @@ is_socket_busy(Socket) -> |
2389 | 2396 | false |
2390 | 2397 | end. |
2391 | 2398 |
|
2392 | | --spec throttle(boolean(), state()) -> boolean(). |
2393 | | -throttle(Conserve, #state{queues_soft_limit_exceeded = QSLE, |
2394 | | - cfg = #cfg{published = Published}}) -> |
2395 | | - Conserve andalso Published orelse |
| 2399 | +-spec throttle(sets:set(rabbit_alarm:resource_alarm_source()), state()) -> |
| 2400 | + boolean(). |
| 2401 | +throttle(BlockedBy, #state{queues_soft_limit_exceeded = QSLE, |
| 2402 | + queue_types_published = QTs, |
| 2403 | + cfg = #cfg{published = Published}}) -> |
| 2404 | + Alarmed = sets:fold( |
| 2405 | + fun ({disk, QT}, Acc) -> |
| 2406 | + Acc orelse sets:is_element(QT, QTs); |
| 2407 | + (_, _) -> |
| 2408 | + true |
| 2409 | + end, false, BlockedBy), |
| 2410 | + Alarmed andalso Published orelse |
2396 | 2411 | not sets:is_empty(QSLE) orelse |
2397 | 2412 | credit_flow:blocked(). |
2398 | 2413 |
|
|
0 commit comments