summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2010-05-19 08:56:25 +0100
committerMatthias Radestock <matthias@lshift.net>2010-05-19 08:56:25 +0100
commit697235703495a36b596ea2ef91d44bb1f4f6b7ca (patch)
tree1b975db75a88bdda95208986637f8e555f610635
parent83b9512dec13fc71d3d99f04193e4d32f1cbd38d (diff)
downloadrabbitmq-server-git-697235703495a36b596ea2ef91d44bb1f4f6b7ca.tar.gz
seed journal_minus_segment with the original journal
...and modify/remove things in/from it; rather than building a new journal from scratch. The result is the same, but this way of doing things a) better reflects what this function is about, and b) should be more efficient in the common case where the journal does not contain stale entries
-rw-r--r--src/rabbit_queue_index.erl45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/rabbit_queue_index.erl b/src/rabbit_queue_index.erl
index 5e53e90972..ff2d3360ec 100644
--- a/src/rabbit_queue_index.erl
+++ b/src/rabbit_queue_index.erl
@@ -929,12 +929,13 @@ journal_minus_segment(JEntries, SegEntries) ->
{Obj, PubsRemovedDelta, AcksRemovedDelta} =
journal_minus_segment1(JObj, SegEntry),
{case Obj of
- undefined -> JEntriesOut;
+ keep -> JEntriesOut;
+ undefined -> array:reset(RelSeq, JEntriesOut);
_ -> array:set(RelSeq, Obj, JEntriesOut)
end,
PubsRemoved + PubsRemovedDelta,
AcksRemoved + AcksRemovedDelta}
- end, {array_new(), 0, 0}, JEntries).
+ end, {JEntries, 0, 0}, JEntries).
%% Here, the result is a triple with the first element containing the
%% item we are adding to or modifying in the (initially fresh) journal
@@ -944,45 +945,45 @@ journal_minus_segment(JEntries, SegEntries) ->
%% publish or ack is in both the journal and the segment.
%% Both the same. Must be at least the publish
-journal_minus_segment1({?PUB, _Del, no_ack} = Obj, Obj) ->
+journal_minus_segment1({?PUB, _Del, no_ack} = Obj, Obj) ->
{undefined, 1, 0};
-journal_minus_segment1({?PUB, _Del, ack} = Obj, Obj) ->
+journal_minus_segment1({?PUB, _Del, ack} = Obj, Obj) ->
{undefined, 1, 1};
%% Just publish in journal
-journal_minus_segment1({?PUB, no_del, no_ack} = Obj, undefined) ->
- {Obj, 0, 0};
+journal_minus_segment1({?PUB, no_del, no_ack}, undefined) ->
+ {keep, 0, 0};
%% Publish and deliver in journal
-journal_minus_segment1({?PUB, del, no_ack} = Obj, undefined) ->
- {Obj, 0, 0};
-journal_minus_segment1({?PUB = Pub, del, no_ack}, {Pub, no_del, no_ack}) ->
+journal_minus_segment1({?PUB, del, no_ack}, undefined) ->
+ {keep, 0, 0};
+journal_minus_segment1({?PUB = Pub, del, no_ack}, {Pub, no_del, no_ack}) ->
{{no_pub, del, no_ack}, 1, 0};
%% Publish, deliver and ack in journal
-journal_minus_segment1({?PUB, del, ack}, undefined) ->
+journal_minus_segment1({?PUB, del, ack}, undefined) ->
{undefined, 0, 0};
-journal_minus_segment1({?PUB = Pub, del, ack}, {Pub, no_del, no_ack}) ->
+journal_minus_segment1({?PUB = Pub, del, ack}, {Pub, no_del, no_ack}) ->
{{no_pub, del, ack}, 1, 0};
-journal_minus_segment1({?PUB = Pub, del, ack}, {Pub, del, no_ack}) ->
+journal_minus_segment1({?PUB = Pub, del, ack}, {Pub, del, no_ack}) ->
{{no_pub, no_del, ack}, 1, 0};
%% Just deliver in journal
-journal_minus_segment1({no_pub, del, no_ack} = Obj, {?PUB, no_del, no_ack}) ->
- {Obj, 0, 0};
-journal_minus_segment1({no_pub, del, no_ack}, {?PUB, del, no_ack}) ->
+journal_minus_segment1({no_pub, del, no_ack}, {?PUB, no_del, no_ack}) ->
+ {keep, 0, 0};
+journal_minus_segment1({no_pub, del, no_ack}, {?PUB, del, no_ack}) ->
{undefined, 0, 0};
%% Just ack in journal
-journal_minus_segment1({no_pub, no_del, ack} = Obj, {?PUB, del, no_ack}) ->
- {Obj, 0, 0};
-journal_minus_segment1({no_pub, no_del, ack}, {?PUB, del, ack}) ->
+journal_minus_segment1({no_pub, no_del, ack}, {?PUB, del, no_ack}) ->
+ {keep, 0, 0};
+journal_minus_segment1({no_pub, no_del, ack}, {?PUB, del, ack}) ->
{undefined, 0, 1};
%% Deliver and ack in journal
-journal_minus_segment1({no_pub, del, ack} = Obj, {?PUB, no_del, no_ack}) ->
- {Obj, 0, 0};
-journal_minus_segment1({no_pub, del, ack}, {?PUB, del, no_ack}) ->
+journal_minus_segment1({no_pub, del, ack}, {?PUB, no_del, no_ack}) ->
+ {keep, 0, 0};
+journal_minus_segment1({no_pub, del, ack}, {?PUB, del, no_ack}) ->
{{no_pub, no_del, ack}, 0, 0};
-journal_minus_segment1({no_pub, del, ack}, {?PUB, del, ack}) ->
+journal_minus_segment1({no_pub, del, ack}, {?PUB, del, ack}) ->
{undefined, 0, 1}.