2020-09-17 23:02:40 +03:00
|
|
|
// Copyright (c) Vitaliy Filippov, 2019+
|
2021-02-06 01:26:07 +03:00
|
|
|
// License: VNPL-1.1 or GNU GPL-2.0+ (see README.md for details)
|
2020-09-17 23:02:40 +03:00
|
|
|
|
2020-05-21 21:00:54 +03:00
|
|
|
#pragma once
|
|
|
|
|
2021-03-31 01:03:15 +03:00
|
|
|
#include "json11/json11.hpp"
|
2020-06-06 01:39:58 +03:00
|
|
|
#include "osd_id.h"
|
2020-05-21 21:00:54 +03:00
|
|
|
#include "timerfd_manager.h"
|
|
|
|
|
|
|
|
#define ETCD_CONFIG_WATCH_ID 1
|
|
|
|
#define ETCD_PG_STATE_WATCH_ID 2
|
|
|
|
#define ETCD_PG_HISTORY_WATCH_ID 3
|
|
|
|
#define ETCD_OSD_STATE_WATCH_ID 4
|
|
|
|
|
2020-10-02 10:17:53 +03:00
|
|
|
#define DEFAULT_BLOCK_SIZE 128*1024
|
2022-08-09 02:27:02 +03:00
|
|
|
#define MIN_DATA_BLOCK_SIZE 4*1024
|
|
|
|
#define MAX_DATA_BLOCK_SIZE 128*1024*1024
|
|
|
|
#define DEFAULT_BITMAP_GRANULARITY 4096
|
|
|
|
|
|
|
|
#define IMMEDIATE_NONE 0
|
|
|
|
#define IMMEDIATE_SMALL 1
|
|
|
|
#define IMMEDIATE_ALL 2
|
2020-10-01 18:51:49 +03:00
|
|
|
|
2021-03-23 00:09:00 +03:00
|
|
|
struct etcd_kv_t
|
2020-09-02 21:54:32 +03:00
|
|
|
{
|
|
|
|
std::string key;
|
|
|
|
json11::Json value;
|
2021-03-23 00:09:00 +03:00
|
|
|
uint64_t mod_revision;
|
2020-09-02 21:54:32 +03:00
|
|
|
};
|
|
|
|
|
2020-05-21 21:00:54 +03:00
|
|
|
struct pg_config_t
|
|
|
|
{
|
|
|
|
bool exists;
|
|
|
|
osd_num_t primary;
|
|
|
|
std::vector<osd_num_t> target_set;
|
|
|
|
std::vector<std::vector<osd_num_t>> target_history;
|
|
|
|
std::vector<osd_num_t> all_peers;
|
|
|
|
bool pause;
|
|
|
|
osd_num_t cur_primary;
|
|
|
|
int cur_state;
|
2020-07-02 00:41:28 +03:00
|
|
|
uint64_t epoch;
|
2023-04-18 02:08:43 +03:00
|
|
|
uint64_t next_scrub;
|
2020-05-21 21:00:54 +03:00
|
|
|
};
|
|
|
|
|
2020-09-02 21:54:32 +03:00
|
|
|
struct pool_config_t
|
2020-05-21 21:00:54 +03:00
|
|
|
{
|
2020-09-02 21:54:32 +03:00
|
|
|
bool exists;
|
|
|
|
pool_id_t id;
|
|
|
|
std::string name;
|
|
|
|
uint64_t scheme;
|
2020-11-30 00:08:25 +03:00
|
|
|
uint64_t pg_size, pg_minsize, parity_chunks;
|
2022-08-09 02:27:02 +03:00
|
|
|
uint32_t data_block_size, bitmap_granularity, immediate_commit;
|
2020-09-02 21:54:32 +03:00
|
|
|
uint64_t pg_count;
|
2020-09-03 00:52:41 +03:00
|
|
|
uint64_t real_pg_count;
|
2020-09-02 21:54:32 +03:00
|
|
|
std::string failure_domain;
|
|
|
|
uint64_t max_osd_combinations;
|
2020-10-01 18:51:49 +03:00
|
|
|
uint64_t pg_stripe_size;
|
2020-09-02 21:54:32 +03:00
|
|
|
std::map<pg_num_t, pg_config_t> pg_config;
|
2023-02-21 00:21:23 +03:00
|
|
|
uint64_t scrub_interval;
|
2020-05-21 21:00:54 +03:00
|
|
|
};
|
|
|
|
|
2021-01-30 01:35:58 +03:00
|
|
|
struct inode_config_t
|
|
|
|
{
|
2021-02-10 01:21:57 +03:00
|
|
|
uint64_t num;
|
2021-01-30 01:35:58 +03:00
|
|
|
std::string name;
|
2021-02-10 01:21:57 +03:00
|
|
|
uint64_t size;
|
2021-01-30 01:35:58 +03:00
|
|
|
inode_t parent_id;
|
|
|
|
bool readonly;
|
2022-02-12 01:30:50 +03:00
|
|
|
// Arbitrary metadata
|
|
|
|
json11::Json meta;
|
2021-03-23 00:09:00 +03:00
|
|
|
// Change revision of the metadata in etcd
|
|
|
|
uint64_t mod_revision;
|
2021-01-30 01:35:58 +03:00
|
|
|
};
|
|
|
|
|
2021-02-10 01:21:57 +03:00
|
|
|
struct inode_watch_t
|
|
|
|
{
|
|
|
|
std::string name;
|
|
|
|
inode_config_t cfg;
|
|
|
|
};
|
|
|
|
|
2022-01-02 20:03:51 +03:00
|
|
|
struct http_co_t;
|
2021-03-31 01:03:15 +03:00
|
|
|
|
2020-05-21 21:00:54 +03:00
|
|
|
struct etcd_state_client_t
|
|
|
|
{
|
2021-03-13 23:45:16 +03:00
|
|
|
protected:
|
2021-11-27 00:36:53 +03:00
|
|
|
std::vector<std::string> local_ips;
|
2021-11-27 22:35:22 +03:00
|
|
|
std::vector<std::string> etcd_addresses;
|
2021-11-27 00:36:53 +03:00
|
|
|
std::vector<std::string> etcd_local;
|
2021-11-27 22:35:22 +03:00
|
|
|
std::string selected_etcd_address;
|
|
|
|
std::vector<std::string> addresses_to_try;
|
2021-02-10 01:21:57 +03:00
|
|
|
std::vector<inode_watch_t*> watches;
|
2022-01-02 20:03:51 +03:00
|
|
|
http_co_t *etcd_watch_ws = NULL, *keepalive_client = NULL;
|
2021-12-01 00:33:02 +03:00
|
|
|
int ws_keepalive_timer = -1;
|
|
|
|
int ws_alive = 0;
|
2022-01-20 00:45:49 +03:00
|
|
|
bool rand_initialized = false;
|
2021-03-13 23:45:16 +03:00
|
|
|
void add_etcd_url(std::string);
|
2021-11-27 22:35:22 +03:00
|
|
|
void pick_next_etcd();
|
2021-03-13 23:45:16 +03:00
|
|
|
public:
|
2022-01-23 00:00:00 +03:00
|
|
|
int etcd_keepalive_timeout = 30;
|
|
|
|
int etcd_ws_keepalive_interval = 30;
|
|
|
|
int max_etcd_attempts = 5;
|
|
|
|
int etcd_quick_timeout = 1000;
|
|
|
|
int etcd_slow_timeout = 5000;
|
2022-08-09 02:27:02 +03:00
|
|
|
uint64_t global_block_size = DEFAULT_BLOCK_SIZE;
|
|
|
|
uint32_t global_bitmap_granularity = DEFAULT_BITMAP_GRANULARITY;
|
|
|
|
uint32_t global_immediate_commit = IMMEDIATE_NONE;
|
2022-01-23 00:00:00 +03:00
|
|
|
|
2020-05-25 15:53:48 +03:00
|
|
|
std::string etcd_prefix;
|
2020-05-21 21:00:54 +03:00
|
|
|
int log_level = 0;
|
|
|
|
timerfd_manager_t *tfd = NULL;
|
|
|
|
|
|
|
|
int etcd_watches_initialised = 0;
|
|
|
|
uint64_t etcd_watch_revision = 0;
|
2020-09-02 21:54:32 +03:00
|
|
|
std::map<pool_id_t, pool_config_t> pool_config;
|
2020-05-21 21:00:54 +03:00
|
|
|
std::map<osd_num_t, json11::Json> peer_states;
|
2021-01-30 01:35:58 +03:00
|
|
|
std::map<inode_t, inode_config_t> inode_config;
|
2021-02-10 01:21:57 +03:00
|
|
|
std::map<std::string, inode_t> inode_by_name;
|
2020-05-21 21:00:54 +03:00
|
|
|
|
2021-03-23 00:09:00 +03:00
|
|
|
std::function<void(std::map<std::string, etcd_kv_t> &)> on_change_hook;
|
2020-05-21 21:00:54 +03:00
|
|
|
std::function<void(json11::Json::object &)> on_load_config_hook;
|
|
|
|
std::function<json11::Json()> load_pgs_checks_hook;
|
|
|
|
std::function<void(bool)> on_load_pgs_hook;
|
2020-09-02 21:54:32 +03:00
|
|
|
std::function<void(pool_id_t, pg_num_t)> on_change_pg_history_hook;
|
2020-07-02 00:41:28 +03:00
|
|
|
std::function<void(osd_num_t)> on_change_osd_state_hook;
|
2021-12-01 00:33:02 +03:00
|
|
|
std::function<void()> on_reload_hook;
|
2022-02-12 01:30:50 +03:00
|
|
|
std::function<void(inode_t, bool)> on_inode_change_hook;
|
|
|
|
std::function<void(http_co_t *)> on_start_watcher_hook;
|
2020-05-21 21:00:54 +03:00
|
|
|
|
2021-11-05 02:33:51 +03:00
|
|
|
json11::Json::object serialize_inode_cfg(inode_config_t *cfg);
|
2021-03-23 00:09:00 +03:00
|
|
|
etcd_kv_t parse_etcd_kv(const json11::Json & kv_json);
|
2022-04-08 02:42:53 +03:00
|
|
|
std::vector<std::string> get_addresses();
|
|
|
|
void etcd_call_oneshot(std::string etcd_address, std::string api, json11::Json payload, int timeout, std::function<void(std::string, json11::Json)> callback);
|
2022-01-23 16:25:47 +03:00
|
|
|
void etcd_call(std::string api, json11::Json payload, int timeout, int retries, int interval, std::function<void(std::string, json11::Json)> callback);
|
|
|
|
void etcd_txn(json11::Json txn, int timeout, int retries, int interval, std::function<void(std::string, json11::Json)> callback);
|
|
|
|
void etcd_txn_slow(json11::Json txn, std::function<void(std::string, json11::Json)> callback);
|
2020-05-21 21:00:54 +03:00
|
|
|
void start_etcd_watcher();
|
2023-03-26 17:50:35 +03:00
|
|
|
void stop_ws_keepalive();
|
|
|
|
void start_ws_keepalive();
|
2020-05-21 21:00:54 +03:00
|
|
|
void load_global_config();
|
|
|
|
void load_pgs();
|
2021-03-23 00:09:00 +03:00
|
|
|
void parse_state(const etcd_kv_t & kv);
|
2021-04-30 00:46:03 +03:00
|
|
|
void parse_config(const json11::Json & config);
|
2022-04-03 20:14:51 +03:00
|
|
|
void insert_inode_config(const inode_config_t & cfg);
|
2021-02-10 01:21:57 +03:00
|
|
|
inode_watch_t* watch_inode(std::string name);
|
|
|
|
void close_watch(inode_watch_t* watch);
|
2021-11-27 22:35:22 +03:00
|
|
|
int address_count();
|
2021-02-04 02:02:24 +03:00
|
|
|
~etcd_state_client_t();
|
2020-05-21 21:00:54 +03:00
|
|
|
};
|