diff --git a/src/nbd_proxy.cpp b/src/nbd_proxy.cpp index b8102a50..eba70b62 100644 --- a/src/nbd_proxy.cpp +++ b/src/nbd_proxy.cpp @@ -30,6 +30,9 @@ protected: std::string image_name; uint64_t inode = 0; uint64_t device_size = 0; + int nbd_timeout = 30; + int nbd_max_devices = 64; + int nbd_max_part = 3; inode_watch_t *watch = NULL; ring_loop_t *ringloop = NULL; @@ -117,9 +120,18 @@ public: "Vitastor NBD proxy\n" "(c) Vitaliy Filippov, 2020-2021 (VNPL-1.1)\n\n" "USAGE:\n" - " %s map [--etcd_address ] (--image | --pool --inode --size )\n" + " %s map [OPTIONS] (--image | --pool --inode --size )\n" " %s unmap /dev/nbd0\n" - " %s ls [--json]\n", + " %s ls [--json]\n" + "OPTIONS:\n" + " All usual Vitastor config options like --etcd_address plus NBD-specific:\n" + " --nbd_timeout 30\n" + " timeout in seconds after which the kernel will stop the device\n" + " you can set it to 0, but beware that you won't be able to stop the device at all\n" + " if vitastor-nbd process dies\n" + " --nbd_max_devices 64 --nbd_max_part 3\n" + " options for the \"nbd\" kernel module when modprobing it (nbds_max and max_part).\n" + " note that maximum allowed (nbds_max)*(1+max_part) is 256.\n", exe_name, exe_name, exe_name ); exit(0); @@ -174,6 +186,18 @@ public: exit(1); } } + if (cfg["nbd_max_devices"].is_number() || cfg["nbd_max_devices"].is_string()) + { + nbd_max_devices = cfg["nbd_max_devices"].uint64_value(); + } + if (cfg["nbd_max_part"].is_number() || cfg["nbd_max_part"].is_string()) + { + nbd_max_part = cfg["nbd_max_part"].uint64_value(); + } + if (cfg["nbd_timeout"].is_number() || cfg["nbd_timeout"].is_string()) + { + nbd_timeout = cfg["nbd_timeout"].uint64_value(); + } // Create client ringloop = new ring_loop_t(512); epmgr = new epoll_manager_t(ringloop); @@ -210,7 +234,7 @@ public: bool bg = cfg["foreground"].is_null(); if (!cfg["dev_num"].is_null()) { - if (run_nbd(sockfd, cfg["dev_num"].int64_value(), device_size, NBD_FLAG_SEND_FLUSH, 30, bg) < 0) + if (run_nbd(sockfd, cfg["dev_num"].int64_value(), device_size, NBD_FLAG_SEND_FLUSH, nbd_timeout, bg) < 0) { perror("run_nbd"); exit(1); @@ -307,7 +331,10 @@ public: return; } int r; - if ((r = system("modprobe nbd")) != 0) + // Kernel built-in default is 16 devices with up to 16 partitions per device which is a big shit + // 64 also isn't too high, but the possible maximum is nbds_max=256 max_part=0 and it won't reserve + // any block device minor numbers for partitions + if ((r = system(("modprobe nbd nbds_max="+std::to_string(nbd_max_devices)+" max_part="+std::to_string(nbd_max_part)).c_str())) != 0) { if (r < 0) perror("Failed to load NBD kernel module");