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 2bfca29c0ea [fix](cloud) Fix txn kv destruction order
2bfca29c0ea is described below

commit 2bfca29c0eae6da8fee8c4f142a9748fd6e38514
Author: walter <[email protected]>
AuthorDate: Tue Mar 24 10:46:57 2026 +0800

    [fix](cloud) Fix txn kv destruction order
    
    ```
    ==1472432==ERROR: AddressSanitizer: heap-use-after-free on address 
0x7bc7535fba50 at pc 0x557ec5178739 bp 0x7b1743746d40 sp 0x7b1743746500
    WRITE of size 104 at 0x7bc7535fba50 thread T2
        #0 0x557ec5178738 in memset 
~/workspace/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc:87:3
        #1 0x7f17566e64fc in fdb_transaction_set_option (libfdb_c.so+0xc014fc) 
(BuildId: 854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #2 0x7f17566e2e47 in fdb_transaction_set_option (libfdb_c.so+0xbfde47) 
(BuildId: 854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #3 0x7f17566e4ec5 in fdb_transaction_set_option (libfdb_c.so+0xbffec5) 
(BuildId: 854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #4 0x7f17564f80ee in fdb_transaction_set_option (libfdb_c.so+0xa130ee) 
(BuildId: 854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #5 0x7f1755e55b71 in fdb_transaction_set_option (libfdb_c.so+0x370b71) 
(BuildId: 854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #6 0x7f1755e2b2e9 in fdb_run_network (libfdb_c.so+0x3462e9) (BuildId: 
854ec989d11d3c183aa4963a6d758cfc2b571b07)
        #7 0x557ec6595a2b in doris::cloud::fdb::Network::init()::::operator()() 
const ~/workspace/doris/cloud/ut_build_ASAN/../src/meta-store/txn_kv.cpp:468:28
        #8 0x557ec65958e6 in void std::__invoke_impl<void, 
doris::cloud::fdb::Network::init()::>(std::__invoke_other, 
doris::cloud::fdb::Network::init()::&&) 
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:61:14
        #9 0x557ec6595886 in 
std::__invoke_result<doris::cloud::fdb::Network::init()::>::type 
std::__invoke<doris::cloud::fdb::Network::init()::>(doris::cloud::fdb::Network::init()::&&)
 /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/invoke.h:96:14
        #10 0x557ec659584e in void 
std::thread::_Invoker<std::tuple<doris::cloud::fdb::Network::init()::>>::_M_invoke<0ul>(std::_Index_tuple<0ul>)
 
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:292:13
        #11 0x557ec6595816 in 
std::thread::_Invoker<std::tuple<doris::cloud::fdb::Network::init()::>>::operator()()
 
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:299:11
        #12 0x557ec659571a in 
std::thread::_State_impl<std::thread::_Invoker<std::tuple<doris::cloud::fdb::Network::init()::>>>::_M_run()
 
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/std_thread.h:244:13
        #13 0x557ec7756e43 in execute_native_thread_routine InstrProfilingUtil.c
        #14 0x557ec50b1a07 in asan_thread_start(void*) 
~/workspace/llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:239:43
        #15 0x7f17545caaa3 in start_thread nptl/pthread_create.c:447:8
        #16 0x7f1754657a63 in clone 
misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:100
    ```
---
 cloud/test/mem_txn_kv_test.cpp      |   4 +
 cloud/test/txn_kv_test.cpp          |   3 +
 cloud/test/txn_lazy_commit_test.cpp | 162 ++++++++++++++++++++++--------------
 3 files changed, 105 insertions(+), 64 deletions(-)

diff --git a/cloud/test/mem_txn_kv_test.cpp b/cloud/test/mem_txn_kv_test.cpp
index f9012fb144d..ac00b075b85 100644
--- a/cloud/test/mem_txn_kv_test.cpp
+++ b/cloud/test/mem_txn_kv_test.cpp
@@ -25,6 +25,7 @@
 #include <thread>
 
 #include "common/config.h"
+#include "common/defer.h"
 #include "common/util.h"
 #include "meta-service/doris_txn.h"
 #include "meta-store/codec.h"
@@ -47,6 +48,9 @@ int main(int argc, char** argv) {
         std::cout << "exit inti FdbTxnKv error" << std::endl;
         return -1;
     }
+    DORIS_CLOUD_DEFER {
+        fdb_txn_kv.reset();
+    };
 
     ::testing::InitGoogleTest(&argc, argv);
     return RUN_ALL_TESTS();
