summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkjnilsson <knilsson@pivotal.io>2020-11-19 15:59:51 +0000
committerkjnilsson <knilsson@pivotal.io>2020-11-19 15:59:51 +0000
commitea7c9e9b61d0f3ce04581263d12bdebae9c93501 (patch)
tree6f8ba97abb125d40d04e0708505e7833de1891ae
parent7a0e239c2c7723b2ed9c699b9336e30f18286c15 (diff)
downloadrabbitmq-server-git-qq-basic-get-snapshots.tar.gz
QQ: Emit release cursor for empty basic getsqq-basic-get-snapshots
Else an application that polled an empty quorum queue frequntly using basic.get would never result in a snapshot being taken and results in unlimited log growth.
-rw-r--r--deps/rabbit/src/rabbit_fifo.erl2
-rw-r--r--deps/rabbit/test/rabbit_fifo_SUITE.erl15
2 files changed, 14 insertions, 3 deletions
diff --git a/deps/rabbit/src/rabbit_fifo.erl b/deps/rabbit/src/rabbit_fifo.erl
index 51acfffd0d..9205f897ca 100644
--- a/deps/rabbit/src/rabbit_fifo.erl
+++ b/deps/rabbit/src/rabbit_fifo.erl
@@ -299,7 +299,7 @@ apply(#{index := Index,
Exists = maps:is_key(ConsumerId, Consumers),
case messages_ready(State0) of
0 ->
- {State0, {dequeue, empty}};
+ update_smallest_raft_index(Index, {dequeue, empty}, State0, []);
_ when Exists ->
%% a dequeue using the same consumer_id isn't possible at this point
{State0, {dequeue, empty}};
diff --git a/deps/rabbit/test/rabbit_fifo_SUITE.erl b/deps/rabbit/test/rabbit_fifo_SUITE.erl
index 7b90d91bfa..a9d541238d 100644
--- a/deps/rabbit/test/rabbit_fifo_SUITE.erl
+++ b/deps/rabbit/test/rabbit_fifo_SUITE.erl
@@ -207,7 +207,7 @@ enq_enq_checkout_get_settled_test(_) ->
checkout_get_empty_test(_) ->
Cid = {?FUNCTION_NAME, self()},
State = test_init(test),
- {_State2, {dequeue, empty}} =
+ {_State2, {dequeue, empty}, _} =
apply(meta(1), rabbit_fifo:make_checkout(Cid, {dequeue, unsettled}, #{}), State),
ok.
@@ -1556,7 +1556,7 @@ queue_ttl_test(_) ->
= rabbit_fifo:tick(Now + 2500, S2D),
%% dequeue should set last applied
- {S1Deq, {dequeue, empty}} =
+ {S1Deq, {dequeue, empty}, _} =
apply(meta(2, Now),
rabbit_fifo:make_checkout(Cid, {dequeue, unsettled}, #{}),
S0),
@@ -1657,6 +1657,17 @@ checkout_priority_test(_) ->
?ASSERT_EFF({send_msg, P, {delivery, _, _}, _}, P == Pid, E5),
ok.
+empty_dequeue_should_emit_release_cursor_test(_) ->
+ State0 = test_init(?FUNCTION_NAME),
+ Cid = <<"basic.get1">>,
+ {_State, {dequeue, empty}, Effects} =
+ apply(meta(2, 1234),
+ rabbit_fifo:make_checkout(Cid, {dequeue, unsettled}, #{}),
+ State0),
+
+ ?ASSERT_EFF({release_cursor, _, _}, Effects),
+ ok.
+
%% Utility
init(Conf) -> rabbit_fifo:init(Conf).