rbd: add clustername option
[fio.git] / engines / rbd.c
index 8252d270b1bcb44eda6095281a413a3cb0cefdaf..87ed360f7c26a25fb401aac833b9fe05d0c288f4 100644 (file)
@@ -27,6 +27,7 @@ struct rbd_data {
 
 struct rbd_options {
        void *pad;
+       char *cluster_name;
        char *rbd_name;
        char *pool_name;
        char *client_name;
@@ -34,6 +35,15 @@ struct rbd_options {
 };
 
 static struct fio_option options[] = {
+        {
+               .name           = "clustername",
+               .lname          = "ceph cluster name",
+               .type           = FIO_OPT_STR_STORE,
+               .help           = "Cluster name for ceph",
+               .off1           = offsetof(struct rbd_options, cluster_name),
+               .category       = FIO_OPT_C_ENGINE,
+               .group          = FIO_OPT_G_RBD,
+        },
        {
                .name           = "rbdname",
                .lname          = "rbd engine rbdname",
@@ -112,7 +122,25 @@ static int _fio_rbd_connect(struct thread_data *td)
        struct rbd_options *o = td->eo;
        int r;
 
-       r = rados_create(&rbd->cluster, o->client_name);
+       if (o->cluster_name) {
+               char *client_name = NULL; 
+
+               /*
+                * If we specify cluser name, the rados_creat2
+                * will not assume 'client.'. name is considered
+                * as a full type.id namestr
+                */
+               if (!index(o->client_name, '.')) {
+                       client_name = calloc(1, strlen("client.") +
+                                               strlen(o->client_name) + 1);
+                       strcat(client_name, "client.");
+                       o->client_name = strcat(client_name, o->client_name);
+               }
+               r = rados_create2(&rbd->cluster, o->cluster_name,
+                                       o->client_name, 0);
+       } else
+               r = rados_create(&rbd->cluster, o->client_name);
+       
        if (r < 0) {
                log_err("rados_create failed.\n");
                goto failed_early;