Extract peer connect and read-write loop into a separate file (to be shared with the client library)
This commit is contained in:
@@ -16,26 +16,11 @@
|
||||
#include "blockstore.h"
|
||||
#include "ringloop.h"
|
||||
#include "timerfd_manager.h"
|
||||
#include "osd_ops.h"
|
||||
#include "osd_peering_pg.h"
|
||||
#include "cluster_client.h"
|
||||
#include "etcd_state_client.h"
|
||||
|
||||
#define OSD_OP_IN 0
|
||||
#define OSD_OP_OUT 1
|
||||
|
||||
#define CL_READ_HDR 1
|
||||
#define CL_READ_DATA 2
|
||||
#define CL_READ_REPLY_DATA 3
|
||||
#define CL_WRITE_READY 1
|
||||
#define CL_WRITE_REPLY 2
|
||||
#define MAX_EPOLL_EVENTS 64
|
||||
#define OSD_OP_INLINE_BUF_COUNT 16
|
||||
|
||||
#define PEER_CONNECTING 1
|
||||
#define PEER_CONNECTED 2
|
||||
|
||||
#define OSD_LOADING_PGS 0x01
|
||||
#define OSD_CONNECTING_PEERS 0x02
|
||||
#define OSD_PEERING_PGS 0x04
|
||||
#define OSD_FLUSHING_PGS 0x08
|
||||
#define OSD_RECOVERING 0x10
|
||||
@@ -54,114 +39,6 @@
|
||||
|
||||
extern const char* osd_op_names[];
|
||||
|
||||
struct osd_op_buf_list_t
|
||||
{
|
||||
int count = 0, alloc = 0, sent = 0;
|
||||
iovec *buf = NULL;
|
||||
iovec inline_buf[OSD_OP_INLINE_BUF_COUNT];
|
||||
|
||||
~osd_op_buf_list_t()
|
||||
{
|
||||
if (buf && buf != inline_buf)
|
||||
{
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
inline iovec* get_iovec()
|
||||
{
|
||||
return (buf ? buf : inline_buf) + sent;
|
||||
}
|
||||
|
||||
inline int get_size()
|
||||
{
|
||||
return count - sent;
|
||||
}
|
||||
|
||||
inline void push_back(void *nbuf, size_t len)
|
||||
{
|
||||
if (count >= alloc)
|
||||
{
|
||||
if (!alloc)
|
||||
{
|
||||
alloc = OSD_OP_INLINE_BUF_COUNT;
|
||||
buf = inline_buf;
|
||||
}
|
||||
else if (buf == inline_buf)
|
||||
{
|
||||
int old = alloc;
|
||||
alloc = ((alloc/16)*16 + 1);
|
||||
buf = (iovec*)malloc(sizeof(iovec) * alloc);
|
||||
memcpy(buf, inline_buf, sizeof(iovec)*old);
|
||||
}
|
||||
else
|
||||
{
|
||||
alloc = ((alloc/16)*16 + 1);
|
||||
buf = (iovec*)realloc(buf, sizeof(iovec) * alloc);
|
||||
}
|
||||
}
|
||||
buf[count++] = { .iov_base = nbuf, .iov_len = len };
|
||||
}
|
||||
};
|
||||
|
||||
struct osd_primary_op_data_t;
|
||||
|
||||
struct osd_op_t
|
||||
{
|
||||
timespec tv_begin;
|
||||
uint64_t op_type = OSD_OP_IN;
|
||||
int peer_fd;
|
||||
osd_any_op_t req;
|
||||
osd_any_reply_t reply;
|
||||
blockstore_op_t *bs_op = NULL;
|
||||
void *buf = NULL;
|
||||
void *rmw_buf = NULL;
|
||||
osd_primary_op_data_t* op_data = NULL;
|
||||
std::function<void(osd_op_t*)> callback;
|
||||
|
||||
osd_op_buf_list_t send_list;
|
||||
|
||||
~osd_op_t();
|
||||
};
|
||||
|
||||
struct osd_client_t
|
||||
{
|
||||
sockaddr_in peer_addr;
|
||||
int peer_port;
|
||||
int peer_fd;
|
||||
int peer_state;
|
||||
int connect_timeout_id = -1;
|
||||
osd_num_t osd_num = 0;
|
||||
|
||||
void *in_buf = NULL;
|
||||
|
||||
// Read state
|
||||
int read_ready = 0;
|
||||
osd_op_t *read_op = NULL;
|
||||
int read_reply_id = 0;
|
||||
iovec read_iov;
|
||||
msghdr read_msg;
|
||||
void *read_buf = NULL;
|
||||
int read_remaining = 0;
|
||||
int read_state = 0;
|
||||
|
||||
// Outbound operations sent to this client (which is probably an OSD peer)
|
||||
std::map<int, osd_op_t*> sent_ops;
|
||||
|
||||
// Outbound messages (replies or requests)
|
||||
std::deque<osd_op_t*> outbox;
|
||||
|
||||
// PGs dirtied by this client's primary-writes (FIXME to drop the connection)
|
||||
std::set<pg_num_t> dirty_pgs;
|
||||
|
||||
// Write state
|
||||
osd_op_t *write_op = NULL;
|
||||
msghdr write_msg;
|
||||
int write_state = 0;
|
||||
};
|
||||
|
||||
struct osd_rmw_stripe_t;
|
||||
|
||||
struct osd_object_id_t
|
||||
{
|
||||
osd_num_t osd_num;
|
||||
@@ -177,13 +54,6 @@ struct osd_recovery_op_t
|
||||
osd_op_t *osd_op = NULL;
|
||||
};
|
||||
|
||||
struct osd_wanted_peer_t
|
||||
{
|
||||
bool connecting;
|
||||
time_t last_connect_attempt, last_load_attempt;
|
||||
int address_index;
|
||||
};
|
||||
|
||||
class osd_t
|
||||
{
|
||||
// config
|
||||
@@ -199,22 +69,19 @@ class osd_t
|
||||
// FIXME: Implement client queue depth limit
|
||||
int client_queue_depth = 128;
|
||||
bool allow_test_ops = true;
|
||||
int receive_buffer_size = 9000;
|
||||
int print_stats_interval = 3;
|
||||
int immediate_commit = IMMEDIATE_NONE;
|
||||
int autosync_interval = DEFAULT_AUTOSYNC_INTERVAL; // sync every 5 seconds
|
||||
int recovery_queue_depth = DEFAULT_RECOVERY_QUEUE;
|
||||
int peer_connect_interval = 5;
|
||||
int peer_connect_timeout = 5;
|
||||
int log_level = 0;
|
||||
|
||||
// cluster state
|
||||
|
||||
etcd_state_client_t st_cli;
|
||||
cluster_client_t c_cli;
|
||||
int etcd_failed_attempts = 0;
|
||||
std::string etcd_lease_id;
|
||||
json11::Json self_state;
|
||||
std::map<osd_num_t, osd_wanted_peer_t> wanted_peers;
|
||||
bool loading_peer_config = false;
|
||||
std::set<pg_num_t> pg_state_dirty;
|
||||
bool pg_config_applied = false;
|
||||
@@ -223,13 +90,11 @@ class osd_t
|
||||
|
||||
// peers and PGs
|
||||
|
||||
std::map<uint64_t, int> osd_peer_fds;
|
||||
std::map<pg_num_t, pg_t> pgs;
|
||||
std::set<pg_num_t> dirty_pgs;
|
||||
uint64_t misplaced_objects = 0, degraded_objects = 0, incomplete_objects = 0;
|
||||
int peering_state = 0;
|
||||
unsigned pg_count = 0;
|
||||
uint64_t next_subop_id = 1;
|
||||
std::map<object_id, osd_recovery_op_t> recovery_ops;
|
||||
osd_op_t *autosync_op = NULL;
|
||||
|
||||
@@ -254,16 +119,8 @@ class osd_t
|
||||
ring_consumer_t consumer;
|
||||
std::map<int, std::function<void(int, int)>> epoll_handlers;
|
||||
|
||||
std::unordered_map<int,osd_client_t> clients;
|
||||
std::vector<int> read_ready_clients;
|
||||
std::vector<int> write_ready_clients;
|
||||
|
||||
// op statistics
|
||||
uint64_t op_stat_sum[2][OSD_OP_MAX+1] = { 0 };
|
||||
uint64_t op_stat_count[2][OSD_OP_MAX+1] = { 0 };
|
||||
uint64_t op_stat_bytes[2][OSD_OP_MAX+1] = { 0 };
|
||||
uint64_t subop_stat_sum[2][OSD_OP_MAX+1] = { 0 };
|
||||
uint64_t subop_stat_count[2][OSD_OP_MAX+1] = { 0 };
|
||||
osd_op_stats_t prev_stats;
|
||||
const char* recovery_stat_names[2] = { "degraded", "misplaced" };
|
||||
uint64_t recovery_stat_count[2][2] = { 0 };
|
||||
uint64_t recovery_stat_bytes[2][2] = { 0 };
|
||||
@@ -271,6 +128,7 @@ class osd_t
|
||||
// cluster connection
|
||||
void parse_config(blockstore_config_t & config);
|
||||
void init_cluster();
|
||||
void on_change_osd_state_hook(uint64_t osd_num);
|
||||
void on_change_etcd_state_hook(json11::Json::object & changes);
|
||||
void on_load_config_hook(json11::Json::object & changes);
|
||||
json11::Json on_load_pgs_checks_hook();
|
||||
@@ -288,30 +146,13 @@ class osd_t
|
||||
void report_pg_states();
|
||||
void apply_pg_count();
|
||||
void apply_pg_config();
|
||||
void on_connect_peer(osd_num_t peer_osd, int peer_fd);
|
||||
void load_and_connect_peers();
|
||||
|
||||
// event loop, socket read/write
|
||||
void loop();
|
||||
void set_fd_handler(int fd, std::function<void(int, int)> handler);
|
||||
void handle_epoll_events();
|
||||
void read_requests();
|
||||
void handle_read(ring_data_t *data, int peer_fd);
|
||||
void handle_finished_read(osd_client_t & cl);
|
||||
void handle_op_hdr(osd_client_t *cl);
|
||||
void handle_reply_hdr(osd_client_t *cl);
|
||||
bool try_send(osd_client_t & cl);
|
||||
void send_replies();
|
||||
void handle_send(ring_data_t *data, int peer_fd);
|
||||
void outbox_push(osd_client_t & cl, osd_op_t *op);
|
||||
|
||||
// peer handling (primary OSD logic)
|
||||
void connect_peer(osd_num_t osd_num, const char *peer_host, int peer_port);
|
||||
void handle_connect_result(int peer_fd);
|
||||
void check_peer_config(osd_client_t & cl);
|
||||
void cancel_osd_ops(osd_client_t & cl);
|
||||
void cancel_op(osd_op_t *op);
|
||||
void stop_client(int peer_fd);
|
||||
void parse_test_peer(std::string peer);
|
||||
void handle_peers();
|
||||
void repeer_pgs(osd_num_t osd_num);
|
||||
|
||||
Reference in New Issue
Block a user