Added Block::write() and removed writeable data() pointer
This commit is contained in:
parent
09b648317f
commit
d42bda0ca6
@ -25,12 +25,13 @@ InMemoryBlock::InMemoryBlock(const InMemoryBlock &rhs)
|
|||||||
InMemoryBlock::~InMemoryBlock() {
|
InMemoryBlock::~InMemoryBlock() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *InMemoryBlock::data() {
|
const void *InMemoryBlock::data() const {
|
||||||
return _data->data();
|
return _data->data();
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *InMemoryBlock::data() const {
|
void InMemoryBlock::write(const void *source, uint64_t offset, uint64_t size) {
|
||||||
return _data->data();
|
assert(offset <= _data->size() && offset + size <= _data->size()); //Also check offset < _data->size() because of possible overflow in the addition
|
||||||
|
std::memcpy((uint8_t*)_data->data()+offset, source, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t InMemoryBlock::size() const {
|
size_t InMemoryBlock::size() const {
|
||||||
|
@ -15,8 +15,8 @@ public:
|
|||||||
InMemoryBlock(const InMemoryBlock &rhs);
|
InMemoryBlock(const InMemoryBlock &rhs);
|
||||||
virtual ~InMemoryBlock();
|
virtual ~InMemoryBlock();
|
||||||
|
|
||||||
void *data() override;
|
|
||||||
const void *data() const override;
|
const void *data() const override;
|
||||||
|
void write(const void *source, uint64_t offset, uint64_t size) override;
|
||||||
|
|
||||||
void flush() override;
|
void flush() override;
|
||||||
|
|
||||||
|
@ -31,12 +31,13 @@ OnDiskBlock::~OnDiskBlock() {
|
|||||||
_storeToDisk();
|
_storeToDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *OnDiskBlock::data() {
|
const void *OnDiskBlock::data() const {
|
||||||
return _data.data();
|
return _data.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *OnDiskBlock::data() const {
|
void OnDiskBlock::write(const void *source, uint64_t offset, uint64_t size) {
|
||||||
return _data.data();
|
assert(offset <= _data.size() && offset + size <= _data.size()); //Also check offset < _data->size() because of possible overflow in the addition
|
||||||
|
std::memcpy((uint8_t*)_data.data()+offset, source, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t OnDiskBlock::size() const {
|
size_t OnDiskBlock::size() const {
|
||||||
|
@ -21,8 +21,8 @@ public:
|
|||||||
static std::unique_ptr<OnDiskBlock> CreateOnDisk(const boost::filesystem::path &rootdir, const Key &key, size_t size);
|
static std::unique_ptr<OnDiskBlock> CreateOnDisk(const boost::filesystem::path &rootdir, const Key &key, size_t size);
|
||||||
static void RemoveFromDisk(const boost::filesystem::path &rootdir, const Key &key);
|
static void RemoveFromDisk(const boost::filesystem::path &rootdir, const Key &key);
|
||||||
|
|
||||||
void *data() override;
|
|
||||||
const void *data() const override;
|
const void *data() const override;
|
||||||
|
void write(const void *source, uint64_t offset, uint64_t size) override;
|
||||||
|
|
||||||
void flush() override;
|
void flush() override;
|
||||||
|
|
||||||
|
@ -22,12 +22,13 @@ FakeBlock::~FakeBlock() {
|
|||||||
flush();
|
flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *FakeBlock::data() {
|
const void *FakeBlock::data() const {
|
||||||
return _data->data();
|
return _data->data();
|
||||||
}
|
}
|
||||||
|
|
||||||
const void *FakeBlock::data() const {
|
void FakeBlock::write(const void *source, uint64_t offset, uint64_t size) {
|
||||||
return _data->data();
|
assert(offset <= _data->size() && offset + size <= _data->size()); //Also check offset < _data->size() because of possible overflow in the addition
|
||||||
|
std::memcpy((uint8_t*)_data->data()+offset, source, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t FakeBlock::size() const {
|
size_t FakeBlock::size() const {
|
||||||
|
@ -16,8 +16,8 @@ public:
|
|||||||
FakeBlock(FakeBlockStore *store, const Key &key, std::shared_ptr<Data> data);
|
FakeBlock(FakeBlockStore *store, const Key &key, std::shared_ptr<Data> data);
|
||||||
virtual ~FakeBlock();
|
virtual ~FakeBlock();
|
||||||
|
|
||||||
void *data() override;
|
|
||||||
const void *data() const override;
|
const void *data() const override;
|
||||||
|
void write(const void *source, uint64_t offset, uint64_t size) override;
|
||||||
|
|
||||||
void flush() override;
|
void flush() override;
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ class Block {
|
|||||||
public:
|
public:
|
||||||
virtual ~Block() {}
|
virtual ~Block() {}
|
||||||
|
|
||||||
virtual void *data() = 0;
|
|
||||||
virtual const void *data() const = 0;
|
virtual const void *data() const = 0;
|
||||||
|
virtual void write(const void *source, uint64_t offset, uint64_t size) = 0;
|
||||||
|
|
||||||
virtual void flush() = 0;
|
virtual void flush() = 0;
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WriteDataToBlock(const unique_ptr<OnDiskBlock> &block) {
|
void WriteDataToBlock(const unique_ptr<OnDiskBlock> &block) {
|
||||||
std::memcpy(block->data(), randomData.data(), randomData.size());
|
block->write(randomData.data(), 0, randomData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EXPECT_BLOCK_DATA_CORRECT(const unique_ptr<OnDiskBlock> &block) {
|
void EXPECT_BLOCK_DATA_CORRECT(const unique_ptr<OnDiskBlock> &block) {
|
||||||
|
@ -31,8 +31,8 @@ public:
|
|||||||
class BlockMock: public Block {
|
class BlockMock: public Block {
|
||||||
public:
|
public:
|
||||||
BlockMock(): Block(Key::CreateRandomKey()) {}
|
BlockMock(): Block(Key::CreateRandomKey()) {}
|
||||||
MOCK_METHOD0(data, void*());
|
|
||||||
MOCK_CONST_METHOD0(data, const void*());
|
MOCK_CONST_METHOD0(data, const void*());
|
||||||
|
MOCK_METHOD3(write, void(const void*, uint64_t, uint64_t));
|
||||||
MOCK_METHOD0(flush, void());
|
MOCK_METHOD0(flush, void());
|
||||||
MOCK_CONST_METHOD0(size, size_t());
|
MOCK_CONST_METHOD0(size, size_t());
|
||||||
MOCK_CONST_METHOD0(key, const Key&());
|
MOCK_CONST_METHOD0(key, const Key&());
|
||||||
|
@ -139,13 +139,13 @@ private:
|
|||||||
|
|
||||||
blockstore::Key StoreDataToBlockAndGetKey(const DataBlockFixture &data) {
|
blockstore::Key StoreDataToBlockAndGetKey(const DataBlockFixture &data) {
|
||||||
auto block = blockStore->create(data.size());
|
auto block = blockStore->create(data.size());
|
||||||
std::memcpy(block->data(), data.data(), data.size());
|
block->write(data.data(), 0, data.size());
|
||||||
return block->key();
|
return block->key();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<blockstore::Block> StoreDataToBlockAndLoadItDirectlyAfterFlushing(const DataBlockFixture &data) {
|
std::unique_ptr<blockstore::Block> StoreDataToBlockAndLoadItDirectlyAfterFlushing(const DataBlockFixture &data) {
|
||||||
auto block = blockStore->create(data.size());
|
auto block = blockStore->create(data.size());
|
||||||
std::memcpy(block->data(), data.data(), data.size());
|
block->write(data.data(), 0, data.size());
|
||||||
block->flush();
|
block->flush();
|
||||||
return blockStore->load(block->key());
|
return blockStore->load(block->key());
|
||||||
}
|
}
|
||||||
@ -160,7 +160,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WriteDataToBlock(blockstore::Block *block, const DataBlockFixture &randomData) {
|
void WriteDataToBlock(blockstore::Block *block, const DataBlockFixture &randomData) {
|
||||||
std::memcpy(block->data(), randomData.data(), randomData.size());
|
block->write(randomData.data(), 0, randomData.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EXPECT_BLOCK_DATA_CORRECT(const blockstore::Block &block, const DataBlockFixture &randomData) {
|
void EXPECT_BLOCK_DATA_CORRECT(const blockstore::Block &block, const DataBlockFixture &randomData) {
|
||||||
|
@ -51,7 +51,7 @@ TEST_F(BlockStoreUtilsTest_CopyToNewBlock, CopyZeroBlock) {
|
|||||||
|
|
||||||
TEST_F(BlockStoreUtilsTest_CopyToNewBlock, CopyDataBlock) {
|
TEST_F(BlockStoreUtilsTest_CopyToNewBlock, CopyDataBlock) {
|
||||||
auto block = blockStore->create(SIZE);
|
auto block = blockStore->create(SIZE);
|
||||||
std::memcpy(block->data(), dataFixture.data(), SIZE);
|
block->write(dataFixture.data(), 0, SIZE);
|
||||||
auto block2 = copyToNewBlock(blockStore.get(), *block);
|
auto block2 = copyToNewBlock(blockStore.get(), *block);
|
||||||
|
|
||||||
EXPECT_EQ(SIZE, block2->size());
|
EXPECT_EQ(SIZE, block2->size());
|
||||||
@ -60,7 +60,7 @@ TEST_F(BlockStoreUtilsTest_CopyToNewBlock, CopyDataBlock) {
|
|||||||
|
|
||||||
TEST_F(BlockStoreUtilsTest_CopyToNewBlock, OriginalBlockUnchanged) {
|
TEST_F(BlockStoreUtilsTest_CopyToNewBlock, OriginalBlockUnchanged) {
|
||||||
auto block = blockStore->create(SIZE);
|
auto block = blockStore->create(SIZE);
|
||||||
std::memcpy(block->data(), dataFixture.data(), SIZE);
|
block->write(dataFixture.data(), 0, SIZE);
|
||||||
auto block2 = copyToNewBlock(blockStore.get(), *block);
|
auto block2 = copyToNewBlock(blockStore.get(), *block);
|
||||||
|
|
||||||
EXPECT_EQ(SIZE, block->size());
|
EXPECT_EQ(SIZE, block->size());
|
||||||
@ -78,7 +78,7 @@ TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyEmptyBlock) {
|
|||||||
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyZeroBlock) {
|
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyZeroBlock) {
|
||||||
auto block = blockStore->create(SIZE);
|
auto block = blockStore->create(SIZE);
|
||||||
auto block2 = blockStore->create(SIZE);
|
auto block2 = blockStore->create(SIZE);
|
||||||
std::memcpy(block2->data(), dataFixture.data(), SIZE);
|
block2->write(dataFixture.data(), 0, SIZE);
|
||||||
copyTo(block2.get(), *block);
|
copyTo(block2.get(), *block);
|
||||||
|
|
||||||
EXPECT_EQ(0, std::memcmp(ZEROES.data(), block2->data(), SIZE));
|
EXPECT_EQ(0, std::memcmp(ZEROES.data(), block2->data(), SIZE));
|
||||||
@ -86,7 +86,7 @@ TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyZeroBlock) {
|
|||||||
|
|
||||||
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyDataBlock) {
|
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyDataBlock) {
|
||||||
auto block = blockStore->create(SIZE);
|
auto block = blockStore->create(SIZE);
|
||||||
std::memcpy(block->data(), dataFixture.data(), SIZE);
|
block->write(dataFixture.data(), 0, SIZE);
|
||||||
auto block2 = blockStore->create(SIZE);
|
auto block2 = blockStore->create(SIZE);
|
||||||
copyTo(block2.get(), *block);
|
copyTo(block2.get(), *block);
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, CopyDataBlock) {
|
|||||||
|
|
||||||
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, OriginalBlockUnchanged) {
|
TEST_F(BlockStoreUtilsTest_CopyToExistingBlock, OriginalBlockUnchanged) {
|
||||||
auto block = blockStore->create(SIZE);
|
auto block = blockStore->create(SIZE);
|
||||||
std::memcpy(block->data(), dataFixture.data(), SIZE);
|
block->write(dataFixture.data(), 0, SIZE);
|
||||||
auto block2 = blockStore->create(SIZE);
|
auto block2 = blockStore->create(SIZE);
|
||||||
copyTo(block2.get(), *block);
|
copyTo(block2.get(), *block);
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <messmer/blockstore/interface/BlockStore.h>
|
#include "../interface/BlockStore.h"
|
||||||
#include <messmer/blockstore/utils/BlockStoreUtils.h>
|
#include "BlockStoreUtils.h"
|
||||||
|
#include "Data.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
@ -16,7 +17,13 @@ unique_ptr<Block> copyToNewBlock(BlockStore *blockStore, const Block &block) {
|
|||||||
|
|
||||||
void copyTo(Block *target, const Block &source) {
|
void copyTo(Block *target, const Block &source) {
|
||||||
assert(target->size() == source.size());
|
assert(target->size() == source.size());
|
||||||
std::memcpy(target->data(), source.data(), source.size());
|
target->write(source.data(), 0, source.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillWithZeroes(Block *target) {
|
||||||
|
Data zeroes(target->size());
|
||||||
|
zeroes.FillWithZeroes();
|
||||||
|
target->write(zeroes.data(), 0, target->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,9 @@ namespace utils {
|
|||||||
|
|
||||||
std::unique_ptr<Block> copyToNewBlock(BlockStore *blockStore, const Block &block);
|
std::unique_ptr<Block> copyToNewBlock(BlockStore *blockStore, const Block &block);
|
||||||
void copyTo(Block *target, const Block &source);
|
void copyTo(Block *target, const Block &source);
|
||||||
|
void fillWithZeroes(Block *target);
|
||||||
|
|
||||||
|
//TODO Test fillWithZeroes
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user