Rename SynchronizedBlockStore -> CachingBlockStore
This commit is contained in:
parent
e3f7491d2d
commit
da0efd80c5
@ -1,14 +1,14 @@
|
|||||||
#include "CachedBlockRef.h"
|
#include <messmer/blockstore/implementations/caching/CachedBlockRef.h>
|
||||||
#include "SynchronizedBlockStore.h"
|
#include <messmer/blockstore/implementations/caching/CachingBlockStore.h>
|
||||||
|
|
||||||
using std::shared_ptr;
|
using std::shared_ptr;
|
||||||
using std::make_unique;
|
using std::make_unique;
|
||||||
using std::function;
|
using std::function;
|
||||||
|
|
||||||
namespace blockstore {
|
namespace blockstore {
|
||||||
namespace synchronized {
|
namespace caching {
|
||||||
|
|
||||||
CachedBlockRef::CachedBlockRef(Block *baseBlock, SynchronizedBlockStore *blockStore)
|
CachedBlockRef::CachedBlockRef(Block *baseBlock, CachingBlockStore *blockStore)
|
||||||
//TODO We store key twice here - once in OpenBlock, once in the underlying baseBlock.
|
//TODO We store key twice here - once in OpenBlock, once in the underlying baseBlock.
|
||||||
// Should we move that to make CachedBlockRef::key() call _baseBlock.key()?
|
// Should we move that to make CachedBlockRef::key() call _baseBlock.key()?
|
||||||
:Block(baseBlock->key()),
|
:Block(baseBlock->key()),
|
@ -8,12 +8,12 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace blockstore {
|
namespace blockstore {
|
||||||
namespace synchronized {
|
namespace caching {
|
||||||
class SynchronizedBlockStore;
|
class CachingBlockStore;
|
||||||
|
|
||||||
class CachedBlockRef: public Block {
|
class CachedBlockRef: public Block {
|
||||||
public:
|
public:
|
||||||
CachedBlockRef(Block *baseBlock, SynchronizedBlockStore *blockStore);
|
CachedBlockRef(Block *baseBlock, CachingBlockStore *blockStore);
|
||||||
virtual ~CachedBlockRef();
|
virtual ~CachedBlockRef();
|
||||||
|
|
||||||
const void *data() const override;
|
const void *data() const override;
|
||||||
@ -25,7 +25,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Block *_baseBlock;
|
Block *_baseBlock;
|
||||||
SynchronizedBlockStore *_blockStore;
|
CachingBlockStore *_blockStore;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CachedBlockRef);
|
DISALLOW_COPY_AND_ASSIGN(CachedBlockRef);
|
||||||
};
|
};
|
@ -1,5 +1,5 @@
|
|||||||
#include "CachedBlockRef.h"
|
#include <messmer/blockstore/implementations/caching/CachedBlockRef.h>
|
||||||
#include "SynchronizedBlockStore.h"
|
#include <messmer/blockstore/implementations/caching/CachingBlockStore.h>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
using std::unique_ptr;
|
using std::unique_ptr;
|
||||||
@ -10,26 +10,26 @@ using std::lock_guard;
|
|||||||
using std::promise;
|
using std::promise;
|
||||||
|
|
||||||
namespace blockstore {
|
namespace blockstore {
|
||||||
namespace synchronized {
|
namespace caching {
|
||||||
|
|
||||||
SynchronizedBlockStore::SynchronizedBlockStore(unique_ptr<BlockStore> baseBlockStore)
|
CachingBlockStore::CachingBlockStore(unique_ptr<BlockStore> baseBlockStore)
|
||||||
: _baseBlockStore(std::move(baseBlockStore)),
|
: _baseBlockStore(std::move(baseBlockStore)),
|
||||||
_openBlocks() {
|
_openBlocks() {
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Block> SynchronizedBlockStore::create(size_t size) {
|
unique_ptr<Block> CachingBlockStore::create(size_t size) {
|
||||||
auto block = _baseBlockStore->create(size);
|
auto block = _baseBlockStore->create(size);
|
||||||
lock_guard<mutex> lock(_mutex);
|
lock_guard<mutex> lock(_mutex);
|
||||||
return _addOpenBlock(std::move(block));
|
return _addOpenBlock(std::move(block));
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Block> SynchronizedBlockStore::_addOpenBlock(unique_ptr<Block> block) {
|
unique_ptr<Block> CachingBlockStore::_addOpenBlock(unique_ptr<Block> block) {
|
||||||
auto insertResult = _openBlocks.emplace(block->key(), std::move(block));
|
auto insertResult = _openBlocks.emplace(block->key(), std::move(block));
|
||||||
assert(true == insertResult.second);
|
assert(true == insertResult.second);
|
||||||
return make_unique<CachedBlockRef>(insertResult.first->second.getReference(), this);
|
return make_unique<CachedBlockRef>(insertResult.first->second.getReference(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Block> SynchronizedBlockStore::load(const Key &key) {
|
unique_ptr<Block> CachingBlockStore::load(const Key &key) {
|
||||||
lock_guard<mutex> lock(_mutex);
|
lock_guard<mutex> lock(_mutex);
|
||||||
auto found = _openBlocks.find(key);
|
auto found = _openBlocks.find(key);
|
||||||
if (found == _openBlocks.end()) {
|
if (found == _openBlocks.end()) {
|
||||||
@ -43,7 +43,7 @@ unique_ptr<Block> SynchronizedBlockStore::load(const Key &key) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SynchronizedBlockStore::release(const Block *block) {
|
void CachingBlockStore::release(const Block *block) {
|
||||||
lock_guard<mutex> lock(_mutex);
|
lock_guard<mutex> lock(_mutex);
|
||||||
Key key = block->key();
|
Key key = block->key();
|
||||||
auto found = _openBlocks.find(key);
|
auto found = _openBlocks.find(key);
|
||||||
@ -58,7 +58,7 @@ void SynchronizedBlockStore::release(const Block *block) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SynchronizedBlockStore::remove(unique_ptr<Block> block) {
|
void CachingBlockStore::remove(unique_ptr<Block> block) {
|
||||||
auto insertResult = _blocksToRemove.emplace(block->key(), promise<unique_ptr<Block>>());
|
auto insertResult = _blocksToRemove.emplace(block->key(), promise<unique_ptr<Block>>());
|
||||||
assert(true == insertResult.second);
|
assert(true == insertResult.second);
|
||||||
block.reset();
|
block.reset();
|
||||||
@ -69,7 +69,7 @@ void SynchronizedBlockStore::remove(unique_ptr<Block> block) {
|
|||||||
_baseBlockStore->remove(std::move(blockToRemove));
|
_baseBlockStore->remove(std::move(blockToRemove));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t SynchronizedBlockStore::numBlocks() const {
|
uint64_t CachingBlockStore::numBlocks() const {
|
||||||
return _baseBlockStore->numBlocks();
|
return _baseBlockStore->numBlocks();
|
||||||
}
|
}
|
||||||
|
|
@ -11,12 +11,11 @@
|
|||||||
#include "../../interface/BlockStore.h"
|
#include "../../interface/BlockStore.h"
|
||||||
|
|
||||||
namespace blockstore {
|
namespace blockstore {
|
||||||
namespace synchronized {
|
namespace caching {
|
||||||
|
|
||||||
//TODO Rename to CachingBlockStore or something else
|
class CachingBlockStore: public BlockStore {
|
||||||
class SynchronizedBlockStore: public BlockStore {
|
|
||||||
public:
|
public:
|
||||||
SynchronizedBlockStore(std::unique_ptr<BlockStore> baseBlockStore);
|
CachingBlockStore(std::unique_ptr<BlockStore> baseBlockStore);
|
||||||
|
|
||||||
std::unique_ptr<Block> create(size_t size) override;
|
std::unique_ptr<Block> create(size_t size) override;
|
||||||
std::unique_ptr<Block> load(const Key &key) override;
|
std::unique_ptr<Block> load(const Key &key) override;
|
||||||
@ -45,7 +44,7 @@ private:
|
|||||||
|
|
||||||
std::unique_ptr<Block> _addOpenBlock(std::unique_ptr<Block> block);
|
std::unique_ptr<Block> _addOpenBlock(std::unique_ptr<Block> block);
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(SynchronizedBlockStore);
|
DISALLOW_COPY_AND_ASSIGN(CachingBlockStore);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
25
test/implementations/caching/CachingBlockStoreTest.cpp
Normal file
25
test/implementations/caching/CachingBlockStoreTest.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "../../../implementations/caching/CachingBlockStore.h"
|
||||||
|
#include "../../../implementations/testfake/FakeBlockStore.h"
|
||||||
|
#include "../../testutils/BlockStoreTest.h"
|
||||||
|
#include "google/gtest/gtest.h"
|
||||||
|
|
||||||
|
|
||||||
|
using blockstore::BlockStore;
|
||||||
|
using blockstore::caching::CachingBlockStore;
|
||||||
|
using blockstore::testfake::FakeBlockStore;
|
||||||
|
|
||||||
|
using std::unique_ptr;
|
||||||
|
using std::make_unique;
|
||||||
|
|
||||||
|
class CachingBlockStoreTestFixture: public BlockStoreTestFixture {
|
||||||
|
public:
|
||||||
|
unique_ptr<BlockStore> createBlockStore() override {
|
||||||
|
return make_unique<CachingBlockStore>(make_unique<FakeBlockStore>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
INSTANTIATE_TYPED_TEST_CASE_P(Caching, BlockStoreTest, CachingBlockStoreTestFixture);
|
||||||
|
|
||||||
|
//TODO Add specific tests ensuring that
|
||||||
|
// (a) loading the same block twice doesn't load it twice from the underlying blockstore
|
||||||
|
// (b) ... cache tests
|
@ -1,23 +0,0 @@
|
|||||||
#include "../../../implementations/synchronized/SynchronizedBlockStore.h"
|
|
||||||
#include "../../../implementations/testfake/FakeBlockStore.h"
|
|
||||||
#include "../../testutils/BlockStoreTest.h"
|
|
||||||
#include "google/gtest/gtest.h"
|
|
||||||
|
|
||||||
|
|
||||||
using blockstore::BlockStore;
|
|
||||||
using blockstore::synchronized::SynchronizedBlockStore;
|
|
||||||
using blockstore::testfake::FakeBlockStore;
|
|
||||||
|
|
||||||
using std::unique_ptr;
|
|
||||||
using std::make_unique;
|
|
||||||
|
|
||||||
class SynchronizedBlockStoreTestFixture: public BlockStoreTestFixture {
|
|
||||||
public:
|
|
||||||
unique_ptr<BlockStore> createBlockStore() override {
|
|
||||||
return make_unique<SynchronizedBlockStore>(make_unique<FakeBlockStore>());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
INSTANTIATE_TYPED_TEST_CASE_P(Synchronized, BlockStoreTest, SynchronizedBlockStoreTestFixture);
|
|
||||||
|
|
||||||
//TODO Add specific tests ensuring that the access to the underlying blockstore is synchronized
|
|
Loading…
Reference in New Issue
Block a user