Implement NFS RDMA support
This commit is contained in:
+34
-5
@@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user