Skip to content

Commit

Permalink
refactor constructor of LRUCacheShard
Browse files Browse the repository at this point in the history
Summary:
Update LRUCacheShard constructor so that adding new params to it don't need to add extra SetXXX() methods.
Closes facebook#3896

Differential Revision: D8128618

Pulled By: yiwu-arbug

fbshipit-source-id: 6afa715de1493a50de413678761a765e3af9b83b
  • Loading branch information
Yi Wu authored and facebook-github-bot committed May 24, 2018
1 parent 01bcc34 commit 7a99c04
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 31 deletions.
36 changes: 22 additions & 14 deletions cache/lru_cache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,20 @@ void LRUHandleTable::Resize() {
length_ = new_length;
}

LRUCacheShard::LRUCacheShard()
: capacity_(0), high_pri_pool_usage_(0), strict_capacity_limit_(false),
high_pri_pool_ratio_(0), high_pri_pool_capacity_(0), usage_(0),
LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
double high_pri_pool_ratio)
: capacity_(0),
high_pri_pool_usage_(0),
strict_capacity_limit_(strict_capacity_limit),
high_pri_pool_ratio_(high_pri_pool_ratio),
high_pri_pool_capacity_(0),
usage_(0),
lru_usage_(0) {
// Make empty circular linked list
lru_.next = &lru_;
lru_.prev = &lru_;
lru_low_pri_ = &lru_;
SetCapacity(capacity);
}

LRUCacheShard::~LRUCacheShard() {}
Expand Down Expand Up @@ -244,17 +250,13 @@ void* LRUCacheShard::operator new(size_t size) {
return port::cacheline_aligned_alloc(size);
}

void* LRUCacheShard::operator new[](size_t size) {
return port::cacheline_aligned_alloc(size);
}
void* LRUCacheShard::operator new(size_t /*size*/, void* ptr) { return ptr; }

void LRUCacheShard::operator delete(void *memblock) {
port::cacheline_aligned_free(memblock);
}

void LRUCacheShard::operator delete[](void* memblock) {
port::cacheline_aligned_free(memblock);
}
void LRUCacheShard::operator delete(void* /*memblock*/, void* /*ptr*/) {}

void LRUCacheShard::SetCapacity(size_t capacity) {
autovector<LRUHandle*> last_reference_list;
Expand Down Expand Up @@ -473,15 +475,21 @@ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
bool strict_capacity_limit, double high_pri_pool_ratio)
: ShardedCache(capacity, num_shard_bits, strict_capacity_limit) {
num_shards_ = 1 << num_shard_bits;
shards_ = new LRUCacheShard[num_shards_];
SetCapacity(capacity);
SetStrictCapacityLimit(strict_capacity_limit);
shards_ = reinterpret_cast<LRUCacheShard*>(
port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));
size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;
for (int i = 0; i < num_shards_; i++) {
shards_[i].SetHighPriorityPoolRatio(high_pri_pool_ratio);
new (&shards_[i])
LRUCacheShard(per_shard, strict_capacity_limit, high_pri_pool_ratio);
}
}

LRUCache::~LRUCache() { delete[] shards_; }
LRUCache::~LRUCache() {
for (int i = 0; i < num_shards_; i++) {
shards_[i].~LRUCacheShard();
}
port::cacheline_aligned_free(shards_);
}

CacheShard* LRUCache::GetShard(int shard) {
return reinterpret_cast<CacheShard*>(&shards_[shard]);
Expand Down
10 changes: 7 additions & 3 deletions cache/lru_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,8 @@ class LRUHandleTable {
// A single shard of sharded cache.
class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard : public CacheShard {
public:
LRUCacheShard();
LRUCacheShard(size_t capacity, bool strict_capacity_limit,
double high_pri_pool_ratio);
virtual ~LRUCacheShard();

// Separate from constructor so caller can easily make an array of LRUCache
Expand Down Expand Up @@ -206,13 +207,16 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard : public CacheShard {
double GetHighPriPoolRatio();

// Overloading to aligned it to cache line size
// They are used by tests.
void* operator new(size_t);

void* operator new[](size_t);
// placement new
void* operator new(size_t, void*);

void operator delete(void *);

void operator delete[](void*);
// placement delete, does nothing.
void operator delete(void*, void*);

private:
void LRU_Remove(LRUHandle* e);
Expand Down
18 changes: 4 additions & 14 deletions cache/lru_cache_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <string>
#include <vector>
#include "port/port.h"
#include "util/testharness.h"

namespace rocksdb {
Expand All @@ -17,19 +18,8 @@ class LRUCacheTest : public testing::Test {
~LRUCacheTest() {}

void NewCache(size_t capacity, double high_pri_pool_ratio = 0.0) {
cache_.reset(
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable: 4316) // We've validated the alignment with the new operators
#endif
new LRUCacheShard()
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
);
cache_->SetCapacity(capacity);
cache_->SetStrictCapacityLimit(false);
cache_->SetHighPriorityPoolRatio(high_pri_pool_ratio);
cache_.reset(new LRUCacheShard(capacity, false /*strict_capcity_limit*/,
high_pri_pool_ratio));
}

void Insert(const std::string& key,
Expand Down Expand Up @@ -114,7 +104,7 @@ TEST_F(LRUCacheTest, BasicLRU) {
ValidateLRUList({"e", "z", "d", "u", "v"});
}

TEST_F(LRUCacheTest, MidPointInsertion) {
TEST_F(LRUCacheTest, EntriesWithPriority) {
// Allocate 2 cache entries to high-pri pool.
NewCache(5, 0.45);

Expand Down

0 comments on commit 7a99c04

Please sign in to comment.