Optimize memory usage changing types of driver_name and driver_version be a reference to a cached value instead of an sstring. These fields very often have the same value among different connections hence it makes sense to cache these values and use references to them instead of duplicating such strings in each connection state. Signed-off-by: Vlad Zolotarov <vladz@scylladb.com>
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
/*
|
|
* Copyright (C) 2019-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
|
|
*/
|
|
#pragma once
|
|
|
|
#include <seastar/net/inet_address.hh>
|
|
#include <seastar/core/sstring.hh>
|
|
#include "seastarx.hh"
|
|
#include "utils/loading_shared_values.hh"
|
|
|
|
#include <list>
|
|
#include <optional>
|
|
|
|
enum class client_type {
|
|
cql = 0,
|
|
thrift,
|
|
alternator,
|
|
};
|
|
|
|
sstring to_string(client_type ct);
|
|
|
|
enum class client_connection_stage {
|
|
established = 0,
|
|
authenticating,
|
|
ready,
|
|
};
|
|
|
|
// We implement a keys cache using a map-like utils::loading_shared_values container by storing empty values.
|
|
struct options_cache_value_type {};
|
|
using client_options_cache_type = utils::loading_shared_values<sstring, options_cache_value_type>;
|
|
using client_options_cache_entry_type = client_options_cache_type::entry_ptr;
|
|
using client_options_cache_key_type = client_options_cache_type::key_type;
|
|
|
|
// This struct represents a single OPTION key-value pair from the client's connection options.
|
|
// Both key and value are represented by corresponding "references" to their cached values.
|
|
// Each "reference" is effectively a lw_shared_ptr value.
|
|
struct client_option_key_value_cached_entry {
|
|
client_options_cache_entry_type key;
|
|
client_options_cache_entry_type value;
|
|
};
|
|
|
|
sstring to_string(client_connection_stage ct);
|
|
|
|
// Representation of a row in `system.clients'. std::optionals are for nullable cells.
|
|
struct client_data {
|
|
net::inet_address ip;
|
|
int32_t port;
|
|
client_type ct = client_type::cql;
|
|
client_connection_stage connection_stage = client_connection_stage::established;
|
|
int32_t shard_id; /// ID of server-side shard which is processing the connection.
|
|
|
|
std::optional<client_options_cache_entry_type> driver_name;
|
|
std::optional<client_options_cache_entry_type> driver_version;
|
|
std::optional<sstring> hostname;
|
|
std::optional<int32_t> protocol_version;
|
|
std::optional<sstring> ssl_cipher_suite;
|
|
std::optional<bool> ssl_enabled;
|
|
std::optional<sstring> ssl_protocol;
|
|
std::optional<sstring> username;
|
|
std::optional<sstring> scheduling_group_name;
|
|
std::list<client_option_key_value_cached_entry> client_options;
|
|
|
|
sstring stage_str() const { return to_string(connection_stage); }
|
|
sstring client_type_str() const { return to_string(ct); }
|
|
};
|