4 * common Glusterfs's gfapi interface
9 #include "../optgroup.h"
11 struct fio_option gfapi_options[] = {
14 .lname = "Glusterfs volume",
15 .type = FIO_OPT_STR_STORE,
16 .help = "Name of the Glusterfs volume",
17 .off1 = offsetof(struct gf_options, gf_vol),
18 .category = FIO_OPT_C_ENGINE,
19 .group = FIO_OPT_G_GFAPI,
23 .lname = "Glusterfs brick name",
24 .type = FIO_OPT_STR_STORE,
25 .help = "Name of the Glusterfs brick to connect",
26 .off1 = offsetof(struct gf_options, gf_brick),
27 .category = FIO_OPT_C_ENGINE,
28 .group = FIO_OPT_G_GFAPI,
35 int fio_gf_setup(struct thread_data *td)
38 struct gf_data *g = NULL;
39 struct gf_options *opt = td->eo;
40 struct stat sb = { 0, };
42 dprint(FD_IO, "fio setup\n");
47 g = malloc(sizeof(struct gf_data));
49 log_err("malloc failed.\n");
56 g->fs = glfs_new(opt->gf_vol);
58 log_err("glfs_new failed.\n");
61 glfs_set_logging(g->fs, "/tmp/fio_gfapi.log", 7);
63 r = glfs_set_volfile_server(g->fs, "tcp", opt->gf_brick, 0);
65 log_err("glfs_set_volfile_server failed.\n");
70 log_err("glfs_init failed. Is glusterd running on brick?\n");
74 r = glfs_lstat(g->fs, ".", &sb);
76 log_err("glfs_lstat failed.\n");
79 dprint(FD_FILE, "fio setup %p\n", g->fs);
86 td->io_ops_data = NULL;
90 void fio_gf_cleanup(struct thread_data *td)
92 struct gf_data *g = td->io_ops_data;
102 td->io_ops_data = NULL;
106 int fio_gf_get_file_size(struct thread_data *td, struct fio_file *f)
110 struct gf_data *g = td->io_ops_data;
112 dprint(FD_FILE, "get file size %s\n", f->file_name);
117 if (fio_file_size_known(f))
120 ret = glfs_lstat(g->fs, f->file_name, &buf);
122 log_err("glfs_lstat failed.\n");
126 f->real_file_size = buf.st_size;
127 fio_file_set_size_known(f);
133 int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
138 struct gf_data *g = td->io_ops_data;
139 struct stat sb = { 0, };
144 } else if (td_read(td)) {
152 flags |= OS_O_DIRECT;
156 dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name,
157 flags & O_RDONLY ? "ro" : "rw", td_read(td) ? "read" : "write");
158 g->fd = glfs_creat(g->fs, f->file_name, flags, 0644);
161 log_err("glfs_creat failed.\n");
164 /* file for read doesn't exist or shorter than required, create/extend it */
166 if (glfs_lstat(g->fs, f->file_name, &sb)
167 || sb.st_size < f->real_file_size) {
168 dprint(FD_FILE, "fio extend file %s from %jd to %" PRIu64 "\n",
169 f->file_name, (intmax_t) sb.st_size, f->real_file_size);
170 ret = glfs_ftruncate(g->fd, f->real_file_size);
172 log_err("failed fio extend file %s to %" PRIu64 "\n",
173 f->file_name, f->real_file_size);
175 unsigned long long left;
180 /* fill the file, copied from extend_file */
181 b = malloc(td->o.max_bs[DDIR_WRITE]);
183 left = f->real_file_size;
184 while (left && !td->terminate) {
185 bs = td->o.max_bs[DDIR_WRITE];
189 fill_io_buffer(td, b, bs, bs);
191 r = glfs_write(g->fd, b, bs, 0);
193 "fio write %d of %" PRIu64 " file %s\n",
194 r, f->real_file_size,
209 ("fio: ENOSPC on laying out "
225 glfs_lseek(g->fd, 0, SEEK_SET);
227 if (td->terminate && td->o.unlink) {
228 dprint(FD_FILE, "terminate unlink %s\n",
230 glfs_unlink(g->fs, f->file_name);
231 } else if (td->o.create_fsync) {
232 if (glfs_fsync(g->fd) < 0) {
234 "failed to sync, close %s\n",
236 td_verror(td, errno, "fsync");
245 #if defined(GFAPI_USE_FADVISE)
249 r = glfs_fadvise(g->fd, 0, f->real_file_size,
252 r = glfs_fadvise(g->fd, 0, f->real_file_size,
253 POSIX_FADV_SEQUENTIAL);
256 dprint(FD_FILE, "fio %p fadvise %s status %d\n", g->fs,
261 dprint(FD_FILE, "fio %p created %s\n", g->fs, f->file_name);
268 int fio_gf_close_file(struct thread_data *td, struct fio_file *f)
271 struct gf_data *g = td->io_ops_data;
273 dprint(FD_FILE, "fd close %s\n", f->file_name);
276 if (g->fd && glfs_close(g->fd) < 0)
284 int fio_gf_unlink_file(struct thread_data *td, struct fio_file *f)
287 struct gf_data *g = td->io_ops_data;
289 dprint(FD_FILE, "fd unlink %s\n", f->file_name);
292 if (g->fd && glfs_close(g->fd) < 0)
295 glfs_unlink(g->fs, f->file_name);
303 td->io_ops_data = NULL;