fix get file size problem
authorchenh <hchen@redhat.com>
Fri, 28 Mar 2014 19:30:54 +0000 (15:30 -0400)
committerchenh <hchen@redhat.com>
Fri, 28 Mar 2014 19:30:54 +0000 (15:30 -0400)
engines/glusterfs.c

index 6aed265a36ddc344f5172f40263fe3b6abde314f..21c436525abbb0167a5372cf0088de895f18ff81 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #include <glusterfs/api/glfs.h>
  */
 
 #include <glusterfs/api/glfs.h>
-
+#include <glusterfs/api/glfs-handles.h>
 #include "../fio.h"
 
 struct gf_options {
 #include "../fio.h"
 
 struct gf_options {
@@ -19,6 +19,7 @@ struct gf_data {
     glfs_t *fs;
     glfs_fd_t *fd;
 };
     glfs_t *fs;
     glfs_fd_t *fd;
 };
+
 static struct fio_option options[] = {
     {
        .name     = "volume",
 static struct fio_option options[] = {
     {
        .name     = "volume",
@@ -48,6 +49,9 @@ static int fio_gf_setup(struct thread_data *td)
        int r = 0;
        struct gf_data *g = NULL;
        struct gf_options *opt = td->eo;
        int r = 0;
        struct gf_data *g = NULL;
        struct gf_options *opt = td->eo;
+        struct stat sb = {0, };
+
+       dprint(FD_IO, "fio setup\n");
 
        if (td->io_ops->data)
            return 0;
 
        if (td->io_ops->data)
            return 0;
@@ -64,41 +68,40 @@ static int fio_gf_setup(struct thread_data *td)
            log_err("glfs_new failed.\n");
            goto cleanup;
        }
            log_err("glfs_new failed.\n");
            goto cleanup;
        }
-
+       glfs_set_logging (g->fs, "/tmp/fio_gfapi.log", 7);
        /* default to tcp */
        /* default to tcp */
-       r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 24007);
+       r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 0);
        if (r){
            log_err("glfs_set_volfile_server failed.\n");
            goto cleanup;
        }
        r = glfs_init(g->fs);
        if (r){
        if (r){
            log_err("glfs_set_volfile_server failed.\n");
            goto cleanup;
        }
        r = glfs_init(g->fs);
        if (r){
-           log_err("glfs_init failed.\n");
+           log_err("glfs_init failed. Is glusterd running on brick?\n");
+           goto cleanup;
+       }
+       sleep(2);
+       r = glfs_lstat (g->fs, ".", &sb);
+       if (r){
+           log_err("glfs_lstat failed.\n");
            goto cleanup;
        }
            goto cleanup;
        }
-       glfs_set_logging (g->fs, "/dev/stderr", 7);
-       
+       dprint(FD_FILE, "fio setup %p\n", g->fs);
        td->io_ops->data = g;
 cleanup:
        td->io_ops->data = g;
 cleanup:
-       if (g){
-           if (g->fs){
-               glfs_fini(g->fs);
+       if (r){
+           if (g){
+               if (g->fs){
+                   glfs_fini(g->fs);
+               }
+               free(g);
            }
            }
-           free(g);
        }
        return r;
 }
 
 static void fio_gf_cleanup(struct thread_data *td)
 {
        }
        return r;
 }
 
 static void fio_gf_cleanup(struct thread_data *td)
 {
-       struct gf_data *g = td->io_ops->data;
-
-       if (g){
-           if (g->fs){
-               glfs_fini(g->fs);
-           }
-           free(g);
-       }
 }
 
 static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
 }
 
 static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
@@ -113,13 +116,14 @@ static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
     {
        return 0;
     }
     {
        return 0;
     }
-
     if (fio_file_size_known(f))
        return 0;
 
     ret = glfs_lstat (g->fs, f->file_name, &buf);
     if (fio_file_size_known(f))
        return 0;
 
     ret = glfs_lstat (g->fs, f->file_name, &buf);
-    if (ret < 0)
+    if (ret < 0){
+       log_err("glfs_lstat failed.\n");
        return ret;
        return ret;
+    }
 
     f->real_file_size = buf.st_size;
     fio_file_set_size_known(f);
 
     f->real_file_size = buf.st_size;
     fio_file_set_size_known(f);
