Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Replace all old instances of Config with New Config #1627

Draft
wants to merge 18 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 0 additions & 43 deletions docs/examples/config/cloud-example-config.json

This file was deleted.

7 changes: 4 additions & 3 deletions src/app/ClioApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
#include "rpc/WorkQueue.hpp"
#include "rpc/common/impl/HandlerProvider.hpp"
#include "util/build/Build.hpp"
#include "util/config/Config.hpp"
#include "util/log/Logger.hpp"
#include "util/newconfig/ConfigDefinition.hpp"
#include "util/prometheus/Prometheus.hpp"
#include "web/RPCServerHandler.hpp"
#include "web/Server.hpp"
Expand Down Expand Up @@ -72,7 +72,8 @@ start(boost::asio::io_context& ioc, std::uint32_t numThreads)

} // namespace

ClioApplication::ClioApplication(util::Config const& config) : config_(config), signalsHandler_{config_}
ClioApplication::ClioApplication(util::config::ClioConfigDefinition const& config)
: config_(config), signalsHandler_{config_}
{
LOG(util::LogService::info()) << "Clio version: " << util::build::getClioFullVersionString();
PrometheusService::init(config);
Expand All @@ -81,7 +82,7 @@ ClioApplication::ClioApplication(util::Config const& config) : config_(config),
int
ClioApplication::run()
{
auto const threads = config_.valueOr("io_threads", 2);
auto const threads = config_.getValue("io_threads").asIntType<uint16_t>();
if (threads <= 0) {
LOG(util::LogService::fatal()) << "io_threads is less than 1";
return EXIT_FAILURE;
Expand Down
7 changes: 3 additions & 4 deletions src/app/ClioApplication.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,16 @@
//==============================================================================

#pragma once

#include "util/SignalsHandler.hpp"
#include "util/config//Config.hpp"
#include "util/newconfig/ConfigDefinition.hpp"

namespace app {

/**
* @brief The main application class
*/
class ClioApplication {
util::Config const& config_;
util::config::ClioConfigDefinition const& config_;
util::SignalsHandler signalsHandler_;

public:
Expand All @@ -37,7 +36,7 @@ class ClioApplication {
*
* @param config The configuration of the application
*/
ClioApplication(util::Config const& config);
ClioApplication(util::config::ClioConfigDefinition const& config);

/**
* @brief Run the application
Expand Down
10 changes: 5 additions & 5 deletions src/data/BackendFactory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
#include "data/BackendInterface.hpp"
#include "data/CassandraBackend.hpp"
#include "data/cassandra/SettingsProvider.hpp"
#include "util/config/Config.hpp"
#include "util/log/Logger.hpp"
#include "util/newconfig/ConfigDefinition.hpp"

#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/predicate.hpp>
Expand All @@ -41,18 +41,18 @@ namespace data {
* @return A shared_ptr<BackendInterface> with the selected implementation
*/
inline std::shared_ptr<BackendInterface>
make_Backend(util::Config const& config)
make_Backend(util::config::ClioConfigDefinition const& config)
{
static util::Logger const log{"Backend"};
LOG(log.info()) << "Constructing BackendInterface";

auto const readOnly = config.valueOr("read_only", false);
auto const readOnly = config.getValue("read_only").asBool();

auto const type = config.value<std::string>("database.type");
auto const type = config.getValue("database.type").asString();
std::shared_ptr<BackendInterface> backend = nullptr;

if (boost::iequals(type, "cassandra")) {
auto cfg = config.section("database." + type);
auto const cfg = config.getObject("database." + type);
backend = std::make_shared<data::cassandra::CassandraBackend>(data::cassandra::SettingsProvider{cfg}, readOnly);
}

Expand Down
2 changes: 1 addition & 1 deletion src/data/CassandraBackend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class BasicCassandraBackend : public BackendInterface {
, executor_{settingsProvider_.getSettings(), handle_}
{
if (auto const res = handle_.connect(); not res)
throw std::runtime_error("Could not connect to databse: " + res.error());
throw std::runtime_error("Could not connect to database: " + res.error());

if (not readOnly) {
if (auto const res = handle_.execute(schema_.createKeyspace); not res) {
Expand Down
91 changes: 42 additions & 49 deletions src/data/cassandra/SettingsProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include "data/cassandra/Types.hpp"
#include "data/cassandra/impl/Cluster.hpp"
#include "util/Constants.hpp"
#include "util/config/Config.hpp"
#include "util/newconfig/ObjectView.hpp"

#include <boost/json/conversion.hpp>
#include <boost/json/value.hpp>
Expand All @@ -36,43 +36,26 @@
#include <ios>
#include <iterator>
#include <optional>
#include <stdexcept>
#include <string>
#include <string_view>
#include <system_error>

namespace data::cassandra {

namespace impl {
inline Settings::ContactPoints
tag_invoke(boost::json::value_to_tag<Settings::ContactPoints>, boost::json::value const& value)
{
if (not value.is_object()) {
throw std::runtime_error("Feed entire Cassandra section to parse Settings::ContactPoints instead");
}

util::Config const obj{value};
Settings::ContactPoints out;

out.contactPoints = obj.valueOrThrow<std::string>("contact_points", "`contact_points` must be a string");
out.port = obj.maybeValue<uint16_t>("port");

return out;
}

inline Settings::SecureConnectionBundle
tag_invoke(boost::json::value_to_tag<Settings::SecureConnectionBundle>, boost::json::value const& value)
invoke_tag_SecureConnections(std::string_view value)
{
if (not value.is_string())
throw std::runtime_error("`secure_connect_bundle` must be a string");
return Settings::SecureConnectionBundle{value.as_string().data()};
return Settings::SecureConnectionBundle{value.data()};
}
} // namespace impl

SettingsProvider::SettingsProvider(util::Config const& cfg)
SettingsProvider::SettingsProvider(util::config::ObjectView const& cfg)
: config_{cfg}
, keyspace_{cfg.valueOr<std::string>("keyspace", "clio")}
, tablePrefix_{cfg.maybeValue<std::string>("table_prefix")}
, replicationFactor_{cfg.valueOr<uint16_t>("replication_factor", 3)}
, keyspace_{cfg.getValue("keyspace").asString()}
, tablePrefix_{cfg.getValue("table_prefix").hasValue() ? std::make_optional(cfg.getValue("table_prefix").asString()) : std::nullopt}
, replicationFactor_{cfg.getValue("replication_factor").asIntType<uint16_t>()}
, settings_{parseSettings()}
{
}
Expand All @@ -86,8 +69,8 @@ SettingsProvider::getSettings() const
std::optional<std::string>
SettingsProvider::parseOptionalCertificate() const
{
if (auto const certPath = config_.maybeValue<std::string>("certfile"); certPath) {
auto const path = std::filesystem::path(*certPath);
if (auto const certPath = config_.getValue("certfile"); certPath.hasValue()) {
auto const path = std::filesystem::path(certPath.asString());
std::ifstream fileStream(path.string(), std::ios::in);
if (!fileStream) {
throw std::system_error(errno, std::generic_category(), "Opening certificate " + path.string());
Expand All @@ -108,34 +91,44 @@ Settings
SettingsProvider::parseSettings() const
{
auto settings = Settings::defaultSettings();
if (auto const bundle = config_.maybeValue<Settings::SecureConnectionBundle>("secure_connect_bundle"); bundle) {
settings.connectionInfo = *bundle;

// all config values used in settings is under "database.cassandra" prefix
if (config_.getValue("secure_connect_bundle").hasValue()) {
auto const bundle = impl::invoke_tag_SecureConnections(config_.getValue("secure_connect_bundle").asString());
settings.connectionInfo = bundle;
} else {
settings.connectionInfo =
config_.valueOrThrow<Settings::ContactPoints>("Missing contact_points in Cassandra config");
Settings::ContactPoints out;
out.contactPoints = config_.getValue("contact_points").asString();
out.port = config_.getValue("port").hasValue()
? std::make_optional(config_.getValue("port").asIntType<uint32_t>())
: std::nullopt;
settings.connectionInfo = out;
}

settings.threads = config_.valueOr<uint32_t>("threads", settings.threads);
settings.maxWriteRequestsOutstanding =
config_.valueOr<uint32_t>("max_write_requests_outstanding", settings.maxWriteRequestsOutstanding);
settings.maxReadRequestsOutstanding =
config_.valueOr<uint32_t>("max_read_requests_outstanding", settings.maxReadRequestsOutstanding);
settings.coreConnectionsPerHost =
config_.valueOr<uint32_t>("core_connections_per_host", settings.coreConnectionsPerHost);
settings.queueSizeIO = config_.maybeValue<uint32_t>("queue_size_io");
settings.writeBatchSize = config_.valueOr<std::size_t>("write_batch_size", settings.writeBatchSize);

auto const connectTimeoutSecond = config_.maybeValue<uint32_t>("connect_timeout");
if (connectTimeoutSecond)
settings.connectionTimeout = std::chrono::milliseconds{*connectTimeoutSecond * util::MILLISECONDS_PER_SECOND};
settings.threads = config_.getValue("threads").asIntType<uint32_t>();
settings.maxWriteRequestsOutstanding = config_.getValue("max_write_requests_outstanding").asIntType<uint32_t>();
settings.maxReadRequestsOutstanding = config_.getValue("max_read_requests_outstanding").asIntType<uint32_t>();
settings.coreConnectionsPerHost = config_.getValue("core_connections_per_host").asIntType<uint32_t>();
settings.queueSizeIO = config_.getValue("queue_size_io").hasValue()
? std::make_optional(config_.getValue("queue_size_io").asIntType<uint32_t>())
: std::nullopt;
settings.writeBatchSize = config_.getValue("write_batch_size").asIntType<std::size_t>();

if (config_.getValue("connect_timeout").hasValue()) {
auto const connectTimeoutSecond = config_.getValue("connect_timeout").asIntType<uint32_t>();
settings.connectionTimeout = std::chrono::milliseconds{connectTimeoutSecond * util::MILLISECONDS_PER_SECOND};
}

auto const requestTimeoutSecond = config_.maybeValue<uint32_t>("request_timeout");
if (requestTimeoutSecond)
settings.requestTimeout = std::chrono::milliseconds{*requestTimeoutSecond * util::MILLISECONDS_PER_SECOND};
if (config_.getValue("request_timeout").hasValue()) {
auto const requestTimeoutSecond = config_.getValue("request_timeout").asIntType<uint32_t>();
settings.requestTimeout = std::chrono::milliseconds{requestTimeoutSecond * util::MILLISECONDS_PER_SECOND};
}

auto const username = config_.getValue("username");
auto const password = config_.getValue("password");
settings.certificate = parseOptionalCertificate();
settings.username = config_.maybeValue<std::string>("username");
settings.password = config_.maybeValue<std::string>("password");
settings.username = username.hasValue() ? std::make_optional(username.asString()) : std::nullopt;
settings.password = password.hasValue() ? std::make_optional(password.asString()) : std::nullopt;

return settings;
}
Expand Down
9 changes: 4 additions & 5 deletions src/data/cassandra/SettingsProvider.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,9 @@

#pragma once

#include "data/cassandra/Handle.hpp"
#include "data/cassandra/Types.hpp"
#include "util/config/Config.hpp"
#include "util/log/Logger.hpp"
#include "data/cassandra/impl/Cluster.hpp"
#include "util/newconfig/ObjectView.hpp"

#include <cstdint>
#include <optional>
Expand All @@ -34,7 +33,7 @@ namespace data::cassandra {
* @brief Provides settings for @ref BasicCassandraBackend.
*/
class SettingsProvider {
util::Config config_;
util::config::ObjectView config_;

std::string keyspace_;
std::optional<std::string> tablePrefix_;
Expand All @@ -47,7 +46,7 @@ class SettingsProvider {
*
* @param cfg The config of Clio to use
*/
explicit SettingsProvider(util::Config const& cfg);
explicit SettingsProvider(util::config::ObjectView const& cfg);

/**
* @return The cluster settings
Expand Down
6 changes: 5 additions & 1 deletion src/etl/CacheLoader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,11 @@ class CacheLoader {
* @param backend The backend to use
* @param cache The cache to load into
*/
CacheLoader(util::Config const& config, std::shared_ptr<BackendInterface> const& backend, CacheType& cache)
CacheLoader(
util::config::ClioConfigDefinition const& config,
std::shared_ptr<BackendInterface> const& backend,
CacheType& cache
)
: backend_{backend}, cache_{cache}, settings_{make_CacheLoaderSettings(config)}, ctx_{settings_.numThreads}
{
}
Expand Down
44 changes: 21 additions & 23 deletions src/etl/CacheLoaderSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@

#include "etl/CacheLoaderSettings.hpp"

#include "util/config/Config.hpp"
#include "util/newconfig/ConfigDefinition.hpp"

#include <boost/algorithm/string/predicate.hpp>

#include <cstddef>
#include <string>
#include <cstdint>

namespace etl {

Expand All @@ -47,31 +47,29 @@ CacheLoaderSettings::isDisabled() const
}

[[nodiscard]] CacheLoaderSettings
make_CacheLoaderSettings(util::Config const& config)
make_CacheLoaderSettings(util::config::ClioConfigDefinition const& config)
{
CacheLoaderSettings settings;
settings.numThreads = config.valueOr("io_threads", settings.numThreads);
if (config.contains("cache")) {
auto const cache = config.section("cache");
// Given diff number to generate cursors
settings.numCacheDiffs = cache.valueOr<size_t>("num_diffs", settings.numCacheDiffs);
// Given cursors number fetching from diff
settings.numCacheCursorsFromDiff = cache.valueOr<size_t>("num_cursors_from_diff", 0);
// Given cursors number fetching from account
settings.numCacheCursorsFromAccount = cache.valueOr<size_t>("num_cursors_from_account", 0);
settings.numThreads = config.getValue("io_threads").asIntType<uint16_t>();
auto const cache = config.getObject("cache");
// Given diff number to generate cursors
settings.numCacheDiffs = cache.getValue("num_diffs").asIntType<std::size_t>();
// Given cursors number fetching from diff
settings.numCacheCursorsFromDiff = cache.getValue("num_cursors_from_diff").asIntType<std::size_t>();
// Given cursors number fetching from account
settings.numCacheCursorsFromAccount = cache.getValue("num_cursors_from_account").asIntType<std::size_t>();

settings.numCacheMarkers = cache.valueOr<size_t>("num_markers", settings.numCacheMarkers);
settings.cachePageFetchSize = cache.valueOr<size_t>("page_fetch_size", settings.cachePageFetchSize);
settings.numCacheMarkers = cache.getValue("num_markers").asIntType<std::size_t>();
settings.cachePageFetchSize = cache.getValue("page_fetch_size").asIntType<std::size_t>();

auto const entry = cache.getValue("load").asString();
if (boost::iequals(entry, "sync"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::SYNC;
if (boost::iequals(entry, "async"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::ASYNC;
if (boost::iequals(entry, "none") or boost::iequals(entry, "no"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::NONE;

if (auto entry = cache.maybeValue<std::string>("load"); entry) {
if (boost::iequals(*entry, "sync"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::SYNC;
if (boost::iequals(*entry, "async"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::ASYNC;
if (boost::iequals(*entry, "none") or boost::iequals(*entry, "no"))
settings.loadStyle = CacheLoaderSettings::LoadStyle::NONE;
}
}
return settings;
}

Expand Down
Loading
Loading