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

hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new 85910bcf4 fix(server): data race when accessing the db scan info 
(#3199)
85910bcf4 is described below

commit 85910bcf40f23820f400942e1bca28f07bf48f66
Author: hulk <[email protected]>
AuthorDate: Thu Sep 25 09:38:05 2025 +0800

    fix(server): data race when accessing the db scan info (#3199)
    
    For the data race details, refer to [GitHub Action
    
Logs](https://github.com/apache/kvrocks/actions/runs/17972329716/job/51119679082?pr=3196):
    
    ```
    WARNING: ThreadSanitizer: data race (pid=90210)
      Write of size 8 at 0x7b1c00017030 by thread T150 (mutexes: write M0):
        #0 Server::AsyncScanDBSize(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)::$_9::operator()() const 
/home/runner/work/kvrocks/kvrocks/src/server/server.cc:1636:44 
(kvrocks+0x15ddb14) (BuildId: dca9d021cc579ae4)
        #1 void std::__invoke_impl<void, 
Server::AsyncScanDBSize(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > 
const&)::$_9&>(std::__invoke_other, 
Server::AsyncScanDBSize(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)::$_9&) 
/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:61:14
 (kvrocks+0x15ddb14)
    
    
    ...
    
      Previous read of size 8 at 0x7b1c00017030 by thread T145 (mutexes: read 
M1):
        #0 Server::GetLastScanTime(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&) const 
/home/runner/work/kvrocks/kvrocks/src/server/server.cc:1652:25 
(kvrocks+0x15bc3aa) (BuildId: dca9d021cc579ae4)
        #1 Server::GetKeyspaceInfo(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&) 
/home/runner/work/kvrocks/kvrocks/src/server/server.cc:1418:57 
(kvrocks+0x15bc3aa)
        #2 Server::GetInfo(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, 
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > 
const&)::$_5::operator()(Server*) const 
/home/runner/work/kvrocks/kvrocks/src/server/server.cc:1454:91 
(kvrocks+0x15cafbc) (BuildId: dca9d021cc579ae4)
    ```
---
 src/server/server.cc | 3 ++-
 src/server/server.h  | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/server/server.cc b/src/server/server.cc
index 04e62febc..d16e756fa 100644
--- a/src/server/server.cc
+++ b/src/server/server.cc
@@ -1646,7 +1646,8 @@ void Server::GetLatestKeyNumStats(const std::string &ns, 
KeyNumStats *stats) {
   }
 }
 
-int64_t Server::GetLastScanTime(const std::string &ns) const {
+int64_t Server::GetLastScanTime(const std::string &ns) {
+  std::lock_guard<std::mutex> lg(db_job_mu_);
   auto iter = db_scan_infos_.find(ns);
   if (iter != db_scan_infos_.end()) {
     return iter->second.last_scan_time_secs;
diff --git a/src/server/server.h b/src/server/server.h
index 7063a6632..597ea00ae 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -290,7 +290,7 @@ class Server {
   Status AsyncPurgeOldBackups(uint32_t num_backups_to_keep, uint32_t 
backup_max_keep_hours);
   Status AsyncScanDBSize(const std::string &ns);
   void GetLatestKeyNumStats(const std::string &ns, KeyNumStats *stats);
-  int64_t GetLastScanTime(const std::string &ns) const;
+  int64_t GetLastScanTime(const std::string &ns);
   StatusOr<std::vector<rocksdb::BatchResult>> PollUpdates(uint64_t 
next_sequence, int64_t count, bool is_strict) const;
 
   std::string GenerateCursorFromKeyName(const std::string &key_name, 
CursorType cursor_type, const char *prefix = "");

Reply via email to