@@ -130,11 +134,12 @@ static int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
 
 static int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
 {
 
 static int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
 {
-    struct gf_data *g = td->io_ops->data;
-    int flags = 0;
 
 
-    dprint(FD_FILE, "fd open %s\n", f->file_name);
+    int flags = 0;
+    int ret = 0;
+    struct gf_data *g = td->io_ops->data;
 
 
+    dprint(FD_FILE, "fio open %s\n", f->file_name);
     if (td_write(td)) {
        if (!read_only)
            flags = O_RDWR;
     if (td_write(td)) {
        if (!read_only)
            flags = O_RDWR;
@@ -144,12 +149,16 @@ static int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
        else
            flags = O_RDONLY;
     }
        else
            flags = O_RDONLY;
     }
-    if (td->o.create_on_open)
-       flags |= O_CREAT;
-
-    g->fd = glfs_open(g->fs, f->file_name, flags);
+    g->fd = glfs_creat(g->fs, f->file_name, flags, 0644);
+    if (!g->fd){
+       log_err("glfs_creat failed.\n");
+       ret = errno;
+    }
+    dprint(FD_FILE, "fio %p created %s\n", g->fs, f->file_name);
     f->fd = -1;
     f->fd = -1;
-    return 0;
+    f->shadow_fd = -1;    
+
+    return ret;
 }
 
 static int fio_gf_close_file(struct thread_data *td, struct fio_file *f)
 }
 
 static int fio_gf_close_file(struct thread_data *td, struct fio_file *f)
@@ -159,10 +168,15 @@ static int fio_gf_close_file(struct thread_data *td, struct fio_file *f)
 
        dprint(FD_FILE, "fd close %s\n", f->file_name);
 
 
        dprint(FD_FILE, "fd close %s\n", f->file_name);
 
-       if (!g->fd && glfs_close(g->fd) < 0)
-               ret = errno;
+       if (g->fd && glfs_close(g->fd) < 0)
+           ret = errno;
+
+       if (g->fs)
+           glfs_fini(g->fs);
 
        g->fd = NULL;
 
        g->fd = NULL;
+       free(g);
+       td->io_ops->data = NULL;
        f->engine_data = 0;
 
        return ret;
        f->engine_data = 0;
 
        return ret;
@@ -174,6 +188,8 @@ static int fio_gf_prep(struct thread_data *td, struct io_u *io_u)
        struct fio_file *f = io_u->file;
        struct gf_data *g = td->io_ops->data;
 
        struct fio_file *f = io_u->file;
        struct gf_data *g = td->io_ops->data;
 
+       dprint(FD_FILE, "fio prep\n");
+
        if (!ddir_rw(io_u->ddir))
                return 0;
 
        if (!ddir_rw(io_u->ddir))
                return 0;
 
@@ -193,6 +209,7 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u)
     struct gf_data *g = td->io_ops->data;
     int ret = 0;
 
     struct gf_data *g = td->io_ops->data;
     int ret = 0;
 
+    dprint(FD_FILE, "fio queue len %lu\n", io_u->xfer_buflen);
     fio_ro_check(td, io_u);
 
     if (io_u->ddir == DDIR_READ)
     fio_ro_check(td, io_u);
 
     if (io_u->ddir == DDIR_READ)
@@ -203,6 +220,7 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u)
        log_err("unsupported operation.\n");
        return -EINVAL;
     }
        log_err("unsupported operation.\n");
        return -EINVAL;
     }
+    
     if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir))
        LAST_POS(io_u->file) = io_u->offset + ret;
 
     if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir))
        LAST_POS(io_u->file) = io_u->offset + ret;
 
@@ -215,8 +233,10 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u)
            io_u->error = errno;
     }
 
            io_u->error = errno;
     }
 
-    if (io_u->error)
+    if (io_u->error){
+       log_err("IO failed.\n");
        td_verror(td, io_u->error, "xfer");
        td_verror(td, io_u->error, "xfer");
+    }
 
     return FIO_Q_COMPLETED;
 
 
     return FIO_Q_COMPLETED;
 
@@ -225,7 +245,7 @@ static int fio_gf_queue(struct thread_data *td, struct io_u *io_u)
 static struct ioengine_ops ioengine = {
        .name               = "gfapi",
        .version            = FIO_IOOPS_VERSION,
 static struct ioengine_ops ioengine = {
        .name               = "gfapi",
        .version            = FIO_IOOPS_VERSION,
-       .setup              = fio_gf_setup,
+       .init               = fio_gf_setup,
        .cleanup            = fio_gf_cleanup,
        .prep               = fio_gf_prep,
        .queue              = fio_gf_queue,
        .cleanup            = fio_gf_cleanup,
        .prep               = fio_gf_prep,
        .queue              = fio_gf_queue,
@@ -234,7 +254,7 @@ static struct ioengine_ops ioengine = {
        .get_file_size      = fio_gf_get_file_size,
        .options            = options,
        .option_struct_size = sizeof(struct gf_options),
        .get_file_size      = fio_gf_get_file_size,
        .options            = options,
        .option_struct_size = sizeof(struct gf_options),
-       .flags              = FIO_SYNCIO,
+       .flags              = FIO_SYNCIO | FIO_DISKLESSIO,
 };
 
 static void fio_init fio_gf_register(void)
 };
 
 static void fio_init fio_gf_register(void)