RocksDB implementations should be transactional #24
This commit is contained in:
parent
45a444eb29
commit
12a373324e
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef REPERTORY_INCLUDE_UTILS_DB_ROCKSDB_UTILS_HPP_
|
|
||||||
#define REPERTORY_INCLUDE_UTILS_DB_ROCKSDB_UTILS_HPP_
|
|
||||||
|
|
||||||
namespace repertory::utils::db::rocksdb {
|
|
||||||
[[nodiscard]] auto
|
|
||||||
create_rocksdb(const repertory::app_config &cfg, const std::string &name,
|
|
||||||
const std::vector<rocksdb::ColumnFamilyDescriptor> &families,
|
|
||||||
std::vector<rocksdb::ColumnFamilyHandle *> &handles, bool clear)
|
|
||||||
-> std::unique_ptr<rocksdb::TransactionDB>;
|
|
||||||
} // namespace repertory::utils::db::rocksdb
|
|
||||||
|
|
||||||
#endif // REPERTORY_INCLUDE_UTILS_DB_ROCKSDB_UTILS_HPP_
|
|
@ -30,6 +30,39 @@
|
|||||||
#include "utils/path.hpp"
|
#include "utils/path.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
[[nodiscard]] auto
|
||||||
|
create_rocksdb(const repertory::app_config &cfg, const std::string &name,
|
||||||
|
const std::vector<rocksdb::ColumnFamilyDescriptor> &families,
|
||||||
|
std::vector<rocksdb::ColumnFamilyHandle *> &handles, bool clear)
|
||||||
|
-> std::unique_ptr<rocksdb::TransactionDB> {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
auto path = repertory::utils::path::combine(cfg.get_data_directory(), {name});
|
||||||
|
if (clear &&
|
||||||
|
not repertory::utils::file::directory{path}.remove_recursively()) {
|
||||||
|
repertory::utils::error::raise_error(
|
||||||
|
function_name, "failed to remove " + name + " db|" + path);
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb::Options options{};
|
||||||
|
options.create_if_missing = true;
|
||||||
|
options.create_missing_column_families = true;
|
||||||
|
options.db_log_dir = cfg.get_log_directory();
|
||||||
|
options.keep_log_file_num = 10;
|
||||||
|
|
||||||
|
rocksdb::TransactionDB *ptr{};
|
||||||
|
auto status = rocksdb::TransactionDB::Open(
|
||||||
|
options, rocksdb::TransactionDBOptions{}, path, families, &handles, &ptr);
|
||||||
|
if (not status.ok()) {
|
||||||
|
repertory::utils::error::raise_error(function_name, status.ToString());
|
||||||
|
throw repertory::startup_exception(status.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::unique_ptr<rocksdb::TransactionDB>(ptr);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace repertory {
|
namespace repertory {
|
||||||
rdb_file_mgr_db::rdb_file_mgr_db(const app_config &cfg) : cfg_(cfg) {
|
rdb_file_mgr_db::rdb_file_mgr_db(const app_config &cfg) : cfg_(cfg) {
|
||||||
create_or_open(false);
|
create_or_open(false);
|
||||||
@ -47,8 +80,7 @@ void rdb_file_mgr_db::create_or_open(bool clear) {
|
|||||||
families.emplace_back("upload", rocksdb::ColumnFamilyOptions());
|
families.emplace_back("upload", rocksdb::ColumnFamilyOptions());
|
||||||
|
|
||||||
auto handles = std::vector<rocksdb::ColumnFamilyHandle *>();
|
auto handles = std::vector<rocksdb::ColumnFamilyHandle *>();
|
||||||
db_ = utils::db::rocksdb::create_rocksdb(cfg_, "file_mgr", families, handles,
|
db_ = create_rocksdb(cfg_, "file_mgr", families, handles, clear);
|
||||||
clear);
|
|
||||||
|
|
||||||
std::size_t idx{};
|
std::size_t idx{};
|
||||||
resume_family_ = handles[idx++];
|
resume_family_ = handles[idx++];
|
||||||
|
@ -29,6 +29,39 @@
|
|||||||
#include "utils/path.hpp"
|
#include "utils/path.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
[[nodiscard]] auto
|
||||||
|
create_rocksdb(const repertory::app_config &cfg, const std::string &name,
|
||||||
|
const std::vector<rocksdb::ColumnFamilyDescriptor> &families,
|
||||||
|
std::vector<rocksdb::ColumnFamilyHandle *> &handles, bool clear)
|
||||||
|
-> std::unique_ptr<rocksdb::TransactionDB> {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
auto path = repertory::utils::path::combine(cfg.get_data_directory(), {name});
|
||||||
|
if (clear &&
|
||||||
|
not repertory::utils::file::directory{path}.remove_recursively()) {
|
||||||
|
repertory::utils::error::raise_error(
|
||||||
|
function_name, "failed to remove " + name + " db|" + path);
|
||||||
|
}
|
||||||
|
|
||||||
|
rocksdb::Options options{};
|
||||||
|
options.create_if_missing = true;
|
||||||
|
options.create_missing_column_families = true;
|
||||||
|
options.db_log_dir = cfg.get_log_directory();
|
||||||
|
options.keep_log_file_num = 10;
|
||||||
|
|
||||||
|
rocksdb::TransactionDB *ptr{};
|
||||||
|
auto status = rocksdb::TransactionDB::Open(
|
||||||
|
options, rocksdb::TransactionDBOptions{}, path, families, &handles, &ptr);
|
||||||
|
if (not status.ok()) {
|
||||||
|
repertory::utils::error::raise_error(function_name, status.ToString());
|
||||||
|
throw repertory::startup_exception(status.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::unique_ptr<rocksdb::TransactionDB>(ptr);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace repertory {
|
namespace repertory {
|
||||||
rdb_meta_db::rdb_meta_db(const app_config &cfg) : cfg_(cfg) {
|
rdb_meta_db::rdb_meta_db(const app_config &cfg) : cfg_(cfg) {
|
||||||
create_or_open(false);
|
create_or_open(false);
|
||||||
@ -47,8 +80,7 @@ void rdb_meta_db::create_or_open(bool clear) {
|
|||||||
families.emplace_back("source", rocksdb::ColumnFamilyOptions());
|
families.emplace_back("source", rocksdb::ColumnFamilyOptions());
|
||||||
|
|
||||||
auto handles = std::vector<rocksdb::ColumnFamilyHandle *>();
|
auto handles = std::vector<rocksdb::ColumnFamilyHandle *>();
|
||||||
db_ = utils::db::rocksdb::create_rocksdb(cfg_, "provider_meta", families,
|
db_ = create_rocksdb(cfg_, "provider_meta", families, handles, clear);
|
||||||
handles, clear);
|
|
||||||
|
|
||||||
std::size_t idx{};
|
std::size_t idx{};
|
||||||
default_family_ = handles[idx++];
|
default_family_ = handles[idx++];
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include "utils/db/rocksdb/utils.hpp"
|
|
||||||
|
|
||||||
namespace repertory::utils::db::rocksdb {
|
|
||||||
auto create_rocksdb(
|
|
||||||
const repertory::app_config &cfg, const std::string &name,
|
|
||||||
const std::vector<rocksdb::ColumnFamilyDescriptor> &families,
|
|
||||||
std::vector<rocksdb::ColumnFamilyHandle *> &handles, bool clear)
|
|
||||||
-> std::unique_ptr<rocksdb::TransactionDB> {
|
|
||||||
REPERTORY_USES_FUNCTION_NAME();
|
|
||||||
|
|
||||||
auto path = repertory::utils::path::combine(cfg.get_data_directory(), {name});
|
|
||||||
if (clear &&
|
|
||||||
not repertory::utils::file::directory{path}.remove_recursively()) {
|
|
||||||
repertory::utils::error::raise_error(
|
|
||||||
function_name, "failed to remove " + name + " db|" + path);
|
|
||||||
}
|
|
||||||
|
|
||||||
rocksdb::Options options{};
|
|
||||||
options.create_if_missing = true;
|
|
||||||
options.create_missing_column_families = true;
|
|
||||||
options.db_log_dir = cfg.get_log_directory();
|
|
||||||
options.keep_log_file_num = 10;
|
|
||||||
|
|
||||||
rocksdb::TransactionDB *ptr{};
|
|
||||||
auto status = rocksdb::TransactionDB::Open(
|
|
||||||
options, rocksdb::TransactionDBOptions{}, path, families, &handles, &ptr);
|
|
||||||
if (not status.ok()) {
|
|
||||||
repertory::utils::error::raise_error(function_name, status.ToString());
|
|
||||||
throw repertory::startup_exception(status.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::unique_ptr<rocksdb::TransactionDB>(ptr);
|
|
||||||
}
|
|
||||||
} // namespace repertory::utils::db::rocksdb
|
|
Loading…
x
Reference in New Issue
Block a user