Fix LRUCache missing null check on destruct

Summary:
Fix LRUCache missing null check on destruct. The check is needed if LRUCache::DisownData is called.
Closes https://github.com/facebook/rocksdb/pull/3920

Differential Revision: D8191631

Pulled By: yiwu-arbug

fbshipit-source-id: d5014f6e49b51692c18a25fb55ece935f5a023c4
main
Yi Wu 7 years ago committed by Facebook Github Bot
parent cf826de3ed
commit 724855c7da
  1. 4
      cache/lru_cache.cc
  2. 2
      cache/lru_cache.h

@ -474,11 +474,14 @@ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
} }
LRUCache::~LRUCache() { LRUCache::~LRUCache() {
if (shards_ != nullptr) {
assert(num_shards_ > 0);
for (int i = 0; i < num_shards_; i++) { for (int i = 0; i < num_shards_; i++) {
shards_[i].~LRUCacheShard(); shards_[i].~LRUCacheShard();
} }
port::cacheline_aligned_free(shards_); port::cacheline_aligned_free(shards_);
} }
}
CacheShard* LRUCache::GetShard(int shard) { CacheShard* LRUCache::GetShard(int shard) {
return reinterpret_cast<CacheShard*>(&shards_[shard]); return reinterpret_cast<CacheShard*>(&shards_[shard]);
@ -504,6 +507,7 @@ void LRUCache::DisownData() {
// Do not drop data if compile with ASAN to suppress leak warning. // Do not drop data if compile with ASAN to suppress leak warning.
#ifndef __SANITIZE_ADDRESS__ #ifndef __SANITIZE_ADDRESS__
shards_ = nullptr; shards_ = nullptr;
num_shards_ = 0;
#endif // !__SANITIZE_ADDRESS__ #endif // !__SANITIZE_ADDRESS__
} }

2
cache/lru_cache.h vendored

@ -295,7 +295,7 @@ class LRUCache : public ShardedCache {
double GetHighPriPoolRatio(); double GetHighPriPoolRatio();
private: private:
LRUCacheShard* shards_; LRUCacheShard* shards_ = nullptr;
int num_shards_ = 0; int num_shards_ = 0;
}; };

Loading…
Cancel
Save