Create dedicated Key class for addressing blocks

This commit is contained in:
Sebastian Messmer 2014-12-09 20:36:32 +01:00
parent 48cc8eeff0
commit 0b2b527b4d
5 changed files with 15 additions and 11 deletions

View File

@ -22,7 +22,7 @@ BlobWithKey BlobStoreOnBlocks::create(size_t size) {
return BlobWithKey(block.key, make_unique<BlobOnBlocks>(std::move(block.block))); return BlobWithKey(block.key, make_unique<BlobOnBlocks>(std::move(block.block)));
} }
unique_ptr<Blob> BlobStoreOnBlocks::load(const std::string &key) { unique_ptr<Blob> BlobStoreOnBlocks::load(const Key &key) {
return make_unique<BlobOnBlocks>(_blocks->load(key)); return make_unique<BlobOnBlocks>(_blocks->load(key));
} }

View File

@ -16,7 +16,7 @@ public:
virtual ~BlobStoreOnBlocks(); virtual ~BlobStoreOnBlocks();
BlobWithKey create(size_t size) override; BlobWithKey create(size_t size) override;
std::unique_ptr<Blob> load(const std::string &key) override; std::unique_ptr<Blob> load(const Key &key) override;
private: private:
std::unique_ptr<blockstore::BlockStore> _blocks; std::unique_ptr<blockstore::BlockStore> _blocks;

View File

@ -17,7 +17,7 @@ public:
virtual BlobWithKey create(size_t size) = 0; virtual BlobWithKey create(size_t size) = 0;
//TODO Use boost::optional (if key doesn't exist) //TODO Use boost::optional (if key doesn't exist)
// Return nullptr if block with this key doesn't exists // Return nullptr if block with this key doesn't exists
virtual std::unique_ptr<Blob> load(const std::string &key) = 0; virtual std::unique_ptr<Blob> load(const Key &key) = 0;
//TODO Needed for performance? Or is deleting loaded blocks enough? //TODO Needed for performance? Or is deleting loaded blocks enough?
//virtual void remove(const std::string &key) = 0; //virtual void remove(const std::string &key) = 0;
}; };

View File

@ -5,13 +5,17 @@
#include <blobstore/interface/Blob.h> #include <blobstore/interface/Blob.h>
#include <memory> #include <memory>
#include "fspp/utils/macros.h" #include "fspp/utils/macros.h"
#include "blockstore/utils/Key.h"
namespace blobstore { namespace blobstore {
struct BlobWithKey { //TODO Use own key class to become independent from blockstore?
BlobWithKey(const std::string &key_, std::unique_ptr<Blob> blob_): key(key_), blob(std::move(blob_)) {} typedef blockstore::Key Key;
std::string key; struct BlobWithKey {
BlobWithKey(const Key &key_, std::unique_ptr<Blob> blob_): key(key_), blob(std::move(blob_)) {}
Key key;
std::unique_ptr<Blob> blob; std::unique_ptr<Blob> blob;
}; };

View File

@ -26,7 +26,7 @@ public:
TEST_F(DataNodeTest, InitializeNewLeafNodeCreatesLeafNodeObject) { TEST_F(DataNodeTest, InitializeNewLeafNodeCreatesLeafNodeObject) {
auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE); auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE);
string key = block.key; Key key = block.key;
auto leafNode = DataNode::initializeNewLeafNode(std::move(block.block)); auto leafNode = DataNode::initializeNewLeafNode(std::move(block.block));
EXPECT_IS_PTR_TYPE(DataLeafNode, leafNode.get()); EXPECT_IS_PTR_TYPE(DataLeafNode, leafNode.get());
@ -34,7 +34,7 @@ TEST_F(DataNodeTest, InitializeNewLeafNodeCreatesLeafNodeObject) {
TEST_F(DataNodeTest, InitializeNewInnerNodeCreatesInnerNodeObject) { TEST_F(DataNodeTest, InitializeNewInnerNodeCreatesInnerNodeObject) {
auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE); auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE);
string key = block.key; Key key = block.key;
auto innerNode = DataNode::initializeNewInnerNode(std::move(block.block)); auto innerNode = DataNode::initializeNewInnerNode(std::move(block.block));
EXPECT_IS_PTR_TYPE(DataInnerNode, innerNode.get()); EXPECT_IS_PTR_TYPE(DataInnerNode, innerNode.get());
@ -42,7 +42,7 @@ TEST_F(DataNodeTest, InitializeNewInnerNodeCreatesInnerNodeObject) {
TEST_F(DataNodeTest, LeafNodeIsRecognizedAfterStoreAndLoad) { TEST_F(DataNodeTest, LeafNodeIsRecognizedAfterStoreAndLoad) {
auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE); auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE);
string key = block.key; Key key = block.key;
auto node = DataNode::initializeNewLeafNode(std::move(block.block)); auto node = DataNode::initializeNewLeafNode(std::move(block.block));
node->flush(); node->flush();
@ -53,7 +53,7 @@ TEST_F(DataNodeTest, LeafNodeIsRecognizedAfterStoreAndLoad) {
TEST_F(DataNodeTest, InnerNodeIsRecognizedAfterStoreAndLoad) { TEST_F(DataNodeTest, InnerNodeIsRecognizedAfterStoreAndLoad) {
auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE); auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE);
string key = block.key; Key key = block.key;
auto node = DataNode::initializeNewInnerNode(std::move(block.block)); auto node = DataNode::initializeNewInnerNode(std::move(block.block));
node->flush(); node->flush();
@ -64,7 +64,7 @@ TEST_F(DataNodeTest, InnerNodeIsRecognizedAfterStoreAndLoad) {
TEST_F(DataNodeTest, DataNodeCrashesOnLoadIfMagicNumberIsWrong) { TEST_F(DataNodeTest, DataNodeCrashesOnLoadIfMagicNumberIsWrong) {
auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE); auto block = blockStore->create(BlobStoreOnBlocks::BLOCKSIZE);
string key = block.key; Key key = block.key;
DataNode::NodeHeader* header = (DataNode::NodeHeader*)block.block->data(); DataNode::NodeHeader* header = (DataNode::NodeHeader*)block.block->data();
header->magicNumber = 0xFF; // this is an invalid magic number header->magicNumber = 0xFF; // this is an invalid magic number