From 68c3e96e46944111b274478d5d834535ddc4e973 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 5 Sep 2020 17:09:20 +0300 Subject: [PATCH] Add pool setting to fio and qemu drivers --- cluster_client.cpp | 6 ++++++ fio_cluster.cpp | 25 +++++++++++++++++++++---- qemu_driver.c | 16 ++++++++++++++-- qemu_proxy.h | 3 +++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/cluster_client.cpp b/cluster_client.cpp index a4c03bac..45bb8572 100644 --- a/cluster_client.cpp +++ b/cluster_client.cpp @@ -320,6 +320,12 @@ void cluster_client_t::execute(cluster_op_t *op) void cluster_client_t::continue_rw(cluster_op_t *op) { pool_id_t pool_id = INODE_POOL(op->inode); + if (!pool_id) + { + op->retval = -EINVAL; + std::function(op->callback)(op); + return; + } if (st_cli.pool_config.find(pool_id) == st_cli.pool_config.end() || st_cli.pool_config[pool_id].real_pg_count == 0) { diff --git a/fio_cluster.cpp b/fio_cluster.cpp index b63dc39a..d5ef1d61 100644 --- a/fio_cluster.cpp +++ b/fio_cluster.cpp @@ -3,17 +3,17 @@ // Random write: // // fio -thread -ioengine=./libfio_cluster.so -name=test -bs=4k -direct=1 -fsync=16 -iodepth=16 -rw=randwrite \ -// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -inode=1 -size=1000M +// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -pool=1 -inode=1 -size=1000M // // Linear write: // // fio -thread -ioengine=./libfio_cluster.so -name=test -bs=128k -direct=1 -fsync=32 -iodepth=32 -rw=write \ -// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -inode=1 -size=1000M +// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -pool=1 -inode=1 -size=1000M // // Random read (run with -iodepth=32 or -iodepth=1): // // fio -thread -ioengine=./libfio_cluster.so -name=test -bs=4k -direct=1 -iodepth=32 -rw=randread \ -// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -inode=1 -size=1000M +// -etcd=127.0.0.1:2379 [-etcd_prefix=/vitastor] -pool=1 -inode=1 -size=1000M #include #include @@ -49,7 +49,8 @@ struct sec_options int __pad; char *etcd_host = NULL; char *etcd_prefix = NULL; - int inode = 0; + uint64_t pool = 0; + uint64_t inode = 0; int trace = 0; }; @@ -72,6 +73,15 @@ static struct fio_option options[] = { .category = FIO_OPT_C_ENGINE, .group = FIO_OPT_G_FILENAME, }, + { + .name = "pool", + .lname = "pool number for the inode", + .type = FIO_OPT_INT, + .off1 = offsetof(struct sec_options, pool), + .help = "pool number for the inode to run tests on", + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_FILENAME, + }, { .name = "inode", .lname = "inode to run tests on", @@ -143,6 +153,13 @@ static int sec_init(struct thread_data *td) { "etcd_prefix", std::string(o->etcd_prefix ? o->etcd_prefix : "/vitastor") }, }; + if (o->pool) + o->inode = (o->inode & ((1l << (64-POOL_ID_BITS)) - 1)) | (o->pool << (64-POOL_ID_BITS)); + if (!(o->inode >> (64-POOL_ID_BITS))) + { + td_verror(td, EINVAL, "pool is missing"); + return 1; + } bsd->ringloop = new ring_loop_t(512); bsd->epmgr = new epoll_manager_t(bsd->ringloop); bsd->cli = new cluster_client_t(bsd->ringloop, bsd->epmgr->tfd, cfg); diff --git a/qemu_driver.c b/qemu_driver.c index c305c5db..8a2252ac 100644 --- a/qemu_driver.c +++ b/qemu_driver.c @@ -22,6 +22,7 @@ typedef struct VitastorClient char *etcd_host; char *etcd_prefix; uint64_t inode; + uint64_t pool; uint64_t size; int readonly; QemuMutex mutex; @@ -68,7 +69,7 @@ static void qemu_rbd_unescape(char *src) } // vitastor[:key=value]* -// vitastor:etcd_host=127.0.0.1:inode=1 +// vitastor:etcd_host=127.0.0.1:inode=1:pool=1 static void vitastor_parse_filename(const char *filename, QDict *options, Error **errp) { const char *start; @@ -96,7 +97,7 @@ static void vitastor_parse_filename(const char *filename, QDict *options, Error qemu_rbd_unescape(name); value = qemu_rbd_next_tok(p, ':', &p); qemu_rbd_unescape(value); - if (!strcmp(name, "inode") || !strcmp(name, "size")) + if (!strcmp(name, "inode") || !strcmp(name, "pool") || !strcmp(name, "size")) { unsigned long long num_val; if (parse_uint_full(value, &num_val, 0)) @@ -116,6 +117,12 @@ static void vitastor_parse_filename(const char *filename, QDict *options, Error error_setg(errp, "inode is missing"); goto out; } + if (!(qdict_get_try_int(options, "inode", 0) >> (64-POOL_ID_BITS)) && + !qdict_get_try_int(options, "pool", 0)) + { + error_setg(errp, "pool number is missing"); + goto out; + } if (!qdict_get_try_int(options, "size", 0)) { error_setg(errp, "size is missing"); @@ -139,6 +146,9 @@ static int vitastor_file_open(BlockDriverState *bs, QDict *options, int flags, E client->etcd_host = g_strdup(qdict_get_try_str(options, "etcd_host")); client->etcd_prefix = g_strdup(qdict_get_try_str(options, "etcd_prefix")); client->inode = qdict_get_int(options, "inode"); + client->pool = qdict_get_int(options, "pool"); + if (client->pool) + client->inode = (client->inode & ((1l << (64-POOL_ID_BITS)) - 1)) | (client->pool << (64-POOL_ID_BITS)); client->size = qdict_get_int(options, "size"); client->readonly = (flags & BDRV_O_RDWR) ? 1 : 0; client->proxy = vitastor_proxy_create(bdrv_get_aio_context(bs), client->etcd_host, client->etcd_prefix); @@ -147,6 +157,7 @@ static int vitastor_file_open(BlockDriverState *bs, QDict *options, int flags, E qdict_del(options, "etcd_host"); qdict_del(options, "etcd_prefix"); qdict_del(options, "inode"); + qdict_del(options, "pool"); qdict_del(options, "size"); qemu_mutex_init(&client->mutex); return ret; @@ -320,6 +331,7 @@ static QemuOptsList vitastor_create_opts = { static const char *vitastor_strong_runtime_opts[] = { "inode", + "pool", "etcd_host", "etcd_prefix", diff --git a/qemu_proxy.h b/qemu_proxy.h index d405774e..be2fe910 100644 --- a/qemu_proxy.h +++ b/qemu_proxy.h @@ -1,6 +1,9 @@ #ifndef VITASTOR_QEMU_PROXY_H #define VITASTOR_QEMU_PROXY_H +#ifndef POOL_ID_BITS +#define POOL_ID_BITS 16 +#endif #include #include