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

dataroaring 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 3ed99845a1d [fix](inverted index) Fix undefined behavior in write_v2 
(#44084)
3ed99845a1d is described below

commit 3ed99845a1d9ffb54f3d591de03a91dfd4af597d
Author: zzzxl <[email protected]>
AuthorDate: Sun Nov 17 21:17:14 2024 +0800

    [fix](inverted index) Fix undefined behavior in write_v2 (#44084)
    
    
    1. Fix undefined behavior in finalize_output_dir caused by exception
    testing
---
 .../segment_v2/inverted_index_file_writer.cpp      | 66 ++++++++++++----------
 1 file changed, 35 insertions(+), 31 deletions(-)

diff --git a/be/src/olap/rowset/segment_v2/inverted_index_file_writer.cpp 
b/be/src/olap/rowset/segment_v2/inverted_index_file_writer.cpp
index 74f7398ea4a..2d50730daff 100644
--- a/be/src/olap/rowset/segment_v2/inverted_index_file_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/inverted_index_file_writer.cpp
@@ -243,7 +243,9 @@ void InvertedIndexFileWriter::copyFile(const char* 
fileName, lucene::store::Dire
 
 Status InvertedIndexFileWriter::write_v1() {
     int64_t total_size = 0;
+    std::string err_msg;
     lucene::store::Directory* out_dir = nullptr;
+    std::exception_ptr eptr;
     std::unique_ptr<lucene::store::IndexOutput> output = nullptr;
     for (const auto& entry : _indices_dirs) {
         const int64_t index_id = entry.first.first;
@@ -268,38 +270,39 @@ Status InvertedIndexFileWriter::write_v1() {
             write_header_and_data_v1(output.get(), sorted_files, directory, 
header_length,
                                      header_file_count);
 
-            // Close and clean up
-            finalize_output_dir(out_dir);
-
             // Collect file information
             auto compound_file_size = output->getFilePointer() - start;
-            output->close();
             total_size += compound_file_size;
             add_index_info(index_id, index_suffix, compound_file_size);
-
         } catch (CLuceneError& err) {
-            finalize_output_dir(out_dir);
-            if (output != nullptr) {
-                output->close();
-                output.reset();
-            }
+            eptr = std::current_exception();
             auto index_path = InvertedIndexDescriptor::get_index_file_path_v1(
                     _index_path_prefix, index_id, index_suffix);
-            LOG(ERROR) << "CLuceneError occur when write_v1 idx file " << 
index_path
-                       << " error msg: " << err.what();
+            err_msg = "CLuceneError occur when write_v1 idx file " + 
index_path +
+                      " error msg: " + err.what();
+        }
 
-            return Status::Error<ErrorCode::INVERTED_INDEX_CLUCENE_ERROR>(
-                    "CLuceneError occur when write_v1 idx file: {}, error msg: 
{}", index_path,
-                    err.what());
+        // Close and clean up
+        finalize_output_dir(out_dir);
+        if (output) {
+            output->close();
+        }
+
+        if (eptr) {
+            LOG(ERROR) << err_msg;
+            return 
Status::Error<ErrorCode::INVERTED_INDEX_CLUCENE_ERROR>(err_msg);
         }
     }
+
     _total_file_size = total_size;
     return Status::OK();
 }
 
 Status InvertedIndexFileWriter::write_v2() {
+    std::string err_msg;
     lucene::store::Directory* out_dir = nullptr;
     std::unique_ptr<lucene::store::IndexOutput> compound_file_output = nullptr;
+    std::exception_ptr eptr;
     try {
         // Calculate header length and initialize offset
         int64_t current_offset = headerLength();
@@ -320,29 +323,30 @@ Status InvertedIndexFileWriter::write_v2() {
         // Copy file data
         copy_files_data_v2(compound_file_output.get(), file_metadata);
 
-        // Close and clean up
-        finalize_output_dir(out_dir);
         _total_file_size = compound_file_output->getFilePointer();
         _file_info.set_index_size(_total_file_size);
-        compound_file_output->close();
-        return Status::OK();
     } catch (CLuceneError& err) {
-        io::Path index_path 
{InvertedIndexDescriptor::get_index_file_path_v2(_index_path_prefix)};
-        LOG(ERROR) << "CLuceneError occur when close idx file " << index_path
-                   << " error msg: " << err.what();
-        if (compound_file_output != nullptr) {
-            compound_file_output->close();
-            compound_file_output.reset();
-        }
-        finalize_output_dir(out_dir);
-        return Status::Error<ErrorCode::INVERTED_INDEX_CLUCENE_ERROR>(
-                "CLuceneError occur when close idx file: {}, error msg: {}", 
index_path.c_str(),
-                err.what());
+        eptr = std::current_exception();
+        auto index_path = 
InvertedIndexDescriptor::get_index_file_path_v2(_index_path_prefix);
+        err_msg = "CLuceneError occur when close idx file " + index_path +
+                  " error msg: " + err.what();
     }
+
+    // Close and clean up
+    finalize_output_dir(out_dir);
+    if (compound_file_output) {
+        compound_file_output->close();
+    }
+
+    if (eptr) {
+        LOG(ERROR) << err_msg;
+        return Status::Error<ErrorCode::INVERTED_INDEX_CLUCENE_ERROR>(err_msg);
+    }
+
+    return Status::OK();
 }
 
 // Helper function implementations
-
 std::vector<FileInfo> InvertedIndexFileWriter::prepare_sorted_files(
         lucene::store::Directory* directory) {
     std::vector<std::string> files;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to