mirror of
https://github.com/Zygo/bees.git
synced 2025-06-17 01:56:16 +02:00
hash: reduce mutex contention using one mutex per hash table extent
This avoids PERFORMANCE warnings when large hash tables are used on slow CPUs or with lots of worker threads. It also simplifies the code (no locksets, only one object-wide mutex instead of two). Fixed a few minor bugs along the way (e.g. we were not setting the dirty flag on the right hash table extent when we detected hash table errors). Simplified error handling: IO errors on the hash table are ignored, instead of throwing an exception into the function that tried to use the hash table. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
28
src/bees.h
28
src/bees.h
@ -432,18 +432,24 @@ private:
|
||||
uint64_t m_buckets;
|
||||
uint64_t m_extents;
|
||||
uint64_t m_cells;
|
||||
set<uint64_t> m_buckets_dirty;
|
||||
set<uint64_t> m_buckets_missing;
|
||||
BeesThread m_writeback_thread;
|
||||
BeesThread m_prefetch_thread;
|
||||
RateLimiter m_flush_rate_limit;
|
||||
mutex m_extent_mutex;
|
||||
mutex m_bucket_mutex;
|
||||
condition_variable m_condvar;
|
||||
set<HashType> m_toxic_hashes;
|
||||
BeesStringFile m_stats_file;
|
||||
|
||||
LockSet<uint64_t> m_extent_lock_set;
|
||||
// Mutex/condvar for the writeback thread
|
||||
mutex m_dirty_mutex;
|
||||
condition_variable m_dirty_condvar;
|
||||
|
||||
// Per-extent structures
|
||||
struct ExtentMetaData {
|
||||
shared_ptr<mutex> m_mutex_ptr; // Access serializer
|
||||
bool m_dirty = false; // Needs to be written back to disk
|
||||
bool m_missing = true; // Needs to be read from disk
|
||||
ExtentMetaData();
|
||||
};
|
||||
vector<ExtentMetaData> m_extent_metadata;
|
||||
|
||||
void open_file();
|
||||
void writeback_loop();
|
||||
@ -451,11 +457,17 @@ private:
|
||||
void try_mmap_flags(int flags);
|
||||
pair<Cell *, Cell *> get_cell_range(HashType hash);
|
||||
pair<uint8_t *, uint8_t *> get_extent_range(HashType hash);
|
||||
void fetch_missing_extent(HashType hash);
|
||||
void set_extent_dirty(HashType hash);
|
||||
void fetch_missing_extent_by_hash(HashType hash);
|
||||
void fetch_missing_extent_by_index(uint64_t extent_index);
|
||||
void set_extent_dirty_locked(uint64_t extent_index);
|
||||
void flush_dirty_extents();
|
||||
bool flush_dirty_extent(uint64_t extent_index);
|
||||
bool is_toxic_hash(HashType h) const;
|
||||
|
||||
size_t hash_to_extent_index(HashType ht);
|
||||
unique_lock<mutex> lock_extent_by_hash(HashType ht);
|
||||
unique_lock<mutex> lock_extent_by_index(uint64_t extent_index);
|
||||
|
||||
BeesHashTable(const BeesHashTable &) = delete;
|
||||
BeesHashTable &operator=(const BeesHashTable &) = delete;
|
||||
};
|
||||
|
Reference in New Issue
Block a user