Summary:
In ```LRUCacheShard::Promote```, a reference is released outside the LRU mutex. Fix the race condition.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/8717
Reviewed By: zhichao-cao
Differential Revision:
D30649206
Pulled By: anand1976
fbshipit-source-id:
09c0af05b2294a7fe2c02876a61b0bad6e3ada61
* Fixed a bug of secondary instance's last_sequence going backward, and reads on the secondary fail to see recent updates from the primary.
* Fixed a bug that could lead to duplicate DB ID or DB session ID in POSIX environments without /proc/sys/kernel/random/uuid.
* Fix a race in DumpStats() with column family destruction due to not taking a Ref on each entry while iterating the ColumnFamilySet.
+* Fix a race in item ref counting in LRUCache when promoting an item from the SecondaryCache.
### New Features
* RemoteCompaction's interface now includes `db_name`, `db_id`, `session_id`, which could help the user uniquely identify compaction job between db instances and sessions.
if (handle == nullptr) {
LRU_Insert(e);
} else {
- e->Ref();
+ // If caller already holds a ref, no need to take one here
+ if (!e->HasRefs()) {
+ e->Ref();
+ }
*handle = reinterpret_cast<Cache::Handle*>(e);
}
}
if (e->value) {
Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(e);
Status s = InsertItem(e, &handle, /*free_handle_on_fail=*/false);
- if (s.ok()) {
- // InsertItem would have taken a reference on the item, so decrement it
- // here as we expect the caller to already hold a reference
- e->Unref();
- } else {
+ if (!s.ok()) {
// Item is in memory, but not accounted against the cache capacity.
// When the handle is released, the item should get deleted
assert(!e->InCache());