4 * common Glusterfs's gfapi interface
10 struct fio_option gfapi_options[] = {
13 .lname = "Glusterfs volume",
14 .type = FIO_OPT_STR_STORE,
15 .help = "Name of the Glusterfs volume",
16 .off1 = offsetof(struct gf_options, gf_vol),
17 .category = FIO_OPT_C_ENGINE,
18 .group = FIO_OPT_G_GFAPI,
22 .lname = "Glusterfs brick name",
23 .type = FIO_OPT_STR_STORE,
24 .help = "Name of the Glusterfs brick to connect",
25 .off1 = offsetof(struct gf_options, gf_brick),
26 .category = FIO_OPT_C_ENGINE,
27 .group = FIO_OPT_G_GFAPI,
34 int fio_gf_setup(struct thread_data *td)
37 struct gf_data *g = NULL;
38 struct gf_options *opt = td->eo;
39 struct stat sb = {0, };
41 dprint(FD_IO, "fio setup\n");
46 g = malloc(sizeof(struct gf_data));
48 log_err("malloc failed.\n");
51 g->fs = NULL; g->fd = NULL; g->aio_events = NULL;
53 g->fs = glfs_new (opt->gf_vol);
55 log_err("glfs_new failed.\n");
58 glfs_set_logging (g->fs, "/tmp/fio_gfapi.log", 7);
60 r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 0);
62 log_err("glfs_set_volfile_server failed.\n");
67 log_err("glfs_init failed. Is glusterd running on brick?\n");
71 r = glfs_lstat (g->fs, ".", &sb);
73 log_err("glfs_lstat failed.\n");
76 dprint(FD_FILE, "fio setup %p\n", g->fs);
85 td->io_ops->data = NULL;
91 void fio_gf_cleanup(struct thread_data *td)
93 struct gf_data *g = td->io_ops->data;
103 td->io_ops->data = NULL;
107 int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
111 struct gf_data *g = td->io_ops->data;
113 dprint(FD_FILE, "get file size %s\n", f->file_name);
119 if (fio_file_size_known(f))
122 ret = glfs_lstat (g->fs, f->file_name, &buf);
124 log_err("glfs_lstat failed.\n");
128 f->real_file_size = buf.st_size;
129 fio_file_set_size_known(f);
135 int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
140 struct gf_data *g = td->io_ops->data;
141 struct stat sb = {0, };
146 } else if (td_read(td)) {
152 dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name,
153 flags == O_RDONLY? "ro":"rw", td_read(td)? "read":"write");
154 g->fd = glfs_creat(g->fs, f->file_name, flags, 0644);
156 log_err("glfs_creat failed.\n");
159 /* file for read doesn't exist or shorter than required, create/extend it */
161 if (glfs_lstat (g->fs, f->file_name, &sb) || sb.st_size < f->real_file_size){
162 dprint(FD_FILE, "fio extend file %s from %ld to %ld\n", f->file_name, sb.st_size, f->real_file_size);
163 ret = glfs_ftruncate (g->fd, f->real_file_size);
165 log_err("failed fio extend file %s to %ld\n", f->file_name, f->real_file_size);
167 unsigned long long left;
172 /* fill the file, copied from extend_file */
173 b = malloc(td->o.max_bs[DDIR_WRITE]);
175 left = f->real_file_size;
176 while (left && !td->terminate) {
177 bs = td->o.max_bs[DDIR_WRITE];
181 fill_io_buffer(td, b, bs, bs);
183 r = glfs_write(g->fd, b, bs, 0);
184 dprint(FD_IO, "fio write %d of %ld file %s\n", r, f->real_file_size, f->file_name);
194 if (td->o.fill_device)
196 log_info("fio: ENOSPC on laying out "
200 td_verror(td, errno, "write");
202 td_verror(td, EIO, "write");
209 glfs_lseek(g->fd, 0, SEEK_SET);
212 dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
213 unlink(f->file_name);
214 } else if (td->o.create_fsync) {
215 if (glfs_fsync(g->fd) < 0) {
216 dprint(FD_FILE, "failed to sync, close %s\n", f->file_name);
217 td_verror(td, errno, "fsync");
226 #if defined(GFAPI_USE_FADVISE)
230 r = glfs_fadvise(g->fd, 0, f->real_file_size, POSIX_FADV_RANDOM);
232 r = glfs_fadvise(g->fd, 0, f->real_file_size, POSIX_FADV_SEQUENTIAL);
235 dprint(FD_FILE, "fio %p fadvise %s status %d\n", g->fs, f->file_name, r);
239 dprint(FD_FILE, "fio %p created %s\n", g->fs, f->file_name);
246 int fio_gf_close_file(struct thread_data *td, struct fio_file *f)
249 struct gf_data *g = td->io_ops->data;
251 dprint(FD_FILE, "fd close %s\n", f->file_name);
254 if (g->fd && glfs_close(g->fd) < 0)
263 td->io_ops->data = NULL;