diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_queue_index.erl | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/src/rabbit_queue_index.erl b/src/rabbit_queue_index.erl index 67bf9f5236..acd13a0640 100644 --- a/src/rabbit_queue_index.erl +++ b/src/rabbit_queue_index.erl @@ -241,8 +241,8 @@ init(Name, MsgStoreRecovered, ContainsCheckFun) -> end, {Segments, 0}, all_segment_nums(State1)); true -> %% At this stage, we will only know about files that - %% were loaded during journal loading, They *will* have - %% correct ack and pub counts, but for all remaining + %% were loaded during journal loading, They *will* + %% have correct unacked counts, but for all remaining %% segments, if they're not in the Segments store then %% we need to add them and populate with saved data. SegmentDictTerms = @@ -590,23 +590,18 @@ flush_journal(State = #qistate { dirty_count = 0 }) -> flush_journal(State = #qistate { segments = Segments }) -> Segments1 = segment_fold( - fun (_Seg, #segment { journal_entries = JEntries, - unacked = UnackedCount } = Segment, - SegmentsN) -> - case UnackedCount of - 0 -> ok = delete_segment(Segment), - SegmentsN; - _ -> segment_store( - append_journal_to_segment(Segment, JEntries), - SegmentsN) - end + fun (_Seg, #segment { unacked = 0 } = Segment, SegmentsN) -> + ok = delete_segment(Segment), + SegmentsN; + (_Seg, #segment {} = Segment, SegmentsN) -> + segment_store(append_journal_to_segment(Segment), SegmentsN) end, segments_new(), Segments), {JournalHdl, State1} = get_journal_handle(State #qistate { segments = Segments1 }), ok = file_handle_cache:clear(JournalHdl), State1 #qistate { dirty_count = 0 }. -append_journal_to_segment(Segment, JEntries) -> +append_journal_to_segment(#segment { journal_entries = JEntries } = Segment) -> case array:sparse_size(JEntries) of 0 -> Segment; _ -> {Hdl, Segment1} = get_segment_handle(Segment), @@ -642,15 +637,12 @@ load_journal(State) -> %% counts here are purely from the segment itself. {SegEntries, UnackedCountInSeg, Segment1} = load_segment(true, Segment), - %% Removed counts here are the number of pubs and - %% acks that are duplicates - i.e. found in both the - %% segment and journal. {JEntries1, UnackedCountDuplicates} = journal_minus_segment(JEntries, SegEntries), Segment1 #segment { journal_entries = JEntries1, - unacked = UnackedCountInJournal + - UnackedCountInSeg - - UnackedCountDuplicates } + unacked = (UnackedCountInJournal + + UnackedCountInSeg - + UnackedCountDuplicates) } end, Segments), State2 #qistate { segments = Segments1 }. @@ -724,12 +716,11 @@ get_segment_handle(Segment = #segment { handle = Hdl }) -> {Hdl, Segment}. segment_new(Seg, Dir) -> - #segment { unacked = 0, - handle = undefined, + #segment { unacked = 0, + handle = undefined, journal_entries = array_new(), - path = seg_num_to_path(Dir, Seg), - num = Seg - }. + path = seg_num_to_path(Dir, Seg), + num = Seg }. segment_find_or_new(Seg, Dir, Segments) -> case segment_find(Seg, Segments) of |
