• Y
    Fix data race to VersionSet::io_status_ (#7034) · d47c8711
    Yanqin Jin 提交于
    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
    d47c8711
compaction_job.cc 66.6 KB