Recent changes (master)
The following changes since commit 2c3fcd7bd67209e141e259b1fdd4585e8d91167c:
Fio 2.1.9 (2014-05-12 17:18:13 -0600)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to d9b100fc117a963334fb71b8b662be90cd456068:
Add ->invalidate() IO engine ops (2014-05-19 19:57:05 -0600)
----------------------------------------------------------------
Christophe Vu-Brugier (1):
Fix some typos in the manpage
Jens Axboe (5):
Merge branch 'master' of git://github.com/rootfs/fio
Merge branch 'master' of git://github.com/cvubrugier/fio
Run the gluster engines through indent
gfapi: indentify
Add ->invalidate() IO engine ops
Xan Peng (1):
Fix issue with dangling pointer in the rbd engine
chenh (10):
Glusterfs libgfapi engine - initial deposit
make glfs call per thread based
respond to get file size
respond to get file size
fix get file size problem
fix man page; fix read work
extend file for real
first async IO code drop
second async IO code drop
glusterfs api fadvise support
Makefile | 8 ++ configure | 45 +++++++ engines/gfapi.h | 22 ++++ engines/glusterfs.c | 285 +++++++++++++++++++++++++++++++++++++++++++++ engines/glusterfs_async.c | 207 ++++++++++++++++++++++++++++++++ engines/glusterfs_sync.c | 93 +++++++++++++++ engines/rbd.c | 34 +++--- filesetup.c | 4 +- fio.1 | 38 +++--- ioengine.h | 3 +- options.c | 9 ++ options.h | 2 + 12 files changed, 721 insertions(+), 29 deletions(-) create mode 100644 engines/gfapi.h create mode 100644 engines/glusterfs.c create mode 100644 engines/glusterfs_async.c create mode 100644 engines/glusterfs_sync.c
---
Diff of recent changes:
Makefile +8 -0
@@ -91,6 +91,14 @@ endif ifndef CONFIG_INET_ATON SOURCE += lib/inet_aton.c endif +ifdef CONFIG_GFAPI + SOURCE += engines/glusterfs.c + SOURCE += engines/glusterfs_sync.c + SOURCE += engines/glusterfs_async.c + ifdef CONFIG_GF_FADVISE + CFLAGS += "-DGFAPI_USE_FADVISE" + endif +endif ifeq ($(CONFIG_TARGET_OS), Linux) SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c engines/sg.c \
configure +45 -0
57 lines not on this page · raw message
engines/gfapi.h new file +22 -0
@@ -0,0 +1,22 @@ +#include <glusterfs/api/glfs.h> +#include <glusterfs/api/glfs-handles.h> +#include "../fio.h" + +struct gf_options { +struct thread_data *td; +char *gf_vol; +char *gf_brick; +}; + +struct gf_data { +glfs_t *fs; +glfs_fd_t *fd; +struct io_u **aio_events; +}; + +extern struct fio_option gfapi_options[]; +extern int fio_gf_setup (struct thread_data *td); +extern void fio_gf_cleanup (struct thread_data *td); +extern int fio_gf_get_file_size (struct thread_data *td,struct fio_file *f); +extern int fio_gf_open_file (struct thread_data *td,struct fio_file *f); +extern int fio_gf_close_file (struct thread_data *td,struct fio_file *f);
engines/glusterfs.c new file +285 -0
285 lines not on this page · raw message
engines/glusterfs_async.c new file +207 -0
207 lines not on this page · raw message
engines/glusterfs_sync.c new file +93 -0
93 lines not on this page · raw message
engines/rbd.c +21 -13
@@ -131,8 +131,10 @@ static int _fio_rbd_connect(struct thread_data *td) failed_open:rados_ioctx_destroy (rbd_data->io_ctx); + rbd_data->io_ctx =NULL ; failed_shutdown:rados_shutdown (rbd_data->cluster); + rbd_data->cluster =NULL ; failed_early:return 1 ; }
@@ -402,6 +404,11 @@ static int fio_rbd_open(struct thread_data *td, struct fio_file *f)return 0 ; } +static int fio_rbd_invalidate (struct thread_data *td,struct fio_file *f) +{ +return 0 ; +} +static void fio_rbd_io_u_free (struct thread_data *td,struct io_u *io_u) {struct fio_rbd_iou *o = io_u->engine_data;
@@ -424,19 +431,20 @@ static int fio_rbd_io_u_init(struct thread_data *td, struct io_u *io_u) }static struct ioengine_ops ioengine = { - .name ="rbd" , - .version =FIO_IOOPS_VERSION , - .setup = fio_rbd_setup, - .init = fio_rbd_init, - .queue = fio_rbd_queue, - .getevents = fio_rbd_getevents, - .event = fio_rbd_event, - .cleanup = fio_rbd_cleanup, - .open_file = fio_rbd_open, - .options = options, - .io_u_init = fio_rbd_io_u_init, - .io_u_free = fio_rbd_io_u_free, - .option_struct_size =sizeof (struct rbd_options ), + .name ="rbd" , + .version =FIO_IOOPS_VERSION , + .setup = fio_rbd_setup, + .init = fio_rbd_init, + .queue = fio_rbd_queue, + .getevents = fio_rbd_getevents, + .event = fio_rbd_event, + .cleanup = fio_rbd_cleanup, + .open_file = fio_rbd_open, + .invalidate = fio_rbd_invalidate, + .options = options, + .io_u_init = fio_rbd_io_u_init, + .io_u_free = fio_rbd_io_u_free, + .option_struct_size =sizeof (struct rbd_options ), }; static void fio_init fio_rbd_register(void)
filesetup.c +3 -1
@@ -401,7 +401,9 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,dprint (FD_IO ,"invalidate cache %s: %llu/%llu\n" , f->file_name, off, len); -if (f->mmap_ptr) { +if (td->io_ops->invalidate) + ret = td->io_ops->invalidate (td, f); +else if (f->mmap_ptr) { ret =posix_madvise (f->mmap_ptr, f->mmap_sz,POSIX_MADV_DONTNEED );#ifdef FIO_MADV_FREE if (f->filetype ==FIO_TYPE_BD )
fio.1 +24 -14
@@ -75,7 +75,7 @@ Report full output status every `time` period passed. Turn on safety read-only checks, preventing any attempted write. .TP .BI \-\-section \fR=\fPsec -Only run section \fIsec\fR from job file. Multiple of these options can be given, adding more sections to run. +Only run section \fIsec\fR from job file. This option can be used multiple times to add more sections to run. .TP .BI \-\-alloc\-size \fR=\fPkb Set the internal smalloc pool size to \fIkb\fP kilobytes.
@@ -225,7 +225,7 @@ The lock modes are: No locking. This is the default. .TP .B exclusive -Only one thread or process may do IO at the time, excluding all others. +Only one thread or process may do IO at a time, excluding all others. .TP .B readwrite Read-write locking on the file. Many readers may access the file at the same
@@ -310,7 +310,7 @@ reasons. Allowed values are 1024 or 1000, with 1024 being the default. .BI unified_rw_reporting \fR=\fPbool Fio normally reports statistics on a per data direction basis, meaning that read, write, and trim are accounted and reported separately. If this option is -set, the fio will sum the results and report them as "mixed" instead. +set fio sums the results and reports them as "mixed" instead. .TP .BI randrepeat \fR=\fPbool Seed the random number generator used for random I/O patterns in a predictable
@@ -326,8 +326,8 @@ control what sequence of output is being generated. If not set, the random sequence depends on the \fBrandrepeat\fR setting. .TP .BI use_os_rand \fR=\fPbool -Fio can either use the random generator supplied by the OS to generator random -offsets, or it can use it's own internal generator (based on Tausworthe). +Fio can either use the random generator supplied by the OS to generate random +offsets, or it can use its own internal generator (based on Tausworthe). Default is to use the internal generator, which is often of better quality and faster. Default: false. .TP
@@ -359,7 +359,7 @@ because ZFS doesn't support it. Default: 'posix'. .RE .TP .BI fadvise_hint \fR=\fPbool -Use of \fBposix_fadvise\fR\|(2) to advise the kernel what I/O patterns +Use \fBposix_fadvise\fR\|(2) to advise the kernel what I/O patterns are likely to be issued. Default: true. .TP .BI size \fR=\fPint
@@ -443,7 +443,7 @@ blocksize settings, and any sequential read or write will use the READ blocksize setting. .TP .B zero_buffers -Initialise buffers with all zeros. Default: fill buffers with random data. +Initialize buffers with all zeros. Default: fill buffers with random data. The resulting IO buffers will not be completely zeroed, unless \fPscramble_buffers\fR is also turned off. .TP
@@ -475,8 +475,8 @@ the remaining zeroed. With this set to some chunk size smaller than the block size, fio can alternate random and zeroed data throughout the IO buffer. .TP .BI buffer_pattern \fR=\fPstr -If set, fio will fill the io buffers with this pattern. If not set, the contents -of io buffers is defined by the other options related to buffer contents. The +If set, fio will fill the IO buffers with this pattern. If not set, the contents +of IO buffers is defined by the other options related to buffer contents. The setting can be any pattern of bytes, and can be prefixed with 0x for hex values. .TP
@@ -495,13 +495,13 @@ Defines how files to service are selected. The following types are defined: Choose a file at random. .TP .B roundrobin -Round robin over open files (default). +Round robin over opened files (default). .TP .B sequential Do each file in the set sequentially. .RE .P -The number of I/Os to issue before switching a new file can be specified by +The number of I/Os to issue before switching to a new file can be specified by appending `:\fIint\fR' to the service type. .RE .TP
@@ -602,6 +602,16 @@ request to DDIR_WRITE event IO engine supporting direct access to Ceph Rados Block Devices (RBD) via librbd without the need to use the kernel rbd driver. This ioengine defines engine specific options. +.TP +.B gfapi +Using Glusterfs libgfapi sync interface to direct access to Glusterfs volumes without +having to go through FUSE. This ioengine defines engine specific +options. +.TP +.B gfapi_async +Using Glusterfs libgfapi async interface to direct access to Glusterfs volumes without +having to go through FUSE. This ioengine defines engine specific +options. .RE .P .RE
@@ -609,7 +619,7 @@ options. .BI iodepth \fR=\fPint Number of I/O units to keep in flight against the file. Note that increasing iodepth beyond 1 will not affect synchronous ioengines (except for small -degress when verify_async is in use). Even async engines my impose OS +degress when verify_async is in use). Even async engines may impose OS restrictions causing the desired depth not to be achieved. This may happen on Linux when using libaio and not setting \fBdirect\fR=1, since buffered IO is not async on that OS. Keep an eye on the IO depth distribution in the
@@ -1367,7 +1377,7 @@ the observed latencies fell, respectively. .SS "Ioengine Parameters List" Some parameters are only valid when a specific ioengine is in use. These are used identically to normal parameters, with the caveat that when used on the -command line, the must come after the ioengine that defines them is selected. +command line, they must come after the ioengine. .TP .BI (cpu)cpuload \fR=\fPint Attempt to use the specified percentage of CPU cycles.
@@ -1438,7 +1448,7 @@ hostname must be omitted if this option is used. .TP .BI (net, pingpong) \fR=\fPbool Normally a network writer will just continue writing data, and a network reader -will just consume packages. If pingpong=1 is set, a writer will send its normal +will just consume packets. If pingpong=1 is set, a writer will send its normal payload to the reader, then wait for the reader to send the same payload back. This allows fio to measure network latencies. The submission and completion latencies then measure local time spent sending or receiving, and the
ioengine.h +2 -1
@@ -15,7 +15,7 @@#include <guasi.h> #endif -#define FIO_IOOPS_VERSION 18 +#define FIO_IOOPS_VERSION 19enum {IO_U_F_FREE =1 <<0 ,
@@ -143,6 +143,7 @@ struct ioengine_ops {void (*cleanup)(struct thread_data *);int (*open_file)(struct thread_data *,struct fio_file *);int (*close_file)(struct thread_data *,struct fio_file *); +int (*invalidate)(struct thread_data *,struct fio_file *);int (*get_file_size)(struct thread_data *,struct fio_file *);void (*terminate)(struct thread_data *);int (*io_u_init)(struct thread_data *,struct io_u *);
options.c +9 -0
@@ -1533,6 +1533,15 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "fallocate() file based engine", },#endif +#ifdef CONFIG_GFAPI + { .ival = "gfapi", + .help = "Glusterfs libgfapi(sync) based engine" + }, + { .ival = "gfapi_async", + .help = "Glusterfs libgfapi(async) based engine" + }, +#endif + { .ival = "external", .help = "Load external engine (append name)", },
options.h +2 -0
@@ -98,6 +98,7 @@ enum opt_category_group { __FIO_OPT_G_ACT, __FIO_OPT_G_LATPROF, __FIO_OPT_G_RBD, + __FIO_OPT_G_GFAPI, __FIO_OPT_G_NR, FIO_OPT_G_RATE = (1U << __FIO_OPT_G_RATE),
@@ -128,6 +129,7 @@ enum opt_category_group {FIO_OPT_G_ACT = (1U << __FIO_OPT_G_ACT),FIO_OPT_G_LATPROF = (1U << __FIO_OPT_G_LATPROF),FIO_OPT_G_RBD = (1U << __FIO_OPT_G_RBD), +FIO_OPT_G_GFAPI = (1U << __FIO_OPT_G_GFAPI), FIO_OPT_G_INVALID = (1U << __FIO_OPT_G_NR), };