From: anand76 Date: Thu, 26 Aug 2021 22:39:32 +0000 (-0700) Subject: Fix a race condition in DumpStats() during iteration of the ColumnFamilySet (#8714) X-Git-Tag: v6.25.1~85 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ebaa3c8a59648fdb77ff3af66bcf8a5ac03336ad;p=rocksdb.git Fix a race condition in DumpStats() during iteration of the ColumnFamilySet (#8714) Summary: DumpStats() iterates through the ColumnFamilySet. There is a potential race condition because it does Ref the cfd, and the cfd could get destroyed during the iteration. Pull Request resolved: https://github.com/facebook/rocksdb/pull/8714 Test Plan: make check Reviewed By: ltamasi Differential Revision: D30580199 Pulled By: anand1976 fbshipit-source-id: 60a3443ad0d4f7ac6a977dec780e6d2c1b70b850 --- diff --git a/HISTORY.md b/HISTORY.md index 25c1d7999..c92367368 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -3,6 +3,7 @@ ### Bug Fixes * Allow secondary instance to refresh iterator. Assign read seq after referencing SuperVersion. * Fixed a bug of secondary instance's last_sequence going backward, and reads on the secondary fail to see recent updates from the primary. +* Fix a race in DumpStats() with column family destruction due to not taking a Ref on each entry while iterating the ColumnFamilySet. ### New Features * RemoteCompaction's interface now includes `db_name`, `db_id`, `session_id`, which could help the user uniquely identify compaction job between db instances and sessions. diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc index d617fe3e7..228b24c24 100644 --- a/db/db_impl/db_impl.cc +++ b/db/db_impl/db_impl.cc @@ -958,8 +958,13 @@ void DBImpl::DumpStats() { // Release DB mutex for gathering cache entry stats. Pass over all // column families for this first so that other stats are dumped // near-atomically. - InstrumentedMutexUnlock u(&mutex_); - cfd->internal_stats()->CollectCacheEntryStats(/*foreground=*/false); + // Get a ref before unlocking + cfd->Ref(); + { + InstrumentedMutexUnlock u(&mutex_); + cfd->internal_stats()->CollectCacheEntryStats(/*foreground=*/false); + } + cfd->UnrefAndTryDelete(); } }