diff --git a/cloud/test/txn_kv_test.cpp b/cloud/test/txn_kv_test.cpp
index d82fe3806fa..cac05a9e2c5 100644
--- a/cloud/test/txn_kv_test.cpp
+++ b/cloud/test/txn_kv_test.cpp
@@ -59,6 +59,9 @@ int main(int argc, char** argv) {
     config::init(nullptr, true);
     ::testing::InitGoogleTest(&argc, argv);
     init_txn_kv();
+    DORIS_CLOUD_DEFER {
+        txn_kv.reset();
+    };
     return RUN_ALL_TESTS();
 }
 
diff --git a/cloud/test/txn_lazy_commit_test.cpp 
b/cloud/test/txn_lazy_commit_test.cpp
index a7506f52289..6ff0742505f 100644
--- a/cloud/test/txn_lazy_commit_test.cpp
+++ b/cloud/test/txn_lazy_commit_test.cpp
@@ -91,6 +91,7 @@ int main(int argc, char** argv) {
 
     config::label_keep_max_second = 0;
     config::force_immediate_recycle = true;
+    config::log_immediate_flush = true;
 
     if (!doris::cloud::init_glog("txn_lazy_commit_test")) {
         std::cerr << "failed to init glog" << std::endl;
@@ -100,6 +101,9 @@ int main(int argc, char** argv) {
 
     // Initialize FDB
     get_fdb_txn_kv();
+    DORIS_CLOUD_DEFER {
+        txn_kv.reset();
+    };
 
     auto s3_producer_pool = 
std::make_shared<SimpleThreadPool>(config::recycle_pool_parallelism);
     s3_producer_pool->start();
@@ -582,6 +586,11 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithoutDbIdTest) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -659,10 +668,6 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithoutDbIdTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnEventuallyWithAbortedTest) {
@@ -782,6 +787,11 @@ TEST(TxnLazyCommitTest, CommitTxnEventuallyWithDbIdTest) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -840,10 +850,6 @@ TEST(TxnLazyCommitTest, CommitTxnEventuallyWithDbIdTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitVersionedReadTest, CommitTxnEventually) {
@@ -875,6 +881,11 @@ TEST(TxnLazyCommitVersionedReadTest, CommitTxnEventually) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, false);
     std::string instance_id = "test_instance";
@@ -979,10 +990,6 @@ TEST(TxnLazyCommitVersionedReadTest, CommitTxnEventually) {
                 << " status is " << resp.status().DebugString();
         ASSERT_GT(resp.version(), 1);
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitVersionedReadTest, 
DISABLED_CommitTxnEventuallyWithoutDbIdTest) {
@@ -1019,6 +1026,11 @@ TEST(TxnLazyCommitVersionedReadTest, 
DISABLED_CommitTxnEventuallyWithoutDbIdTest
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, false);
     std::string instance_id = "test_instance";
@@ -1114,10 +1126,6 @@ TEST(TxnLazyCommitVersionedReadTest, 
DISABLED_CommitTxnEventuallyWithoutDbIdTest
             }
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnImmediatelyTest) {
@@ -1136,6 +1144,11 @@ TEST(TxnLazyCommitTest, CommitTxnImmediatelyTest) {
         commit_txn_immediatelly_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -1192,10 +1205,6 @@ TEST(TxnLazyCommitTest, CommitTxnImmediatelyTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, NotFallThroughCommitTxnEventuallyTest) {
@@ -1226,6 +1235,11 @@ TEST(TxnLazyCommitTest, 
NotFallThroughCommitTxnEventuallyTest) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -1281,10 +1295,6 @@ TEST(TxnLazyCommitTest, 
NotFallThroughCommitTxnEventuallyTest) {
             check_rowset_meta_not_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, FallThroughCommitTxnEventuallyTest) {
@@ -1316,6 +1326,11 @@ TEST(TxnLazyCommitTest, 
FallThroughCommitTxnEventuallyTest) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -1374,10 +1389,6 @@ TEST(TxnLazyCommitTest, 
FallThroughCommitTxnEventuallyTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, ConcurrentCommitTxnEventuallyCase1Test) {
@@ -1463,6 +1474,11 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase1Test) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -1593,9 +1609,6 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase1Test) {
             << ", txn1_table_version=" << txn1_table_version
             << ", txn2_table_version=" << txn2_table_version;
 
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
     ASSERT_EQ(commit_txn_eventually_begin_count, 3);
     ASSERT_EQ(last_pending_txn_id_count, 1);
     ASSERT_EQ(finish_count, 2);
@@ -1720,6 +1733,11 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase2Test) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -1837,9 +1855,6 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase2Test) {
     thread1.join();
     thread2.join();
 
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
     ASSERT_EQ(commit_txn_immediately_begin_count, 2);
     ASSERT_EQ(last_pending_txn_id_count, 1);
     ASSERT_EQ(immediately_finish_count, 1);
@@ -2001,6 +2016,11 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase3Test) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     int64_t txn_id1 = 0;
     std::thread thread1([&] {
@@ -2088,10 +2108,6 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase3Test) {
     thread1.join();
     thread2.join();
 
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
-
     ASSERT_EQ(get_rowset_begin_count, 2);
     ASSERT_EQ(last_pending_txn_id_count, 1);
     ASSERT_EQ(txn_lazy_committer_submit_count, 1);
@@ -2152,6 +2168,11 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase4Test) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -2226,9 +2247,6 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase4Test) {
         check_txn_not_exist(txn, db_id, txn_id, label);
     }
 
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
     ASSERT_TRUE(commit_txn_eventullay_hit);
     ASSERT_TRUE(abort_timeout_txn_hit);
     ASSERT_EQ(txn_id, txn_info_pb.txn_id());
@@ -2327,6 +2345,11 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase5Test) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -2495,9 +2518,6 @@ TEST(TxnLazyCommitTest, 
ConcurrentCommitTxnEventuallyCase5Test) {
     thread1.join();
     thread2.join();
 
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
     ASSERT_EQ(commit_txn_immediately_begin_count, 2);
     ASSERT_EQ(last_pending_txn_id_count, 1);
     ASSERT_EQ(immediately_finish_count, 1);
@@ -2584,6 +2604,11 @@ TEST(TxnLazyCommitTest, RowsetMetaSizeExceedTest) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
     {
         brpc::Controller cntl;
         GetRowsetRequest req;
@@ -2683,6 +2708,11 @@ TEST(TxnLazyCommitTest, RecyclePartitions) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -2772,10 +2802,6 @@ TEST(TxnLazyCommitTest, RecyclePartitions) {
     }
 
     ASSERT_EQ(recycler.recycle_partitions(), 0);
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, RecycleIndexes) {
@@ -2831,6 +2857,11 @@ TEST(TxnLazyCommitTest, RecycleIndexes) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     // mock rowset and tablet
@@ -2918,10 +2949,6 @@ TEST(TxnLazyCommitTest, RecycleIndexes) {
     }
 
     ASSERT_EQ(recycler.recycle_indexes(), 0);
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnEventuallyWithMultiTableTest) {
@@ -2943,6 +2970,11 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithMultiTableTest) {
         commit_txn_eventually_finish_hit = true;
     });
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -3011,10 +3043,6 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithMultiTableTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnEventuallyWithHugeRowsetMetaTest) {
@@ -3045,6 +3073,11 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithHugeRowsetMetaTest) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -3113,10 +3146,6 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithHugeRowsetMetaTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnEventuallyWithSchemaChangeTest) {
@@ -3187,6 +3216,11 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithSchemaChangeTest) {
     });
 
     sp->enable_processing();
