diff options
| author | Arnaud Cogoluègnes <acogoluegnes@gmail.com> | 2019-01-08 18:08:03 +0100 |
|---|---|---|
| committer | Arnaud Cogoluègnes <acogoluegnes@gmail.com> | 2019-01-08 18:08:03 +0100 |
| commit | 0328837f898e8dc5927d84a83b3d640e024d24c8 (patch) | |
| tree | 7d0b478e0456a1fddce692641bf827373396dcbf /src | |
| parent | 71d17fb920403a875f83ef985e48a016a3e67761 (diff) | |
| download | rabbitmq-server-git-0328837f898e8dc5927d84a83b3d640e024d24c8.tar.gz | |
Simplify consumer cancellation in QQ for single active consumer
References #1799
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_fifo.erl | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/src/rabbit_fifo.erl b/src/rabbit_fifo.erl index 61981fd4cd..938e8f77fd 100644 --- a/src/rabbit_fifo.erl +++ b/src/rabbit_fifo.erl @@ -727,33 +727,25 @@ cancel_consumer(ConsumerId, waiting_consumers = WaitingConsumers0 } = State0}) -> %% single active consumer on, consumers are waiting case maps:take(ConsumerId, Cons0) of - {_CurrentActiveConsumer, _} -> + {_CurrentActiveConsumer = #consumer{checked_out = Checked0}, _} -> % The active consumer is to be removed % Cancel it - {Effects1, State1} = case maps:take(ConsumerId, Cons0) of - {#consumer{checked_out = Checked0}, _} -> - S = return_all(State0, Checked0), - Effects = cancel_consumer_effects(ConsumerId, S, Effects0), - {Effects, State0}; - error -> - {Effects0, State0} - end, + S = return_all(State0, Checked0), + Effects = cancel_consumer_effects(ConsumerId, S, Effects0), % Take another one from the waiting consumers and put it in consumers [{NewActiveConsumerId, NewActiveConsumer} | RemainingWaitingConsumers] = WaitingConsumers0, #state{service_queue = ServiceQueue} = State0, ServiceQueue1 = maybe_queue_consumer(NewActiveConsumerId, NewActiveConsumer, ServiceQueue), - State2 = State1#state{consumers = #{NewActiveConsumerId => NewActiveConsumer}, + State1 = State0#state{consumers = #{NewActiveConsumerId => NewActiveConsumer}, service_queue = ServiceQueue1, waiting_consumers = RemainingWaitingConsumers}, - {Effects1, State2}; + {Effects, State1}; error -> % The cancelled consumer is not the active one % Just remove it from idle_consumers - {value, {ConsumerId, #consumer{checked_out = Checked0}}, WaitingConsumers1} = - lists:keytake(ConsumerId, 1, WaitingConsumers0), - S = return_all(State0, Checked0), - Effects = cancel_consumer_effects(ConsumerId, S, Effects0), - {Effects, State0#state{waiting_consumers = WaitingConsumers1}} + {value, _Consumer, WaitingConsumers1} = lists:keytake(ConsumerId, 1, WaitingConsumers0), + % A waiting consumer isn't supposed to have any checked out messages, so nothing special to do here + {Effects0, State0#state{waiting_consumers = WaitingConsumers1}} end. cancel_consumer0(ConsumerId, |
