• I
    Simplify column family concurrency · 7731d51c
    Igor Canadi 提交于
    Summary:
    This patch changes concurrency guarantees around ColumnFamilySet::column_families_ and ColumnFamilySet::column_families_data_.
    
    Before:
    * When mutating: lock DB mutex and spin lock
    * When reading: lock DB mutex OR spin lock
    
    After:
    * When mutating: lock DB mutex and be in write thread
    * When reading: lock DB mutex or be in write thread
    
    That way, we eliminate the spin lock that protects these hash maps and  simplify concurrency. That means we don't need to lock the spin lock during writing, since writing is mutually exclusive with column family create/drop (the only operations that mutate those hash maps).
    
    With these new restrictions, I also needed to move column family create to the write thread (column family drop was already in the write thread).
    
    Even though we don't need to lock the spin lock during write, impact on performance should be minimal -- the spin lock is almost never busy, so locking it is almost free.
    
    This addresses task t5116919.
    
    Test Plan:
    make check
    
    Stress test with lots and lots of column family drop and create:
    
       time ./db_stress --threads=30 --ops_per_thread=5000000 --max_key=5000 --column_families=200 --clear_column_family_one_in=100000 --verify_before_write=0  --reopen=15 --max_background_compactions=10 --max_background_flushes=10 --db=/fast-rocksdb-tmp/db_stress/
    
    Reviewers: yhchiang, rven, sdong
    
    Reviewed By: sdong
    
    Subscribers: dhruba, leveldb
    
    Differential Revision: https://reviews.facebook.net/D30651
    7731d51c
db_impl.cc 134.0 KB