]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commit
Fix data race to VersionSet::io_status_ (#7034)
authorYanqin Jin <yanqin@fb.com>
Sat, 27 Jun 2020 15:55:49 +0000 (08:55 -0700)
committerAndrew Kryczka <andrewkr@fb.com>
Thu, 9 Jul 2020 22:51:01 +0000 (15:51 -0700)
commit3514cf51fa4e2941d731e4425c86276de4be7795
tree147f296b454eeaecebfdc58384e9dcc241d36024
parentdd63f04c83918d31f40d83405bf22280a4dcbbb2
Fix data race to VersionSet::io_status_ (#7034)

Summary:
After https://github.com/facebook/rocksdb/issues/6949 , VersionSet::io_status_ can be concurrently accessed by multiple
threads without lock, causing tsan test to fail. For example, a bg flush thread
resets io_status_ before calling LogAndApply(), while another thread already in
the process of LogAndApply() reads io_status_. This is a bug.

We do not have to reset io_status_ each time we call LogAndApply(). io_status_
is part of the state of VersionSet, and it indicates the outcome of preceding
MANIFEST/CURRENT files IO operations. Its value should be updated only when:

1. MANIFEST/CURRENT files IO fail for the first time.
2. MANIFEST/CURRENT files IO succeed as part of recovering from a prior
   failure without process restart, e.g. calling Resume().

Test Plan (devserver):
COMPILE_WITH_TSAN=1 make check
COMPILE_WITH_TSAN=1 make db_test2
./db_test2 --gtest_filter=DBTest2.CompactionStall
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7034

Reviewed By: zhichao-cao

Differential Revision: D22247137

Pulled By: riversand963

fbshipit-source-id: 77b83e05390f3ee3cd2d96d3fdd6fe4f225e3216
db/compaction/compaction_job.cc
db/db_impl/db_impl_compaction_flush.cc
db/memtable_list.cc
db/version_set.cc
db/version_set.h