From f0acd672c203dbb3c14b6510a779c39924698655 Mon Sep 17 00:00:00 2001 From: lixuejian7 Date: Thu, 12 Feb 2026 15:34:00 +0800 Subject: [PATCH 1/5] fix(duplication): fix race condition in _duplications access --- src/replica/duplication/replica_duplicator_manager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/replica/duplication/replica_duplicator_manager.cpp b/src/replica/duplication/replica_duplicator_manager.cpp index 4bdc58f320..ca3df3948d 100644 --- a/src/replica/duplication/replica_duplicator_manager.cpp +++ b/src/replica/duplication/replica_duplicator_manager.cpp @@ -102,6 +102,7 @@ replica_duplicator_manager::get_duplication_confirms_to_update() const void replica_duplicator_manager::sync_duplication(const duplication_entry &ent) { + zauto_lock l(_lock); auto it = ent.progress.find(get_gpid().get_partition_index()); if (it == ent.progress.end()) { // Inconsistent with the meta server. @@ -109,8 +110,6 @@ void replica_duplicator_manager::sync_duplication(const duplication_entry &ent) return; } - zauto_lock l(_lock); - dupid_t dupid = ent.dupid; duplication_status::type next_status = ent.status; @@ -183,7 +182,6 @@ void replica_duplicator_manager::update_confirmed_decree_if_secondary(decree con return; } - zauto_lock l(_lock); remove_all_duplications(); if (confirmed >= 0) { // duplication ongoing // confirmed decree never decreases @@ -197,6 +195,7 @@ void replica_duplicator_manager::update_confirmed_decree_if_secondary(decree con void replica_duplicator_manager::METRIC_FUNC_NAME_SET(dup_pending_mutations)() { + zauto_lock l(_lock); int64_t total = 0; for (const auto &dup : _duplications) { total += dup.second->get_pending_mutations_count(); @@ -227,6 +226,7 @@ replica_duplicator_manager::get_dup_states() const void replica_duplicator_manager::remove_all_duplications() { + zauto_lock l(_lock); // fast path if (_duplications.empty()) { return; From e2349bb1aaa750153430fddeca16b6940f152789 Mon Sep 17 00:00:00 2001 From: lixuejian7 Date: Thu, 12 Feb 2026 15:41:57 +0800 Subject: [PATCH 2/5] fix(duplication): fix potential core of duplication during primary replica migration --- src/task/task.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/task/task.h b/src/task/task.h index 49a5ba05dc..76b23064f5 100644 --- a/src/task/task.h +++ b/src/task/task.h @@ -329,6 +329,12 @@ class raw_task : public task : task(code, hash, node), _cb(std::move(cb)) { } + ~raw_task() override + { + ::dsn::utils::auto_lock<::dsn::utils::ex_lock_nr> l(_lock); + _cb = nullptr; + } + void exec() override { @@ -338,10 +344,16 @@ class raw_task : public task } protected: - void clear_non_trivial_on_task_end() override { _cb = nullptr; } + void clear_non_trivial_on_task_end() override + { + ::dsn::utils::auto_lock<::dsn::utils::ex_lock_nr> l(_lock); + _cb = nullptr; + } + protected: task_handler _cb; + ::dsn::utils::ex_lock_nr _lock; }; //----------------- timer task ------------------------------------------------------- From 871b37db42feade263f05aa8472af3c554978e5d Mon Sep 17 00:00:00 2001 From: lixuejian7 Date: Thu, 12 Feb 2026 16:44:49 +0800 Subject: [PATCH 3/5] style: format task.h with clang-format --- src/task/task.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/task/task.h b/src/task/task.h index 76b23064f5..f4ae78b7e3 100644 --- a/src/task/task.h +++ b/src/task/task.h @@ -335,7 +335,6 @@ class raw_task : public task _cb = nullptr; } - void exec() override { if (dsn_likely(_cb != nullptr)) { @@ -350,10 +349,9 @@ class raw_task : public task _cb = nullptr; } - protected: task_handler _cb; - ::dsn::utils::ex_lock_nr _lock; + ::dsn::utils::ex_lock_nr _lock; }; //----------------- timer task ------------------------------------------------------- From 15f1dfa123cc09655fd504d097e526596cb06e69 Mon Sep 17 00:00:00 2001 From: lixuejian7 Date: Thu, 26 Feb 2026 16:32:57 +0800 Subject: [PATCH 4/5] style: fix task.h --- src/task/task.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/task/task.h b/src/task/task.h index f4ae78b7e3..22c16c8036 100644 --- a/src/task/task.h +++ b/src/task/task.h @@ -48,6 +48,7 @@ #include "utils/fmt_logging.h" #include "utils/join_point.h" #include "utils/ports.h" +#include "utils/synchronize.h" #include "utils/utils.h" namespace dsn { @@ -348,8 +349,6 @@ class raw_task : public task ::dsn::utils::auto_lock<::dsn::utils::ex_lock_nr> l(_lock); _cb = nullptr; } - -protected: task_handler _cb; ::dsn::utils::ex_lock_nr _lock; }; From da7b1886d21b4474c04b6f9e8052e0f84487a80b Mon Sep 17 00:00:00 2001 From: lixuejian7 Date: Thu, 26 Feb 2026 16:40:08 +0800 Subject: [PATCH 5/5] style: fix replica_duplicator_manager.cpp --- src/replica/duplication/replica_duplicator_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/replica/duplication/replica_duplicator_manager.cpp b/src/replica/duplication/replica_duplicator_manager.cpp index ca3df3948d..b0a02b4b45 100644 --- a/src/replica/duplication/replica_duplicator_manager.cpp +++ b/src/replica/duplication/replica_duplicator_manager.cpp @@ -196,7 +196,7 @@ void replica_duplicator_manager::update_confirmed_decree_if_secondary(decree con void replica_duplicator_manager::METRIC_FUNC_NAME_SET(dup_pending_mutations)() { zauto_lock l(_lock); - int64_t total = 0; + uint64_t total = 0; for (const auto &dup : _duplications) { total += dup.second->get_pending_mutations_count(); }