This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new a7180c5ad8 [fix](segcompaction) fix segcompaction failed for newly created segment (#15022) (#15023) a7180c5ad8 is described below commit a7180c5ad845a5bdf43eaa38a3ccce26ab9e0574 Author: zhengyu <freeman.zhang1...@gmail.com> AuthorDate: Mon Dec 19 14:17:58 2022 +0800 [fix](segcompaction) fix segcompaction failed for newly created segment (#15022) (#15023) Currently, newly created segment could be chosen to be compaction candidate, which is prone to bugs and segment file open failures. We should skip last (maybe active) segment while doing segcompaction. --- be/src/olap/rowset/beta_rowset_writer.cpp | 9 +++++---- be/src/olap/rowset/beta_rowset_writer.h | 3 ++- be/test/olap/segcompaction_test.cpp | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index ac5bf223e5..8da5ca117a 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -383,12 +383,12 @@ void BetaRowsetWriter::compact_segments(SegCompactionCandidatesSharedPtr segment } Status BetaRowsetWriter::_load_noncompacted_segments( - std::vector<segment_v2::SegmentSharedPtr>* segments) { + std::vector<segment_v2::SegmentSharedPtr>* segments, size_t num) { auto fs = _rowset_meta->fs(); if (!fs) { return Status::Error<INIT_FAILED>(); } - for (int seg_id = _segcompacted_point; seg_id < _num_segment; ++seg_id) { + for (int seg_id = _segcompacted_point; seg_id < num; ++seg_id) { auto seg_path = BetaRowset::segment_file_path(_context.rowset_dir, _context.rowset_id, seg_id); auto cache_path = @@ -415,7 +415,8 @@ Status BetaRowsetWriter::_load_noncompacted_segments( Status BetaRowsetWriter::_find_longest_consecutive_small_segment( SegCompactionCandidatesSharedPtr segments) { std::vector<segment_v2::SegmentSharedPtr> all_segments; - RETURN_NOT_OK(_load_noncompacted_segments(&all_segments)); + // subtract one to skip last (maybe active) segment + RETURN_NOT_OK(_load_noncompacted_segments(&all_segments, _num_segment - 1)); if (VLOG_DEBUG_IS_ON) { vlog_buffer.clear(); @@ -473,7 +474,7 @@ Status BetaRowsetWriter::_get_segcompaction_candidates(SegCompactionCandidatesSh VLOG_DEBUG << "segcompaction last few segments"; // currently we only rename remaining segments to reduce wait time // so that transaction can be committed ASAP - RETURN_NOT_OK(_load_noncompacted_segments(segments.get())); + RETURN_NOT_OK(_load_noncompacted_segments(segments.get(), _num_segment)); for (int i = 0; i < segments->size(); ++i) { RETURN_NOT_OK(_rename_compacted_segment_plain(_segcompacted_point++)); } diff --git a/be/src/olap/rowset/beta_rowset_writer.h b/be/src/olap/rowset/beta_rowset_writer.h index c9ec00c9b4..d291253937 100644 --- a/be/src/olap/rowset/beta_rowset_writer.h +++ b/be/src/olap/rowset/beta_rowset_writer.h @@ -112,7 +112,8 @@ private: Status _delete_original_segments(uint32_t begin, uint32_t end); Status _rename_compacted_segments(int64_t begin, int64_t end); Status _rename_compacted_segment_plain(uint64_t seg_id); - Status _load_noncompacted_segments(std::vector<segment_v2::SegmentSharedPtr>* segments); + Status _load_noncompacted_segments(std::vector<segment_v2::SegmentSharedPtr>* segments, + size_t num); Status _find_longest_consecutive_small_segment(SegCompactionCandidatesSharedPtr segments); Status _get_segcompaction_candidates(SegCompactionCandidatesSharedPtr& segments, bool is_last); Status _wait_flying_segcompaction(); diff --git a/be/test/olap/segcompaction_test.cpp b/be/test/olap/segcompaction_test.cpp index eec98ca741..80af09f65f 100644 --- a/be/test/olap/segcompaction_test.cpp +++ b/be/test/olap/segcompaction_test.cpp @@ -253,6 +253,7 @@ TEST_F(SegCompactionTest, SegCompactionThenRead) { ls.push_back("10047_3.dat"); ls.push_back("10047_4.dat"); ls.push_back("10047_5.dat"); + ls.push_back("10047_6.dat"); EXPECT_TRUE(check_dir(ls)); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org