Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
Cluster.hpp
1#pragma once
2
3#include "data/cassandra/impl/ManagedObject.hpp"
4#include "util/Assert.hpp"
5#include "util/log/Logger.hpp"
6
7#include <cassandra.h>
8
9#include <chrono>
10#include <cstddef>
11#include <cstdint>
12#include <optional>
13#include <string>
14#include <string_view>
15#include <thread>
16#include <variant>
17
18namespace data::cassandra::impl {
19
20enum class Provider { Cassandra, Keyspace };
21
22inline Provider
23providerFromString(std::string const& provider)
24{
25 ASSERT(
26 provider == "cassandra" || provider == "aws_keyspace",
27 "Provider type must be one of 'cassandra' or 'aws_keyspace'"
28 );
29 return provider == "cassandra" ? Provider::Cassandra : Provider::Keyspace;
30}
31
32// TODO: move Settings to public interface, not impl
33
37struct Settings {
38 static constexpr std::size_t kDEFAULT_CONNECTION_TIMEOUT = 10000;
39 static constexpr uint32_t kDEFAULT_MAX_WRITE_REQUESTS_OUTSTANDING = 10'000;
40 static constexpr uint32_t kDEFAULT_MAX_READ_REQUESTS_OUTSTANDING = 100'000;
41 static constexpr std::size_t kDEFAULT_BATCH_SIZE = 20;
42 static constexpr Provider kDEFAULT_PROVIDER = Provider::Cassandra;
43
48 std::string contactPoints = "127.0.0.1"; // defaults to localhost
49 std::optional<uint16_t> port;
50 };
51
56 std::string bundle; // no meaningful default
57 };
58
60 bool enableLog = false;
61
63 std::chrono::milliseconds connectionTimeout =
64 std::chrono::milliseconds{kDEFAULT_CONNECTION_TIMEOUT};
65
67 std::chrono::milliseconds requestTimeout = std::chrono::milliseconds{0}; // no timeout at all
68
70 std::variant<ContactPoints, SecureConnectionBundle> connectionInfo = ContactPoints{};
71
73 uint32_t threads = std::thread::hardware_concurrency();
74
76 uint32_t maxWriteRequestsOutstanding = kDEFAULT_MAX_WRITE_REQUESTS_OUTSTANDING;
77
79 uint32_t maxReadRequestsOutstanding = kDEFAULT_MAX_READ_REQUESTS_OUTSTANDING;
80
83
85 std::size_t writeBatchSize = kDEFAULT_BATCH_SIZE;
86
88 Provider provider = kDEFAULT_PROVIDER;
89
91 std::optional<uint32_t> queueSizeIO =
92 std::nullopt; // NOLINT(readability-redundant-member-init)
93
95 std::optional<std::string> certificate =
96 std::nullopt; // NOLINT(readability-redundant-member-init)
97
99 std::optional<std::string> username =
100 std::nullopt; // NOLINT(readability-redundant-member-init)
101
103 std::optional<std::string> password =
104 std::nullopt; // NOLINT(readability-redundant-member-init)
105
111 withContactPoints(std::string_view contactPoints)
112 {
113 auto tmp = *this;
114 tmp.connectionInfo =
115 ContactPoints{.contactPoints = std::string{contactPoints}, .port = std::nullopt};
116 return tmp;
117 }
118
122 static Settings
124 {
125 return Settings();
126 }
127};
128
129class Cluster : public ManagedObject<CassCluster> {
130 util::Logger log_{"Backend"};
131
132public:
133 Cluster(Settings const& settings);
134
135private:
136 void
137 setupConnection(Settings const& settings);
138
139 void
140 setupContactPoints(Settings::ContactPoints const& points);
141
142 void
143 setupSecureBundle(Settings::SecureConnectionBundle const& bundle);
144
145 void
146 setupCertificate(Settings const& settings);
147
148 void
149 setupCredentials(Settings const& settings);
150};
151
152} // namespace data::cassandra::impl
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:77
Represents the configuration of contact points for cassandra.
Definition Cluster.hpp:47
Represents the configuration of a secure connection bundle.
Definition Cluster.hpp:55
Bundles all cassandra settings in one place.
Definition Cluster.hpp:37
std::chrono::milliseconds requestTimeout
Request timeout specified in milliseconds.
Definition Cluster.hpp:67
std::chrono::milliseconds connectionTimeout
Connect timeout specified in milliseconds.
Definition Cluster.hpp:63
Provider provider
Provider to know if we are using scylladb or keyspace.
Definition Cluster.hpp:88
std::optional< std::string > password
Password to match the username.
Definition Cluster.hpp:103
std::optional< std::string > username
Username/login.
Definition Cluster.hpp:99
uint32_t threads
The number of threads for the driver to pool.
Definition Cluster.hpp:73
uint32_t maxReadRequestsOutstanding
The maximum number of outstanding read requests at any given moment.
Definition Cluster.hpp:79
uint32_t maxWriteRequestsOutstanding
The maximum number of outstanding write requests at any given moment.
Definition Cluster.hpp:76
std::optional< std::string > certificate
SSL certificate.
Definition Cluster.hpp:95
uint32_t coreConnectionsPerHost
The number of connection per host to always have active.
Definition Cluster.hpp:82
std::variant< ContactPoints, SecureConnectionBundle > connectionInfo
Connection information; either ContactPoints or SecureConnectionBundle.
Definition Cluster.hpp:70
bool enableLog
Enables or disables cassandra driver logger.
Definition Cluster.hpp:60
std::size_t writeBatchSize
Size of batches when writing.
Definition Cluster.hpp:85
std::optional< uint32_t > queueSizeIO
Size of the IO queue.
Definition Cluster.hpp:91
static Settings defaultSettings()
Returns the default settings.
Definition Cluster.hpp:123
Settings withContactPoints(std::string_view contactPoints)
Creates a new Settings object as a copy of the current one with overridden contact points.
Definition Cluster.hpp:111