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

gavinchou 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 2c7b883dd6c [Fix](core) Fix null ptr introduced by #42949 (#46074)
2c7b883dd6c is described below

commit 2c7b883dd6cf61a70ab0059a9ac7e345610912f6
Author: abmdocrt <lianyuk...@selectdb.com>
AuthorDate: Fri Dec 27 19:59:11 2024 +0800

    [Fix](core) Fix null ptr introduced by #42949 (#46074)
    
    In PR #42949, during the rowset ID initialization process, we used a
    random ID to replace the rowset ID that failed during serialization.
    However, the generation of random IDs depends on the storage engine,
    which hasn't been initialized during the rowset ID initialization
    process, leading to a core dump. This PR fixes this issue by uniformly
    using MAX_ROWSET_ID-1 to replace the failed rowset ID. This approach is
    safe because the rowset ID generator won't generate such a large ID, and
    we can consider all rowsets with rowset ID equal to MAX_ROWSET_ID-1 as
    failed initialization rowsets that should rely on multiple replicas for
    automatic recovery.
---
 be/src/olap/olap_common.h                         |  4 +---
 be/src/olap/rowset/unique_rowset_id_generator.cpp |  9 ---------
 be/test/olap/rowset/rowset_meta_test.cpp          | 10 ++++++++++
 3 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/be/src/olap/olap_common.h b/be/src/olap/olap_common.h
index a83e6a6df63..cd7d3961871 100644
--- a/be/src/olap/olap_common.h
+++ b/be/src/olap/olap_common.h
@@ -420,8 +420,6 @@ using ColumnId = uint32_t;
 using UniqueIdSet = std::set<uint32_t>;
 // Column unique Id -> column id map
 using UniqueIdToColumnIdMap = std::map<ColumnId, ColumnId>;
-struct RowsetId;
-RowsetId next_rowset_id();
 
 // 8 bit rowset id version
 // 56 bit, inc number from 1
@@ -442,7 +440,7 @@ struct RowsetId {
             if (ec != std::errc {}) [[unlikely]] {
                 if (config::force_regenerate_rowsetid_on_start_error) {
                     LOG(WARNING) << "failed to init rowset id: " << 
rowset_id_str;
-                    high = next_rowset_id().hi;
+                    high = MAX_ROWSET_ID - 1;
                 } else {
                     throw Exception(
                             Status::FatalError("failed to init rowset id: {}", 
rowset_id_str));
diff --git a/be/src/olap/rowset/unique_rowset_id_generator.cpp 
b/be/src/olap/rowset/unique_rowset_id_generator.cpp
index 49e07e58359..0ac7f63837a 100644
--- a/be/src/olap/rowset/unique_rowset_id_generator.cpp
+++ b/be/src/olap/rowset/unique_rowset_id_generator.cpp
@@ -17,17 +17,8 @@
 
 #include "olap/rowset/unique_rowset_id_generator.h"
 
-#include <atomic>
-
-#include "olap/storage_engine.h"
-#include "runtime/exec_env.h"
-
 namespace doris {
 
-RowsetId next_rowset_id() {
-    return ExecEnv::GetInstance()->storage_engine().next_rowset_id();
-}
-
 UniqueRowsetIdGenerator::UniqueRowsetIdGenerator(const UniqueId& backend_uid)
         : _backend_uid(backend_uid), _inc_id(1) {}
 
diff --git a/be/test/olap/rowset/rowset_meta_test.cpp 
b/be/test/olap/rowset/rowset_meta_test.cpp
index 881ce383810..cb1b2865c14 100644
--- a/be/test/olap/rowset/rowset_meta_test.cpp
+++ b/be/test/olap/rowset/rowset_meta_test.cpp
@@ -21,6 +21,7 @@
 #include <gmock/gmock-matchers.h>
 #include <gtest/gtest-message.h>
 #include <gtest/gtest-test-part.h>
+#include <gtest/gtest.h>
 
 #include <filesystem>
 #include <fstream>
@@ -113,4 +114,13 @@ TEST_F(RowsetMetaTest, TestInitWithInvalidData) {
     EXPECT_FALSE(rowset_meta.init("invalid pb meta data"));
 }
 
+TEST_F(RowsetMetaTest, TestRowsetIdInit) {
+    RowsetId id {};
+    config::force_regenerate_rowsetid_on_start_error = true;
+    std::string_view rowset_id_str = "test";
+    id.init(rowset_id_str);
+    // 0x100000000000000 - 0x01
+    EXPECT_EQ(id.to_string(), "72057594037927935");
+}
+
 } // namespace doris


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

Reply via email to