+    DORIS_CLOUD_DEFER {
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
+    };
 
     auto meta_service = get_meta_service(txn_kv, true);
     brpc::Controller cntl;
@@ -3291,9 +3325,6 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithSchemaChangeTest) {
             check_rowset_meta_exist(txn, tablet_id, 2);
         }
     }
-    sp->clear_all_call_backs();
-    sp->clear_trace();
-    sp->disable_processing();
 }
 
 TEST(TxnLazyCommitTest, CommitTxnEventuallyWithAbortAfterCommitTest) {
@@ -3320,7 +3351,9 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithAbortAfterCommitTest) {
     int64_t txn_id = res.txn_id();
     auto sp = SyncPoint::get_instance();
     DORIS_CLOUD_DEFER {
-        SyncPoint::get_instance()->clear_all_call_backs();
+        sp->clear_all_call_backs();
+        sp->clear_trace();
+        sp->disable_processing();
     };
     sp->enable_processing();
     
sp->set_call_back("commit_txn_eventually::abort_txn_after_mark_txn_commited", 
[&](auto&&) {
@@ -3395,6 +3428,7 @@ TEST(TxnLazyCommitTest, 
CommitTxnEventuallyWithManyPartitions) {
     auto sp = SyncPoint::get_instance();
     DORIS_CLOUD_DEFER {
         sp->clear_all_call_backs();
+        sp->clear_trace();
         sp->disable_processing();
     };
     sp->set_call_back("commit_txn_eventually::task->wait", [&](auto&& args) {


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

Reply via email to