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