From 5133b8e4dbfd148ca9c1f1b7fc0eefab128ac951 Mon Sep 17 00:00:00 2001 From: lxy264173 Date: Mon, 15 Dec 2025 19:24:39 +0800 Subject: [PATCH 1/3] fix: prevent glog crash on concurrent initialization --- src/paimon/CMakeLists.txt | 1 + src/paimon/common/logging/logging.cpp | 2 +- src/paimon/common/logging/logging_test.cpp | 39 ++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/paimon/common/logging/logging_test.cpp diff --git a/src/paimon/CMakeLists.txt b/src/paimon/CMakeLists.txt index bba5e07c5..9fa42a985 100644 --- a/src/paimon/CMakeLists.txt +++ b/src/paimon/CMakeLists.txt @@ -335,6 +335,7 @@ if(PAIMON_BUILD_TESTS) common/io/buffered_input_stream_test.cpp common/io/memory_segment_output_stream_test.cpp common/io/offset_input_stream_test.cpp + common/logging/logging_test.cpp common/metrics/metrics_impl_test.cpp common/options/memory_size_test.cpp common/options/time_duration_test.cpp diff --git a/src/paimon/common/logging/logging.cpp b/src/paimon/common/logging/logging.cpp index 96f9971df..58924367d 100644 --- a/src/paimon/common/logging/logging.cpp +++ b/src/paimon/common/logging/logging.cpp @@ -81,7 +81,7 @@ std::unique_ptr Logger::GetLogger(const std::string& path) { std::shared_lock lock(getRegistryLock()); return creator.value()(path); } - + std::unique_lock ulock(getRegistryLock()); if (!google::IsGoogleLoggingInitialized()) { google::InitGoogleLogging(program_invocation_name); } diff --git a/src/paimon/common/logging/logging_test.cpp b/src/paimon/common/logging/logging_test.cpp new file mode 100644 index 000000000..ee0bf0dba --- /dev/null +++ b/src/paimon/common/logging/logging_test.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2025-present Alibaba Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "paimon/logging.h" + +#include +#include +#include + +#include "paimon/common/executor/future.h" +#include "paimon/executor.h" +#include "paimon/testing/utils/testharness.h" +namespace paimon::test { +TEST(LoggerTest, TestMultiThreadGetLogger) { + auto executor = CreateDefaultExecutor(/*thread_count*/ 4); + auto get_logger = []() { + auto logger = Logger::GetLogger("my_log"); + ASSERT_TRUE(logger); + }; + + std::vector> futures; + for (int i = 0; i < 1000; ++i) { + futures.push_back(Via(executor.get(), get_logger)); + } + Wait(futures); +} +} // namespace paimon::test From f090e27272bc11651947bc94dfe92df3213bec9f Mon Sep 17 00:00:00 2001 From: lxy264173 Date: Tue, 16 Dec 2025 09:54:30 +0800 Subject: [PATCH 2/3] fix --- src/paimon/common/logging/logging_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/paimon/common/logging/logging_test.cpp b/src/paimon/common/logging/logging_test.cpp index ee0bf0dba..e1bf3c3d1 100644 --- a/src/paimon/common/logging/logging_test.cpp +++ b/src/paimon/common/logging/logging_test.cpp @@ -24,7 +24,7 @@ #include "paimon/testing/utils/testharness.h" namespace paimon::test { TEST(LoggerTest, TestMultiThreadGetLogger) { - auto executor = CreateDefaultExecutor(/*thread_count*/ 4); + auto executor = CreateDefaultExecutor(/*thread_count=*/ 4); auto get_logger = []() { auto logger = Logger::GetLogger("my_log"); ASSERT_TRUE(logger); From 9808b9d6369750c6e2786c88dc904e4fe31c8729 Mon Sep 17 00:00:00 2001 From: lxy264173 Date: Tue, 16 Dec 2025 09:56:32 +0800 Subject: [PATCH 3/3] fix --- src/paimon/common/logging/logging_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/paimon/common/logging/logging_test.cpp b/src/paimon/common/logging/logging_test.cpp index e1bf3c3d1..61940c2df 100644 --- a/src/paimon/common/logging/logging_test.cpp +++ b/src/paimon/common/logging/logging_test.cpp @@ -24,7 +24,7 @@ #include "paimon/testing/utils/testharness.h" namespace paimon::test { TEST(LoggerTest, TestMultiThreadGetLogger) { - auto executor = CreateDefaultExecutor(/*thread_count=*/ 4); + auto executor = CreateDefaultExecutor(/*thread_count=*/4); auto get_logger = []() { auto logger = Logger::GetLogger("my_log"); ASSERT_TRUE(logger);