diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2013-01-12 23:42:31 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2013-01-12 23:42:31 +0000 |
commit | f124f37d956f0352b224594bb1a9eb6c4bee756b (patch) | |
tree | 64d5f8266634314c5a70fde85deae0353be937b1 | |
parent | 07f8258d198282e7c974564fe371c8bf324923cf (diff) | |
parent | 304ee315b59815ec5e20bcb8b25d31f2e6b18b84 (diff) | |
download | rabbitmq-server-f124f37d956f0352b224594bb1a9eb6c4bee756b.tar.gz |
merge bug25397 into bug25395
-rw-r--r-- | src/rabbit_variable_queue.erl | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/src/rabbit_variable_queue.erl b/src/rabbit_variable_queue.erl index baeb4721..dcaaa5ed 100644 --- a/src/rabbit_variable_queue.erl +++ b/src/rabbit_variable_queue.erl @@ -1449,45 +1449,45 @@ delta_limit(#delta { start_seq_id = StartSeqId }) -> StartSeqId. iterator(State) -> istate(start, State). -istate(start, State) -> {q4, State#vqstate.q4}; -istate(q4, State) -> {q3, State#vqstate.q3}; -istate(q3, State) -> {delta, State#vqstate.delta}; -istate(delta, State) -> {q2, State#vqstate.q2}; -istate(q2, State) -> {q1, State#vqstate.q1}; +istate(start, State) -> {q4, State#vqstate.q4, State}; +istate(q4, State) -> {q3, State#vqstate.q3, State}; +istate(q3, State) -> {delta, State#vqstate.delta, State}; +istate(delta, State) -> {q2, State#vqstate.q2, State}; +istate(q2, State) -> {q1, State#vqstate.q1, State}; istate(q1, _State) -> done. -next(done, State) -> {empty, State}; -next({delta, #delta{start_seq_id = SeqId, end_seq_id = SeqId}}, State) -> - next(istate(delta, State), State); -next({delta, Delta = #delta{start_seq_id = SeqId, end_seq_id = SeqIdEnd}}, - State = #vqstate{index_state = IndexState}) -> +next(done, IndexState) -> {empty, IndexState}; +next({delta, #delta{start_seq_id = SeqId, + end_seq_id = SeqId}, State}, IndexState) -> + next(istate(delta, State), IndexState); +next({delta, #delta{start_seq_id = SeqId, + end_seq_id = SeqIdEnd} = Delta, State}, IndexState) -> SeqIdB = rabbit_queue_index:next_segment_boundary(SeqId), SeqId1 = lists:min([SeqIdB, SeqIdEnd]), {List, IndexState1} = rabbit_queue_index:read(SeqId, SeqId1, IndexState), - next({delta, Delta#delta{start_seq_id = SeqId1}, List}, - State#vqstate{index_state = IndexState1}); -next({delta, Delta, []}, State) -> next({delta, Delta}, State); -next({delta, Delta, [M | Rest]}, State) -> - {MsgId, _SeqId, MsgProps, IsPersistent, _IsDelivered} = M, - {Msg, State1} = read_msg(MsgId, IsPersistent, State), - {value, Msg, MsgProps, {delta, Delta, Rest}, State1}; -next({Key, Q}, State) -> + next({delta, Delta#delta{start_seq_id = SeqId1}, List, State}, IndexState1); +next({delta, Delta, [], State}, IndexState) -> + next({delta, Delta, State}, IndexState); +next({delta, Delta, [M | Rest], State}, IndexState) -> + {value, beta_msg_status(M), {delta, Delta, Rest, State}, IndexState}; +next({Key, Q, State}, IndexState) -> case ?QUEUE:out(Q) of - {empty, _Q} -> next(istate(Key, State), State); - {{value, MsgStatus}, QN} -> {Msg, State1} = read_msg(MsgStatus, State), - MsgProps = MsgStatus#msg_status.msg_props, - {value, Msg, MsgProps, {Key, QN}, State1} + {empty, _Q} -> next(istate(Key, State), IndexState); + {{value, MsgStatus}, QN} -> {value, MsgStatus, {Key, QN, State}, + IndexState} end. -ifold(Fun, Acc, It, State) -> - case next(It, State) of - {value, Msg, MsgProps, Next, State1} -> - case Fun(Msg, MsgProps, Acc) of - {stop, Acc1} -> {Acc1, State1}; - {cont, Acc1} -> ifold(Fun, Acc1, Next, State1) +ifold(Fun, Acc, It, State = #vqstate{index_state = IndexState}) -> + case next(It, IndexState) of + {value, MsgStatus, Next, IndexState1} -> + State1 = State#vqstate{index_state = IndexState1}, + {Msg, State2} = read_msg(MsgStatus, State1), + case Fun(Msg, MsgStatus#msg_status.msg_props, Acc) of + {stop, Acc1} -> {Acc1, State2}; + {cont, Acc1} -> ifold(Fun, Acc1, Next, State2) end; - {empty, State1} -> - {Acc, State1} + {empty, IndexState1} -> + {Acc, State#vqstate{index_state = IndexState1}} end. %%---------------------------------------------------------------------------- |