This is an automated email from the ASF dual-hosted git repository.

airborne pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new b39e2e13afe [fix](index compaction) fix fd leak and mem leak while 
index compaction #41915 (#42374)
b39e2e13afe is described below

commit b39e2e13afef69733aa51f179178ff8c2b97860a
Author: airborne12 <airborn...@gmail.com>
AuthorDate: Thu Oct 24 14:05:08 2024 +0800

    [fix](index compaction) fix fd leak and mem leak while index compaction 
#41915 (#42374)
    
    cherry pick from #41915
    
    Co-authored-by: camby <camby...@tencent.com>
---
 be/src/olap/compaction.cpp                                |  7 +++----
 .../olap/rowset/segment_v2/inverted_index_compaction.cpp  | 15 +++++++--------
 be/src/olap/rowset/segment_v2/inverted_index_compaction.h |  4 +++-
 3 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/be/src/olap/compaction.cpp b/be/src/olap/compaction.cpp
index ecba51fe50d..236e5d4ac7b 100644
--- a/be/src/olap/compaction.cpp
+++ b/be/src/olap/compaction.cpp
@@ -708,19 +708,18 @@ Status Compaction::do_inverted_index_compaction() {
         }
 
         std::vector<lucene::store::Directory*> 
dest_index_dirs(dest_segment_num);
-        std::vector<lucene::store::Directory*> src_index_dirs(src_segment_num);
         try {
+            std::vector<std::unique_ptr<DorisCompoundReader>> 
src_idx_dirs(src_segment_num);
             for (int src_segment_id = 0; src_segment_id < src_segment_num; 
src_segment_id++) {
-                auto src_dir =
+                src_idx_dirs[src_segment_id] =
                         
DORIS_TRY(inverted_index_file_readers[src_segment_id]->open(index_meta));
-                src_index_dirs[src_segment_id] = src_dir.release();
             }
             for (int dest_segment_id = 0; dest_segment_id < dest_segment_num; 
dest_segment_id++) {
                 auto* dest_dir =
                         
DORIS_TRY(inverted_index_file_writers[dest_segment_id]->open(index_meta));
                 dest_index_dirs[dest_segment_id] = dest_dir;
             }
-            auto st = compact_column(index_meta->index_id(), src_index_dirs, 
dest_index_dirs,
+            auto st = compact_column(index_meta->index_id(), src_idx_dirs, 
dest_index_dirs,
                                      index_tmp_path.native(), trans_vec, 
dest_segment_num_rows);
             if (!st.ok()) {
                 error_handler(index_meta->index_id(), column_uniq_id);
diff --git a/be/src/olap/rowset/segment_v2/inverted_index_compaction.cpp 
b/be/src/olap/rowset/segment_v2/inverted_index_compaction.cpp
index e47189f9137..c51d63d96ce 100644
--- a/be/src/olap/rowset/segment_v2/inverted_index_compaction.cpp
+++ b/be/src/olap/rowset/segment_v2/inverted_index_compaction.cpp
@@ -24,7 +24,8 @@
 #include "util/debug_points.h"
 
 namespace doris::segment_v2 {
-Status compact_column(int64_t index_id, 
std::vector<lucene::store::Directory*>& src_index_dirs,
+Status compact_column(int64_t index_id,
+                      std::vector<std::unique_ptr<DorisCompoundReader>>& 
src_index_dirs,
                       std::vector<lucene::store::Directory*>& dest_index_dirs,
                       std::string_view tmp_path,
                       const std::vector<std::vector<std::pair<uint32_t, 
uint32_t>>>& trans_vec,
@@ -47,7 +48,11 @@ Status compact_column(int64_t index_id, 
std::vector<lucene::store::Directory*>&
                                                            true /* 
closeDirOnShutdown */);
 
     DCHECK_EQ(src_index_dirs.size(), trans_vec.size());
-    index_writer->indexCompaction(src_index_dirs, dest_index_dirs, trans_vec,
+    std::vector<lucene::store::Directory*> 
tmp_src_index_dirs(src_index_dirs.size());
+    for (size_t i = 0; i < tmp_src_index_dirs.size(); ++i) {
+        tmp_src_index_dirs[i] = src_index_dirs[i].get();
+    }
+    index_writer->indexCompaction(tmp_src_index_dirs, dest_index_dirs, 
trans_vec,
                                   dest_segment_num_rows);
 
     index_writer->close();
@@ -56,12 +61,6 @@ Status compact_column(int64_t index_id, 
std::vector<lucene::store::Directory*>&
     // when index_writer is destroyed, if closeDir is set, dir will be close
     // _CLDECDELETE(dir) will try to ref_cnt--, when it decreases to 1, dir 
will be destroyed.
     _CLDECDELETE(dir)
-    for (auto* d : src_index_dirs) {
-        if (d != nullptr) {
-            d->close();
-            _CLDELETE(d);
-        }
-    }
     for (auto* d : dest_index_dirs) {
         if (d != nullptr) {
             // NOTE: DO NOT close dest dir here, because it will be closed 
when dest index writer finalize.
diff --git a/be/src/olap/rowset/segment_v2/inverted_index_compaction.h 
b/be/src/olap/rowset/segment_v2/inverted_index_compaction.h
index c95a4a7ffae..1a6e4748e03 100644
--- a/be/src/olap/rowset/segment_v2/inverted_index_compaction.h
+++ b/be/src/olap/rowset/segment_v2/inverted_index_compaction.h
@@ -23,6 +23,7 @@
 #include <vector>
 
 #include "common/status.h"
+#include "inverted_index_compound_reader.h"
 
 namespace doris {
 class TabletIndex;
@@ -30,7 +31,8 @@ namespace segment_v2 {
 class InvertedIndexFileWriter;
 class InvertedIndexFileReader;
 
-Status compact_column(int64_t index_id, 
std::vector<lucene::store::Directory*>& src_index_dirs,
+Status compact_column(int64_t index_id,
+                      std::vector<std::unique_ptr<DorisCompoundReader>>& 
src_index_dirs,
                       std::vector<lucene::store::Directory*>& dest_index_dirs,
                       std::string_view tmp_path,
                       const std::vector<std::vector<std::pair<uint32_t, 
uint32_t>>>& trans_vec,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to