Recent changes (master)
The following changes since commit dde7b2361bf5b052a9c5c727bb2b062c604c7d42:
gclient: don't free pdu on iolog return (2015-12-16 15:05:54 -0700)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to dfc8e76c8d438da9861acfcdc96c46afe4339148:
server: code cleanups (2015-12-17 15:23:48 -0700)
----------------------------------------------------------------
Jens Axboe (7):
Ensure that command line options also end up in json output client/server: various bug fixes
Fix compile warning for !zlib
client/server: transparent handling of storing compressed logs
configure: fix zlib typo
server: remove leftover debug statement
server: code cleanups
client.c | 65 +++++++++++++++++++++++++---- client.h | 3 -- gclient.c | 6 --- iolog.c | 31 ++++++++++---- iolog.h | 9 ++++ options.c | 9 ++-- parse.c | 44 ++++++++++++-------- parse.h | 2 +- server.c | 139 ++++++++++++++++++++++++++++++++++++++++++++------------------ server.h | 5 +++ 10 files changed, 227 insertions(+), 86 deletions(-)
---
Diff of recent changes:
client.c +57 -8
@@ -70,6 +70,8 @@ static int error_clients;#define FIO_CLIENT_HASH_MASK (FIO_CLIENT_HASH_SZ - 1)static struct flist_head client_hash[FIO_CLIENT_HASH_SZ ]; +static struct cmd_iolog_pdu *convert_iolog (struct fio_net_cmd *,bool *); +static void fio_client_add_hash (struct fio_client *client) {int bucket =hash_long (client->fd,FIO_CLIENT_HASH_BITS );
@@ -1224,6 +1226,46 @@ static void handle_eta(struct fio_client *client, struct fio_net_cmd *cmd)fio_client_dec_jobs_eta (eta, client->ops->eta); } +void fio_client_handle_iolog (struct fio_client *client,struct fio_net_cmd *cmd) +{ +struct cmd_iolog_pdu *pdu; +bool store_direct; + + pdu =convert_iolog (cmd, &store_direct); +if (!pdu) +return ; + +if (store_direct) { +ssize_t ret; +size_t sz; +int fd; + + fd =open ((const char *) pdu->name, +O_WRONLY |O_CREAT |O_TRUNC ,0644 ); +if (fd <0 ) { +perror ("open log" ); +return ; + } + sz = cmd->pdu_len -sizeof (*pdu); + ret =write (fd, pdu->samples, sz); +if (ret != sz) +log_err ("fio: short write on compressed log\n" ); +close (fd); + }else { +FILE *f; + + f =fopen ((const char *) pdu->name,"w" ); +if (!f) { +perror ("fopen log" ); +return ; + } + +flush_samples (f, pdu->samples, + pdu->nr_samples *sizeof (struct io_sample )); +fclose (f); + } +} +static void handle_probe (struct fio_client *client,struct fio_net_cmd *cmd) {struct cmd_probe_reply_pdu *probe = (struct cmd_probe_reply_pdu *) cmd->payload;
@@ -1364,27 +1406,36 @@ err:* This has been compressed on the server side, since it can be big. * Uncompress here. */ -static struct cmd_iolog_pdu *convert_iolog (struct fio_net_cmd *cmd) +static struct cmd_iolog_pdu *convert_iolog (struct fio_net_cmd *cmd, +bool *store_direct) {struct cmd_iolog_pdu *pdu = (struct cmd_iolog_pdu *) cmd->payload;struct cmd_iolog_pdu *ret;uint64_t i; +int compressed;void *samples; + *store_direct = false; +/* * Convert if compressed and we support it. If it's not * compressed, we need not do anything. */ -if (le32_to_cpu (pdu->compressed)) { + compressed =le32_to_cpu (pdu->compressed); +if (compressed ==XMIT_COMPRESSED ) {#ifndef CONFIG_ZLIB log_err ("fio: server sent compressed data by mistake\n" );return NULL ;#endif ret =convert_iolog_gz (cmd, pdu); +printf ("compressed iolog, %p\n" , ret);if (!ret) {log_err ("fio: failed decompressing log\n" );return NULL ; } + }else if (compressed ==STORE_COMPRESSED ) { + *store_direct = true; + ret = pdu; }else ret = pdu;
@@ -1394,6 +1445,9 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd) ret->compressed =le32_to_cpu (ret->compressed); ret->log_offset =le32_to_cpu (ret->log_offset); +if (*store_direct) +return ret; + samples = &ret->samples[0 ];for (i =0 ; i < ret->nr_samples; i++) {struct io_sample *s;
@@ -1550,12 +1604,7 @@ int fio_handle_client(struct fio_client *client)break ; }case FIO_NET_CMD_IOLOG : -if (ops->iolog) { -struct cmd_iolog_pdu *pdu; - - pdu =convert_iolog (cmd); - ops->iolog (client, pdu); - } +fio_client_handle_iolog (client, cmd);break ;case FIO_NET_CMD_UPDATE_JOB : ops->update_job (client, cmd);
client.h +0 -3
@@ -76,12 +76,10 @@ struct fio_client {unsigned int nr_files; }; -struct cmd_iolog_pdu ;typedef void (client_cmd_op )(struct fio_client *,struct fio_net_cmd *);typedef void (client_eta_op )(struct jobs_eta *je);typedef void (client_timed_out_op )(struct fio_client *);typedef void (client_jobs_eta_op )(struct fio_client *client,struct jobs_eta *je); -typedef void (client_iolog_op )(struct fio_client *client,struct cmd_iolog_pdu *);struct client_ops {client_cmd_op *text;
@@ -98,7 +96,6 @@ struct client_ops {client_cmd_op *stop;client_cmd_op *start;client_cmd_op *job_start; -client_iolog_op *iolog;client_timed_out_op *removed;unsigned int eta_msec;
gclient.c +0 -6
@@ -693,11 +693,6 @@ static void gfio_client_job_start(struct fio_client *client, struct fio_net_cmdgdk_threads_leave (); } -static void gfio_client_iolog (struct fio_client *client,struct cmd_iolog_pdu *pdu) -{ -printf ("got iolog: name=%s, type=%u, entries=%lu\n" , pdu->name, pdu->log_type, (unsigned long ) pdu->nr_samples); -} -static void gfio_add_total_depths_tree (GtkListStore *model,struct thread_stat *ts,unsigned int len) {
@@ -1393,7 +1388,6 @@ struct client_ops gfio_client_ops = { .stop = gfio_client_stop, .start = gfio_client_start, .job_start = gfio_client_job_start, - .iolog = gfio_client_iolog, .removed = gfio_client_removed, .eta_msec = FIO_CLIENT_DEF_ETA_MSEC, .stay_connected = 1,
iolog.c +22 -9
@@ -634,7 +634,7 @@ void free_log(struct io_log *log)free (log); } -static void flush_samples (FILE *f,void *samples,uint64_t sample_size) +void flush_samples (FILE *f,void *samples,uint64_t sample_size) {struct io_sample *s;int log_offset;
@@ -682,13 +682,6 @@ struct iolog_flush_data {uint64_t nr_samples; }; -struct iolog_compress { -struct flist_head list; -void *buf; -size_t len; -unsigned int seq; -}; -#define GZ_CHUNK 131072static struct iolog_compress *get_new_chunk (unsigned int seq)
@@ -984,7 +977,7 @@ static int finish_log(struct thread_data *td, struct io_log *log, int trylock) }else fio_lock_file (log->filename); -if (td->client_type ==FIO_CLIENT_TYPE_GUI ) +if (td->client_type ==FIO_CLIENT_TYPE_GUI || is_backend)fio_send_iolog (td, log, log->filename);else flush_log (log, !td->o.per_job_logs);
@@ -994,6 +987,26 @@ static int finish_log(struct thread_data *td, struct io_log *log, int trylock)return 0 ; } +size_t log_chunk_sizes (struct io_log *log) +{ +struct flist_head *entry; +size_t ret; + +if (flist_empty (&log->chunk_list)) +return 0 ; + + ret =0 ; +pthread_mutex_lock (&log->chunk_lock); +flist_for_each (entry, &log->chunk_list) { +struct iolog_compress *c; + + c = flist_entry(entry, struct iolog_compress, list); + ret += c->len; + } +pthread_mutex_unlock (&log->chunk_lock); +return ret; +} +#ifdef CONFIG_ZLIB static void drop_data_unlock (struct iolog_flush_data *data)
iolog.h +9 -0
@@ -186,6 +186,7 @@ extern void prune_io_piece_log(struct thread_data *);extern void write_iolog_close (struct thread_data *);extern int iolog_compress_init (struct thread_data *,struct sk_out *);extern void iolog_compress_exit (struct thread_data *); +extern size_t log_chunk_sizes (struct io_log *);#ifdef CONFIG_ZLIB extern int iolog_file_inflate (const char *);
@@ -207,6 +208,7 @@ struct log_params {extern void finalize_logs (struct thread_data *td);extern void setup_log (struct io_log **,struct log_params *,const char *);extern void flush_log (struct io_log *,int ); +extern void flush_samples (FILE *,void *,uint64_t );extern void free_log (struct io_log *);extern void fio_writeout_logs (struct thread_data *);extern int iolog_flush (struct io_log *,int );
@@ -217,4 +219,11 @@ static inline void init_ipo(struct io_piece *ipo) INIT_FLIST_HEAD(&ipo->trim_list); } +struct iolog_compress { +struct flist_head list; +void *buf; +size_t len; +unsigned int seq; +}; +#endif
options.c +6 -3
@@ -536,6 +536,7 @@ static int str_verify_cpus_allowed_cb(void *data, const char *input)return set_cpus_allowed (td, &td->o.verify_cpumask, input); } +#ifdef CONFIG_ZLIB static int str_log_cpus_allowed_cb (void *data,const char *input) {struct thread_data *td = data;
@@ -545,8 +546,9 @@ static int str_log_cpus_allowed_cb(void *data, const char *input)return set_cpus_allowed (td, &td->o.log_gz_cpumask, input); } +#endif /* CONFIG_ZLIB */ -#endif +#endif /* FIO_HAVE_CPU_AFFINITY */ #ifdef CONFIG_LIBNUMA static int str_numa_cpunodes_cb (void *data,char *input)
@@ -4143,7 +4145,7 @@ int fio_cmd_option_parse(struct thread_data *td, const char *opt, char *val) {int ret; - ret =parse_cmd_option (opt, val, fio_options, td); + ret =parse_cmd_option (opt, val, fio_options, td, &td->opt_list);if (!ret) {struct fio_option *o;
@@ -4158,7 +4160,8 @@ int fio_cmd_option_parse(struct thread_data *td, const char *opt, char *val)int fio_cmd_ioengine_option_parse (struct thread_data *td,const char *opt,char *val) { -return parse_cmd_option (opt, val, td->io_ops->options, td->eo); +return parse_cmd_option (opt, val, td->io_ops->options, td->eo, + &td->opt_list); }void fio_fill_default_options (struct thread_data *td)
parse.c +27 -17
64 lines not on this page · raw message
parse.h +1 -1
@@ -82,7 +82,7 @@ typedef int (str_cb_fn)(void *, char *);extern int parse_option (char *,const char *,struct fio_option *,struct fio_option **,void *,struct flist_head *);extern void sort_options (char **,struct fio_option *,int ); -extern int parse_cmd_option (const char *t,const char *l,struct fio_option *,void *); +extern int parse_cmd_option (const char *t,const char *l,struct fio_option *,void *,struct flist_head *);extern int show_cmd_help (struct fio_option *,const char *);extern void fill_default_options (void *,struct fio_option *);extern void option_init (struct fio_option *);
server.c +100 -39
272 lines not on this page · raw message
server.h +5 -0
@@ -172,6 +172,11 @@ struct cmd_text_pdu {uint8_t buf[0 ]; }; +enum { +XMIT_COMPRESSED =1U , +STORE_COMPRESSED =2U , +}; +struct cmd_iolog_pdu {uint64_t nr_samples;uint32_t thread_number;