Factor out BlobStoreWithRandomKeys
This commit is contained in:
parent
2b112c7fdb
commit
9125e7a3ce
@ -1,2 +1,3 @@
|
|||||||
|
add_subdirectory(interface)
|
||||||
add_subdirectory(utils)
|
add_subdirectory(utils)
|
||||||
add_subdirectory(implementations)
|
add_subdirectory(implementations)
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
add_library(blobstore_inmemory InMemoryBlob.cpp InMemoryBlobStore.cpp)
|
add_library(blobstore_inmemory InMemoryBlob.cpp InMemoryBlobStore.cpp)
|
||||||
|
|
||||||
target_link_libraries(blobstore_inmemory blobstore_utils)
|
target_link_libraries(blobstore_inmemory blobstore_interface blobstore_utils)
|
||||||
|
@ -12,10 +12,9 @@ namespace blobstore {
|
|||||||
namespace inmemory {
|
namespace inmemory {
|
||||||
|
|
||||||
InMemoryBlobStore::InMemoryBlobStore()
|
InMemoryBlobStore::InMemoryBlobStore()
|
||||||
: _blobs(), _generate_key_mutex() {}
|
: _blobs() {}
|
||||||
|
|
||||||
BlobStore::BlobWithKey InMemoryBlobStore::create(size_t size) {
|
BlobWithKey InMemoryBlobStore::create(const std::string &key, size_t size) {
|
||||||
std::string key = _generateKey();
|
|
||||||
InMemoryBlob blob(size);
|
InMemoryBlob blob(size);
|
||||||
_blobs.insert(make_pair(key, blob));
|
_blobs.insert(make_pair(key, blob));
|
||||||
|
|
||||||
@ -23,19 +22,8 @@ BlobStore::BlobWithKey InMemoryBlobStore::create(size_t size) {
|
|||||||
return BlobWithKey(key, make_unique<InMemoryBlob>(blob));
|
return BlobWithKey(key, make_unique<InMemoryBlob>(blob));
|
||||||
}
|
}
|
||||||
|
|
||||||
string InMemoryBlobStore::_generateKey() {
|
bool InMemoryBlobStore::exists(const std::string &key) {
|
||||||
lock_guard<mutex> lock(_generate_key_mutex);
|
return _blobs.count(key) > 0;
|
||||||
|
|
||||||
string key;
|
|
||||||
do {
|
|
||||||
key = _generateRandomKey();
|
|
||||||
} while (_blobs.count(key) > 0);
|
|
||||||
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
string InMemoryBlobStore::_generateRandomKey() {
|
|
||||||
return RandomKeyGenerator::singleton().create();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Blob> InMemoryBlobStore::load(const string &key) {
|
unique_ptr<Blob> InMemoryBlobStore::load(const string &key) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#ifndef BLOBSTORE_IMPLEMENTATIONS_INMEMORY_INMEMORYBLOBSTORE_H_
|
#ifndef BLOBSTORE_IMPLEMENTATIONS_INMEMORY_INMEMORYBLOBSTORE_H_
|
||||||
#define BLOBSTORE_IMPLEMENTATIONS_INMEMORY_INMEMORYBLOBSTORE_H_
|
#define BLOBSTORE_IMPLEMENTATIONS_INMEMORY_INMEMORYBLOBSTORE_H_
|
||||||
|
|
||||||
#include "blobstore/interface/BlobStore.h"
|
#include "blobstore/interface/helpers/BlobStoreWithRandomKeys.h"
|
||||||
|
|
||||||
#include "fspp/utils/macros.h"
|
#include "fspp/utils/macros.h"
|
||||||
|
|
||||||
@ -13,19 +13,18 @@ namespace blobstore {
|
|||||||
namespace inmemory {
|
namespace inmemory {
|
||||||
class InMemoryBlob;
|
class InMemoryBlob;
|
||||||
|
|
||||||
class InMemoryBlobStore: public BlobStore {
|
class InMemoryBlobStore: public BlobStoreWithRandomKeys {
|
||||||
public:
|
public:
|
||||||
InMemoryBlobStore();
|
InMemoryBlobStore();
|
||||||
|
|
||||||
BlobWithKey create(size_t size) override;
|
bool exists(const std::string &key) override;
|
||||||
std::unique_ptr<Blob> load(const std::string &key) override;
|
std::unique_ptr<Blob> load(const std::string &key) override;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::string _generateKey();
|
BlobWithKey create(const std::string &key, size_t size) override;
|
||||||
std::string _generateRandomKey();
|
|
||||||
|
|
||||||
|
private:
|
||||||
std::map<std::string, InMemoryBlob> _blobs;
|
std::map<std::string, InMemoryBlob> _blobs;
|
||||||
std::mutex _generate_key_mutex;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(InMemoryBlobStore);
|
DISALLOW_COPY_AND_ASSIGN(InMemoryBlobStore);
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
add_library(blobstore_ondisk OnDiskBlob.cpp OnDiskBlobStore.cpp FileAlreadyExistsException.cpp)
|
add_library(blobstore_ondisk OnDiskBlob.cpp OnDiskBlobStore.cpp FileAlreadyExistsException.cpp)
|
||||||
|
|
||||||
target_link_libraries(blobstore_ondisk blobstore_utils boost_filesystem boost_system)
|
target_link_libraries(blobstore_ondisk blobstore_interface blobstore_utils boost_filesystem boost_system)
|
||||||
|
@ -14,29 +14,18 @@ namespace blobstore {
|
|||||||
namespace ondisk {
|
namespace ondisk {
|
||||||
|
|
||||||
OnDiskBlobStore::OnDiskBlobStore(const boost::filesystem::path &rootdir)
|
OnDiskBlobStore::OnDiskBlobStore(const boost::filesystem::path &rootdir)
|
||||||
: _rootdir(rootdir), _generate_key_mutex() {}
|
: _rootdir(rootdir) {}
|
||||||
|
|
||||||
BlobStore::BlobWithKey OnDiskBlobStore::create(size_t size) {
|
BlobWithKey OnDiskBlobStore::create(const std::string &key, size_t size) {
|
||||||
std::string key = _generateKey();
|
|
||||||
auto file_path = _rootdir / key;
|
auto file_path = _rootdir / key;
|
||||||
auto blob = OnDiskBlob::CreateOnDisk(file_path, size);
|
auto blob = OnDiskBlob::CreateOnDisk(file_path, size);
|
||||||
|
|
||||||
return BlobStore::BlobWithKey(key, std::move(blob));
|
return BlobWithKey(key, std::move(blob));
|
||||||
}
|
}
|
||||||
|
|
||||||
string OnDiskBlobStore::_generateKey() {
|
bool OnDiskBlobStore::exists(const std::string &key) {
|
||||||
lock_guard<mutex> lock(_generate_key_mutex);
|
auto file_path = _rootdir / key;
|
||||||
|
return bf::exists(file_path);
|
||||||
string key;
|
|
||||||
do {
|
|
||||||
key = _generateRandomKey();
|
|
||||||
} while (bf::exists(_rootdir / key));
|
|
||||||
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
string OnDiskBlobStore::_generateRandomKey() {
|
|
||||||
return RandomKeyGenerator::singleton().create();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Blob> OnDiskBlobStore::load(const string &key) {
|
unique_ptr<Blob> OnDiskBlobStore::load(const string &key) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#ifndef BLOBSTORE_IMPLEMENTATIONS_ONDISK_ONDISKBLOBSTORE_H_
|
#ifndef BLOBSTORE_IMPLEMENTATIONS_ONDISK_ONDISKBLOBSTORE_H_
|
||||||
#define BLOBSTORE_IMPLEMENTATIONS_ONDISK_ONDISKBLOBSTORE_H_
|
#define BLOBSTORE_IMPLEMENTATIONS_ONDISK_ONDISKBLOBSTORE_H_
|
||||||
|
|
||||||
#include "blobstore/interface/BlobStore.h"
|
#include "blobstore/interface/helpers/BlobStoreWithRandomKeys.h"
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
@ -13,19 +13,18 @@
|
|||||||
namespace blobstore {
|
namespace blobstore {
|
||||||
namespace ondisk {
|
namespace ondisk {
|
||||||
|
|
||||||
class OnDiskBlobStore: public BlobStore {
|
class OnDiskBlobStore: public BlobStoreWithRandomKeys {
|
||||||
public:
|
public:
|
||||||
OnDiskBlobStore(const boost::filesystem::path &rootdir);
|
OnDiskBlobStore(const boost::filesystem::path &rootdir);
|
||||||
|
|
||||||
BlobWithKey create(size_t size) override;
|
bool exists(const std::string &key) override;
|
||||||
std::unique_ptr<Blob> load(const std::string &key) override;
|
std::unique_ptr<Blob> load(const std::string &key) override;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::string _generateKey();
|
BlobWithKey create(const std::string &key, size_t size) override;
|
||||||
std::string _generateRandomKey();
|
|
||||||
const boost::filesystem::path _rootdir;
|
|
||||||
|
|
||||||
std::mutex _generate_key_mutex;
|
private:
|
||||||
|
const boost::filesystem::path _rootdir;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(OnDiskBlobStore);
|
DISALLOW_COPY_AND_ASSIGN(OnDiskBlobStore);
|
||||||
};
|
};
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "Blob.h"
|
#include "Blob.h"
|
||||||
|
#include "blobstore/utils/BlobWithKey.h"
|
||||||
|
|
||||||
namespace blobstore {
|
namespace blobstore {
|
||||||
|
|
||||||
@ -15,15 +16,9 @@ class BlobStore {
|
|||||||
public:
|
public:
|
||||||
virtual ~BlobStore() {}
|
virtual ~BlobStore() {}
|
||||||
|
|
||||||
struct BlobWithKey {
|
|
||||||
BlobWithKey(const std::string &key_, std::unique_ptr<Blob> &&blob_): key(key_), blob(std::move(blob_)) {}
|
|
||||||
|
|
||||||
std::string key;
|
|
||||||
std::unique_ptr<Blob> blob;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual BlobWithKey create(size_t size) = 0;
|
virtual BlobWithKey create(size_t size) = 0;
|
||||||
virtual std::unique_ptr<Blob> load(const std::string &key) = 0;
|
virtual std::unique_ptr<Blob> load(const std::string &key) = 0;
|
||||||
|
virtual bool exists(const std::string &key) = 0;
|
||||||
//TODO Needed for performance? Or is deleting loaded blobs enough?
|
//TODO Needed for performance? Or is deleting loaded blobs enough?
|
||||||
//virtual void remove(const std::string &key) = 0;
|
//virtual void remove(const std::string &key) = 0;
|
||||||
};
|
};
|
||||||
|
1
src/blobstore/interface/CMakeLists.txt
Normal file
1
src/blobstore/interface/CMakeLists.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
add_library(blobstore_interface helpers/BlobStoreWithRandomKeys.cpp)
|
32
src/blobstore/interface/helpers/BlobStoreWithRandomKeys.cpp
Normal file
32
src/blobstore/interface/helpers/BlobStoreWithRandomKeys.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "BlobStoreWithRandomKeys.h"
|
||||||
|
|
||||||
|
#include "blobstore/utils/RandomKeyGenerator.h"
|
||||||
|
|
||||||
|
using namespace blobstore;
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::lock_guard;
|
||||||
|
using std::mutex;
|
||||||
|
|
||||||
|
BlobStoreWithRandomKeys::BlobStoreWithRandomKeys()
|
||||||
|
:_generate_key_mutex() {
|
||||||
|
}
|
||||||
|
|
||||||
|
BlobWithKey BlobStoreWithRandomKeys::create(size_t size) {
|
||||||
|
return create(_generateKey(), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
string BlobStoreWithRandomKeys::_generateKey() {
|
||||||
|
lock_guard<mutex> lock(_generate_key_mutex);
|
||||||
|
|
||||||
|
string key;
|
||||||
|
do {
|
||||||
|
key = _generateRandomKey();
|
||||||
|
} while (exists(key));
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
string BlobStoreWithRandomKeys::_generateRandomKey() {
|
||||||
|
return RandomKeyGenerator::singleton().create();
|
||||||
|
}
|
33
src/blobstore/interface/helpers/BlobStoreWithRandomKeys.h
Normal file
33
src/blobstore/interface/helpers/BlobStoreWithRandomKeys.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef FSPP_BLOBSTORE_BLOBSTOREWITHRANDOMKEYS_H_
|
||||||
|
#define FSPP_BLOBSTORE_BLOBSTOREWITHRANDOMKEYS_H_
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include "blobstore/interface/Blob.h"
|
||||||
|
#include "blobstore/interface/BlobStore.h"
|
||||||
|
|
||||||
|
namespace blobstore {
|
||||||
|
|
||||||
|
class BlobStoreWithRandomKeys: public BlobStore {
|
||||||
|
public:
|
||||||
|
BlobStoreWithRandomKeys();
|
||||||
|
virtual ~BlobStoreWithRandomKeys() {}
|
||||||
|
|
||||||
|
BlobWithKey create(size_t size) override;
|
||||||
|
|
||||||
|
virtual std::unique_ptr<Blob> load(const std::string &key) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual BlobWithKey create(const std::string &key, size_t size) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string _generateKey();
|
||||||
|
std::string _generateRandomKey();
|
||||||
|
|
||||||
|
std::mutex _generate_key_mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
20
src/blobstore/utils/BlobWithKey.h
Normal file
20
src/blobstore/utils/BlobWithKey.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef BLOBSTORE_INTERFACE_BLOBWITHKEY_H_
|
||||||
|
#define BLOBSTORE_INTERFACE_BLOBWITHKEY_H_
|
||||||
|
|
||||||
|
#include "blobstore/interface/Blob.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace blobstore {
|
||||||
|
|
||||||
|
struct BlobWithKey {
|
||||||
|
BlobWithKey(const std::string &key_, std::unique_ptr<Blob> &&blob_): key(key_), blob(std::move(blob_)) {}
|
||||||
|
|
||||||
|
std::string key;
|
||||||
|
std::unique_ptr<Blob> blob;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user