summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Mazzoli <francesco@rabbitmq.com>2012-04-23 16:51:06 +0100
committerFrancesco Mazzoli <francesco@rabbitmq.com>2012-04-23 16:51:06 +0100
commit5a19e94645c5a4918900dfd170f341d23a3c7135 (patch)
treef2d90c503fc6e5e752c4765120a44442628a5733
parent33bfcb5917fcc8bddf2b899001a2afbe5e07df33 (diff)
downloadrabbitmq-server-5a19e94645c5a4918900dfd170f341d23a3c7135.tar.gz
Make rabbit_variable_queue:dropwhile tail recursive
-rw-r--r--Makefile2
-rw-r--r--src/rabbit_variable_queue.erl11
2 files changed, 7 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index db7462a6..3c8d3526 100644
--- a/Makefile
+++ b/Makefile
@@ -207,7 +207,7 @@ start-background-node: all
-rm -f $(RABBITMQ_MNESIA_DIR).pid
mkdir -p $(RABBITMQ_MNESIA_DIR)
setsid sh -c "$(MAKE) run-background-node > $(RABBITMQ_MNESIA_DIR)/startup_log 2> $(RABBITMQ_MNESIA_DIR)/startup_err" &
- sleep 1
+ sleep 3
start-rabbit-on-node: all
echo "rabbit:start()." | $(ERL_CALL)
diff --git a/src/rabbit_variable_queue.erl b/src/rabbit_variable_queue.erl
index ddbe6bcc..209e5252 100644
--- a/src/rabbit_variable_queue.erl
+++ b/src/rabbit_variable_queue.erl
@@ -578,8 +578,10 @@ drain_confirmed(State = #vqstate { confirmed = C }) ->
confirmed = gb_sets:new() }}
end.
-dropwhile(Pred, AckRequired, State) ->
- End = fun(S) when AckRequired -> {[], S};
+dropwhile(Pred, AckRequired, State) -> dropwhile(Pred, AckRequired, State, []).
+
+dropwhile(Pred, AckRequired, State, Msgs) ->
+ End = fun(S) when AckRequired -> {lists:reverse(Msgs), S};
(S) -> {undefined, S}
end,
case queue_out(State) of
@@ -591,11 +593,10 @@ dropwhile(Pred, AckRequired, State) ->
{MsgStatus1, State2} = read_msg(MsgStatus, State1),
{{Msg, _, AckTag, _}, State3} =
internal_fetch(true, MsgStatus1, State2),
- {L, State4} = dropwhile(Pred, AckRequired, State3),
- {[{Msg, AckTag} | L], State4};
+ dropwhile(Pred, AckRequired, State3, [{Msg, AckTag} | Msgs]);
{true, false} ->
{_, State2} = internal_fetch(false, MsgStatus, State1),
- dropwhile(Pred, AckRequired, State2);
+ dropwhile(Pred, AckRequired, State2, undefined);
{false, _} ->
End(a(in_r(MsgStatus, State1)))
end