Support mapping NBD by the image name
parent
57e2c503f7
commit
82e6aff17b
|
@ -26,7 +26,10 @@ const char *exe_name = NULL;
|
||||||
class nbd_proxy
|
class nbd_proxy
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
std::string image_name;
|
||||||
uint64_t inode = 0;
|
uint64_t inode = 0;
|
||||||
|
uint64_t device_size = 0;
|
||||||
|
inode_watch_t *watch = NULL;
|
||||||
|
|
||||||
ring_loop_t *ringloop = NULL;
|
ring_loop_t *ringloop = NULL;
|
||||||
epoll_manager_t *epmgr = NULL;
|
epoll_manager_t *epmgr = NULL;
|
||||||
|
@ -111,9 +114,9 @@ public:
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"Vitastor NBD proxy\n"
|
"Vitastor NBD proxy\n"
|
||||||
"(c) Vitaliy Filippov, 2020 (VNPL-1.1)\n\n"
|
"(c) Vitaliy Filippov, 2020-2021 (VNPL-1.1)\n\n"
|
||||||
"USAGE:\n"
|
"USAGE:\n"
|
||||||
" %s map --etcd_address <etcd_address> --pool <pool> --inode <inode> --size <size in bytes>\n"
|
" %s map --etcd_address <etcd_address> (--image <image> | --pool <pool> --inode <inode> --size <size in bytes>)\n"
|
||||||
" %s unmap /dev/nbd0\n"
|
" %s unmap /dev/nbd0\n"
|
||||||
" %s list [--json]\n",
|
" %s list [--json]\n",
|
||||||
exe_name, exe_name, exe_name
|
exe_name, exe_name, exe_name
|
||||||
|
@ -148,21 +151,49 @@ public:
|
||||||
fprintf(stderr, "etcd_address is missing\n");
|
fprintf(stderr, "etcd_address is missing\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (!cfg["size"].uint64_value())
|
if (cfg["image"].string_value() != "")
|
||||||
{
|
{
|
||||||
fprintf(stderr, "device size is missing\n");
|
// Use image name
|
||||||
exit(1);
|
image_name = cfg["image"].string_value();
|
||||||
|
inode = 0;
|
||||||
}
|
}
|
||||||
inode = cfg["inode"].uint64_value();
|
else
|
||||||
uint64_t pool = cfg["pool"].uint64_value();
|
|
||||||
if (pool)
|
|
||||||
{
|
{
|
||||||
inode = (inode & ((1l << (64-POOL_ID_BITS)) - 1)) | (pool << (64-POOL_ID_BITS));
|
// Use pool, inode number and size
|
||||||
|
if (!cfg["size"].uint64_value())
|
||||||
|
{
|
||||||
|
fprintf(stderr, "device size is missing\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
device_size = cfg["size"].uint64_value();
|
||||||
|
inode = cfg["inode"].uint64_value();
|
||||||
|
uint64_t pool = cfg["pool"].uint64_value();
|
||||||
|
if (pool)
|
||||||
|
{
|
||||||
|
inode = (inode & ((1l << (64-POOL_ID_BITS)) - 1)) | (pool << (64-POOL_ID_BITS));
|
||||||
|
}
|
||||||
|
if (!(inode >> (64-POOL_ID_BITS)))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "pool is missing\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!(inode >> (64-POOL_ID_BITS)))
|
// Create client
|
||||||
|
ringloop = new ring_loop_t(512);
|
||||||
|
epmgr = new epoll_manager_t(ringloop);
|
||||||
|
cli = new cluster_client_t(ringloop, epmgr->tfd, cfg);
|
||||||
|
if (!inode)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "pool is missing\n");
|
// Load image metadata
|
||||||
exit(1);
|
while (!cli->is_ready())
|
||||||
|
{
|
||||||
|
ringloop->loop();
|
||||||
|
if (cli->is_ready())
|
||||||
|
break;
|
||||||
|
ringloop->wait();
|
||||||
|
}
|
||||||
|
watch = cli->st_cli.watch_inode(image_name);
|
||||||
|
device_size = watch->cfg.size;
|
||||||
}
|
}
|
||||||
// Initialize NBD
|
// Initialize NBD
|
||||||
int sockfd[2];
|
int sockfd[2];
|
||||||
|
@ -176,7 +207,7 @@ public:
|
||||||
load_module();
|
load_module();
|
||||||
if (!cfg["dev_num"].is_null())
|
if (!cfg["dev_num"].is_null())
|
||||||
{
|
{
|
||||||
if (run_nbd(sockfd, cfg["dev_num"].int64_value(), cfg["size"].uint64_value(), NBD_FLAG_SEND_FLUSH, 30) < 0)
|
if (run_nbd(sockfd, cfg["dev_num"].int64_value(), device_size, NBD_FLAG_SEND_FLUSH, 30) < 0)
|
||||||
{
|
{
|
||||||
perror("run_nbd");
|
perror("run_nbd");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -188,7 +219,7 @@ public:
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
int r = run_nbd(sockfd, i, cfg["size"].uint64_value(), NBD_FLAG_SEND_FLUSH, 30);
|
int r = run_nbd(sockfd, i, device_size, NBD_FLAG_SEND_FLUSH, 30);
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
{
|
{
|
||||||
printf("/dev/nbd%d\n", i);
|
printf("/dev/nbd%d\n", i);
|
||||||
|
@ -215,10 +246,6 @@ public:
|
||||||
{
|
{
|
||||||
daemonize();
|
daemonize();
|
||||||
}
|
}
|
||||||
// Create client
|
|
||||||
ringloop = new ring_loop_t(512);
|
|
||||||
epmgr = new epoll_manager_t(ringloop);
|
|
||||||
cli = new cluster_client_t(ringloop, epmgr->tfd, cfg);
|
|
||||||
// Initialize read state
|
// Initialize read state
|
||||||
read_state = CL_READ_HDR;
|
read_state = CL_READ_HDR;
|
||||||
recv_buf = malloc_or_die(receive_buffer_size);
|
recv_buf = malloc_or_die(receive_buffer_size);
|
||||||
|
@ -242,6 +269,7 @@ public:
|
||||||
ringloop->loop();
|
ringloop->loop();
|
||||||
ringloop->wait();
|
ringloop->wait();
|
||||||
}
|
}
|
||||||
|
// FIXME: Cleanup when exiting
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_module()
|
void load_module()
|
||||||
|
@ -610,7 +638,7 @@ protected:
|
||||||
if (req_type == NBD_CMD_READ || req_type == NBD_CMD_WRITE)
|
if (req_type == NBD_CMD_READ || req_type == NBD_CMD_WRITE)
|
||||||
{
|
{
|
||||||
op->opcode = req_type == NBD_CMD_READ ? OSD_OP_READ : OSD_OP_WRITE;
|
op->opcode = req_type == NBD_CMD_READ ? OSD_OP_READ : OSD_OP_WRITE;
|
||||||
op->inode = inode;
|
op->inode = inode ? inode : watch->cfg.num;
|
||||||
op->offset = be64toh(cur_req.from);
|
op->offset = be64toh(cur_req.from);
|
||||||
op->len = be32toh(cur_req.len);
|
op->len = be32toh(cur_req.len);
|
||||||
buf = malloc_or_die(sizeof(nbd_reply) + op->len);
|
buf = malloc_or_die(sizeof(nbd_reply) + op->len);
|
||||||
|
@ -657,7 +685,15 @@ protected:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cli->execute(cur_op);
|
if (cur_op->opcode == OSD_OP_WRITE && watch->cfg.readonly)
|
||||||
|
{
|
||||||
|
cur_op->retval = -EROFS;
|
||||||
|
std::function<void(cluster_op_t*)>(cur_op->callback)(cur_op);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cli->execute(cur_op);
|
||||||
|
}
|
||||||
cur_op = NULL;
|
cur_op = NULL;
|
||||||
cur_buf = &cur_req;
|
cur_buf = &cur_req;
|
||||||
cur_left = sizeof(nbd_request);
|
cur_left = sizeof(nbd_request);
|
||||||
|
|
Loading…
Reference in New Issue