When getting value from LSM, agatedb iters on levelhandlers and calls LevelHandler::get() under a RwLockReadGuard which will cause the whole read I/O path on this level under a read lock. It is always not a good idea to do I/O under lock even it is a read lock.
See:
|
let v = handler.read()?.get(key); |
I think such read lock is only necessary for fetching associated Tables from LevelHandler and the exact read work can be done outside the lock.
This logic is same as what it is in badger.
https://github.com/dgraph-io/badger/blob/7d159dd923ac9e470ffa76365f9b29ccbd038b0d/levels.go#L1602
The comment says it will call h.RLock() and h.RUnlock(), but exactly they are called in getTableForKey() which only locked when getting tables.
https://github.com/dgraph-io/badger/blob/master/level_handler.go#L241-L243
BTW, as Table might be removed (I/O) when the struct drop and this might happened when modifying LevelHandler under write lock. So this might influence read? I' mot sure whether it's right?
When getting value from LSM, agatedb iters on levelhandlers and calls
LevelHandler::get()under aRwLockReadGuardwhich will cause the whole read I/O path on this level under a read lock. It is always not a good idea to do I/O under lock even it is a read lock.See:
agatedb/src/levels.rs
Line 931 in 475e17b
I think such read lock is only necessary for fetching associated Tables from
LevelHandlerand the exact read work can be done outside the lock.This logic is same as what it is in badger.
https://github.com/dgraph-io/badger/blob/7d159dd923ac9e470ffa76365f9b29ccbd038b0d/levels.go#L1602
The comment says it will call h.RLock() and h.RUnlock(), but exactly they are called in
getTableForKey()which only locked when getting tables.https://github.com/dgraph-io/badger/blob/master/level_handler.go#L241-L243
BTW, as Table might be removed (I/O) when the struct drop and this might happened when modifying LevelHandler under write lock. So this might influence read? I' mot sure whether it's right?