diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-05-14 17:57:42 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-05-14 17:57:42 +0100 |
| commit | aeaf352012fe114b3e50cf90bd0aca0c18e85b74 (patch) | |
| tree | f14f8834f170c1ae463444fb3d7d4f66f649bc1e /src | |
| parent | ede34cf5cfd141842babcd43f0c635614b2698a0 (diff) | |
| download | rabbitmq-server-git-aeaf352012fe114b3e50cf90bd0aca0c18e85b74.tar.gz | |
Reworking shuffle_up to sate Matthias's passion for beautiful code
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_disk_queue.erl | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/src/rabbit_disk_queue.erl b/src/rabbit_disk_queue.erl index 63076eb914..e3b47e89dc 100644 --- a/src/rabbit_disk_queue.erl +++ b/src/rabbit_disk_queue.erl @@ -1069,30 +1069,28 @@ remove_gaps_in_sequences(#dqstate { sequences = Sequences }) -> ok = mnesia:write_lock_table(rabbit_disk_queue), lists:foreach( fun ({Q, ReadSeqId, WriteSeqId}) -> - Gap = shuffle_up(Q, WriteSeqId - 1, WriteSeqId - ReadSeqId, 0), + Gap = shuffle_up(Q, ReadSeqId - 1, WriteSeqId - 1, 0), true = ets:insert(Sequences, {Q, ReadSeqId + Gap, WriteSeqId}) end, ets:match_object(Sequences, '_')) end). -shuffle_up(_Q, _SeqId, 0, Gap) -> +shuffle_up(_Q, SeqId, SeqId, Gap) -> Gap; -shuffle_up(Q, SeqId, N, 0) -> - %% no gaps so far so don't need to rewrite - case mnesia:read(rabbit_disk_queue, {Q, SeqId}, write) of - [] -> shuffle_up(Q, SeqId - 1, N - 1, 1); - _ -> shuffle_up(Q, SeqId - 1, N - 1, 0) - end; -shuffle_up(Q, SeqId, N, Gap) -> - %% have gaps, so whenever we find something, rewrite it higher up - case mnesia:read(rabbit_disk_queue, {Q, SeqId}, write) of - [] -> shuffle_up(Q, SeqId - 1, N - 1, Gap + 1); - [Obj = #dq_msg_loc { is_delivered = true }] -> - mnesia:write(rabbit_disk_queue, - Obj #dq_msg_loc { queue_and_seq_id = {Q, SeqId + Gap }}, - write), - mnesia:delete(rabbit_disk_queue, {Q, SeqId}, write), - shuffle_up(Q, SeqId - 1, N - 1, Gap) - end. +shuffle_up(Q, BaseSeqId, SeqId, Gap) -> + GapInc = + case mnesia:read(rabbit_disk_queue, {Q, SeqId}, write) of + [] -> 1; + [Obj = #dq_msg_loc { is_delivered = IsDelivered }] when IsDelivered + orelse (Gap =:= 0) -> + if Gap =:= 0 -> ok; + true -> mnesia:write(rabbit_disk_queue, + Obj #dq_msg_loc { queue_and_seq_id = {Q, SeqId + Gap }}, + write), + mnesia:delete(rabbit_disk_queue, {Q, SeqId}, write) + end, + 0 + end, + shuffle_up(Q, BaseSeqId, SeqId - 1, Gap + GapInc). load_messages(undefined, [], State = #dqstate { file_summary = FileSummary, current_file_name = CurName }) -> |
