forked from vitalif/vitastor
Add pool setting to fio and qemu drivers
parent
cc4714a3a7
commit
68c3e96e46
|
@ -320,6 +320,12 @@ void cluster_client_t::execute(cluster_op_t *op)
|
||||||
void cluster_client_t::continue_rw(cluster_op_t *op)
|
void cluster_client_t::continue_rw(cluster_op_t *op)
|
||||||
{
|
{
|
||||||
pool_id_t pool_id = INODE_POOL(op->inode);
|
pool_id_t pool_id = INODE_POOL(op->inode);
|
||||||
|
if (!pool_id)
|
||||||
|
{
|
||||||
|
op->retval = -EINVAL;
|
||||||
|
std::function<void(cluster_op_t*)>(op->callback)(op);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (st_cli.pool_config.find(pool_id) == st_cli.pool_config.end() ||
|
if (st_cli.pool_config.find(pool_id) == st_cli.pool_config.end() ||
|
||||||
st_cli.pool_config[pool_id].real_pg_count == 0)
|
st_cli.pool_config[pool_id].real_pg_count == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,17 +3,17 @@
|
||||||
// Random write:
|
// Random write:
|
||||||
//
|
//
|
||||||
// fio -thread -ioengine=./libfio_cluster.so -name=test -bs=4k -direct=1 -fsync=16 -iodepth=16 -rw=randwrite \
|
// 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:
|
// Linear write:
|
||||||
//
|
//
|
||||||
// fio -thread -ioengine=./libfio_cluster.so -name=test -bs=128k -direct=1 -fsync=32 -iodepth=32 -rw=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):
|
// 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 \
|
// 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 <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -49,7 +49,8 @@ struct sec_options
|
||||||
int __pad;
|
int __pad;
|
||||||
char *etcd_host = NULL;
|
char *etcd_host = NULL;
|
||||||
char *etcd_prefix = NULL;
|
char *etcd_prefix = NULL;
|
||||||
int inode = 0;
|
uint64_t pool = 0;
|
||||||
|
uint64_t inode = 0;
|
||||||
int trace = 0;
|
int trace = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,6 +73,15 @@ static struct fio_option options[] = {
|
||||||
.category = FIO_OPT_C_ENGINE,
|
.category = FIO_OPT_C_ENGINE,
|
||||||
.group = FIO_OPT_G_FILENAME,
|
.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",
|
.name = "inode",
|
||||||
.lname = "inode to run tests on",
|
.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") },
|
{ "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->ringloop = new ring_loop_t(512);
|
||||||
bsd->epmgr = new epoll_manager_t(bsd->ringloop);
|
bsd->epmgr = new epoll_manager_t(bsd->ringloop);
|
||||||
bsd->cli = new cluster_client_t(bsd->ringloop, bsd->epmgr->tfd, cfg);
|
bsd->cli = new cluster_client_t(bsd->ringloop, bsd->epmgr->tfd, cfg);
|
||||||
|
|
|
@ -22,6 +22,7 @@ typedef struct VitastorClient
|
||||||
char *etcd_host;
|
char *etcd_host;
|
||||||
char *etcd_prefix;
|
char *etcd_prefix;
|
||||||
uint64_t inode;
|
uint64_t inode;
|
||||||
|
uint64_t pool;
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
int readonly;
|
int readonly;
|
||||||
QemuMutex mutex;
|
QemuMutex mutex;
|
||||||
|
@ -68,7 +69,7 @@ static void qemu_rbd_unescape(char *src)
|
||||||
}
|
}
|
||||||
|
|
||||||
// vitastor[:key=value]*
|
// 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)
|
static void vitastor_parse_filename(const char *filename, QDict *options, Error **errp)
|
||||||
{
|
{
|
||||||
const char *start;
|
const char *start;
|
||||||
|
@ -96,7 +97,7 @@ static void vitastor_parse_filename(const char *filename, QDict *options, Error
|
||||||
qemu_rbd_unescape(name);
|
qemu_rbd_unescape(name);
|
||||||
value = qemu_rbd_next_tok(p, ':', &p);
|
value = qemu_rbd_next_tok(p, ':', &p);
|
||||||
qemu_rbd_unescape(value);
|
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;
|
unsigned long long num_val;
|
||||||
if (parse_uint_full(value, &num_val, 0))
|
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");
|
error_setg(errp, "inode is missing");
|
||||||
goto out;
|
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))
|
if (!qdict_get_try_int(options, "size", 0))
|
||||||
{
|
{
|
||||||
error_setg(errp, "size is missing");
|
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_host = g_strdup(qdict_get_try_str(options, "etcd_host"));
|
||||||
client->etcd_prefix = g_strdup(qdict_get_try_str(options, "etcd_prefix"));
|
client->etcd_prefix = g_strdup(qdict_get_try_str(options, "etcd_prefix"));
|
||||||
client->inode = qdict_get_int(options, "inode");
|
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->size = qdict_get_int(options, "size");
|
||||||
client->readonly = (flags & BDRV_O_RDWR) ? 1 : 0;
|
client->readonly = (flags & BDRV_O_RDWR) ? 1 : 0;
|
||||||
client->proxy = vitastor_proxy_create(bdrv_get_aio_context(bs), client->etcd_host, client->etcd_prefix);
|
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_host");
|
||||||
qdict_del(options, "etcd_prefix");
|
qdict_del(options, "etcd_prefix");
|
||||||
qdict_del(options, "inode");
|
qdict_del(options, "inode");
|
||||||
|
qdict_del(options, "pool");
|
||||||
qdict_del(options, "size");
|
qdict_del(options, "size");
|
||||||
qemu_mutex_init(&client->mutex);
|
qemu_mutex_init(&client->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -320,6 +331,7 @@ static QemuOptsList vitastor_create_opts = {
|
||||||
|
|
||||||
static const char *vitastor_strong_runtime_opts[] = {
|
static const char *vitastor_strong_runtime_opts[] = {
|
||||||
"inode",
|
"inode",
|
||||||
|
"pool",
|
||||||
"etcd_host",
|
"etcd_host",
|
||||||
"etcd_prefix",
|
"etcd_prefix",
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef VITASTOR_QEMU_PROXY_H
|
#ifndef VITASTOR_QEMU_PROXY_H
|
||||||
#define VITASTOR_QEMU_PROXY_H
|
#define VITASTOR_QEMU_PROXY_H
|
||||||
|
|
||||||
|
#ifndef POOL_ID_BITS
|
||||||
|
#define POOL_ID_BITS 16
|
||||||
|
#endif
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue