Implement NFS RDMA support

This commit is contained in:
Vitaliy Filippov
2024-12-11 21:09:36 +03:00
parent 64db31ec10
commit 1dbbb0c3f8
21 changed files with 2247 additions and 107 deletions
+34 -5
View File
@@ -22,6 +22,7 @@ class cli_tool_t;
struct kv_fs_state_t;
struct block_fs_state_t;
class nfs_client_t;
struct nfs_rdma_context_t;
class nfs_proxy_t
{
@@ -33,7 +34,12 @@ public:
std::string default_pool;
std::string export_root;
bool portmap_enabled;
unsigned nfs_port;
unsigned nfs_port = 0;
unsigned nfs_rdma_port = 0;
uint32_t nfs_rdma_credit = 16;
uint32_t nfs_rdma_max_send = 1024;
uint64_t nfs_rdma_alloc = 1048576;
uint64_t nfs_rdma_gc = 500*1048576;
int trace = 0;
std::string logfile = "/dev/null";
std::string pidfile;
@@ -55,7 +61,8 @@ public:
vitastorkv_dbw_t *db = NULL;
kv_fs_state_t *kvfs = NULL;
block_fs_state_t *blockfs = NULL;
std::map<int, nfs_client_t*> rpc_clients;
nfs_rdma_context_t* rdma_context = NULL;
std::set<nfs_client_t*> rpc_clients;
std::vector<XDR*> xdr_pool;
@@ -72,12 +79,20 @@ public:
void watch_stats();
void parse_stats(etcd_kv_t & kv);
void check_default_pool();
nfs_client_t* create_client();
void do_accept(int listen_fd);
void daemonize();
void write_pid();
void mount_fs();
void check_already_mounted();
void check_exit();
nfs_rdma_context_t* create_rdma(const std::string & bind_address, int rdmacm_port,
uint32_t max_iodepth, uint32_t max_send_wr, uint64_t rdma_malloc_round_to, uint64_t rdma_max_unused_buffers);
void destroy_rdma();
XDR *get_xdr();
void free_xdr(XDR *xdrs);
};
struct rpc_cur_buffer_t
@@ -101,19 +116,24 @@ struct rpc_free_buffer_t
unsigned size;
};
struct nfs_rdma_conn_t;
class nfs_client_t
{
public:
nfs_proxy_t *parent = NULL;
int nfs_fd;
int epoll_events = 0;
int refs = 0;
bool stopped = false;
std::set<rpc_service_proc_t> proc_table;
nfs_rdma_conn_t *rdma_conn = NULL;
// <TCP>
int nfs_fd = -1;
int epoll_events = 0;
// Read state
rpc_cur_buffer_t cur_buffer = { 0 };
std::map<uint8_t*, rpc_used_buffer_t> used_buffers;
std::map<void*, rpc_used_buffer_t> used_buffers;
std::vector<rpc_free_buffer_t> free_buffers;
iovec read_iov;
@@ -130,7 +150,16 @@ public:
void submit_send();
void handle_send(int result);
int handle_rpc_message(void *base_buf, void *msg_buf, uint32_t msg_len);
// </TCP>
rpc_op_t *create_rpc_op(XDR *xdrs, void *buffer, rpc_msg *inmsg, rdma_msg *rmsg);
int handle_rpc_op(rpc_op_t *rop);
bool deref();
void stop();
void *malloc_or_rdma(rpc_op_t *rop, size_t size);
void free_or_rdma(rpc_op_t *rop, void *buf);
void *rdma_malloc(size_t size);
void rdma_free(void *buf);
void rdma_queue_reply(rpc_op_t *rop);
void destroy_rdma_conn();
};