From: Stephen M. Cameron Date: Fri, 24 Feb 2012 07:17:30 +0000 (+0100) Subject: fio: make client operations pluggable X-Git-Tag: gfio-0.1~315 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=dd366728eb503e6344215ae6ec153c7ab6eafd9b fio: make client operations pluggable Signed-off-by: Stephen M. Cameron Signed-off-by: Jens Axboe --- diff --git a/client.c b/client.c index 8c85d2b5..c794d9b1 100644 --- a/client.c +++ b/client.c @@ -16,6 +16,7 @@ #include #include "fio.h" +#include "client.h" #include "server.h" #include "flist.h" #include "hash.h" @@ -59,6 +60,36 @@ struct fio_client { char **argv; }; +static void fio_client_text_op(struct fio_client *client, + FILE *f, __u16 pdu_len, const char *buf) +{ + const char *name; + int fio_unused ret; + + name = client->name ? client->name : client->hostname; + + if (!client->skip_newline) + fprintf(f, "<%s> ", name); + ret = fwrite(buf, pdu_len, 1, f); + fflush(f); + client->skip_newline = strchr(buf, '\n') == NULL; +} + +static void handle_du(struct fio_client *client, struct fio_net_cmd *cmd); +static void handle_ts(struct fio_net_cmd *cmd); +static void handle_gs(struct fio_net_cmd *cmd); +static void handle_eta(struct fio_client *client, struct fio_net_cmd *cmd); +static void handle_probe(struct fio_client *client, struct fio_net_cmd *cmd); + +struct client_ops fio_client_ops = { + fio_client_text_op, + handle_du, + handle_ts, + handle_gs, + handle_eta, + handle_probe, +}; + static struct timeval eta_tv; enum { @@ -85,7 +116,7 @@ static int sum_stat_nr; #define FIO_CLIENT_HASH_MASK (FIO_CLIENT_HASH_SZ - 1) static struct flist_head client_hash[FIO_CLIENT_HASH_SZ]; -static int handle_client(struct fio_client *client); +static int handle_client(struct fio_client *client, struct client_ops *ops); static void dec_jobs_eta(struct client_eta *eta); static void fio_client_add_hash(struct fio_client *client) @@ -819,7 +850,7 @@ static void handle_stop(struct fio_client *client, struct fio_net_cmd *cmd) log_info("client <%s>: exited with error %d\n", client->hostname, client->error); } -static int handle_client(struct fio_client *client) +static int handle_client(struct fio_client *client, struct client_ops *ops) { struct fio_net_cmd *cmd; @@ -839,39 +870,30 @@ static int handle_client(struct fio_client *client) break; case FIO_NET_CMD_TEXT: { const char *buf = (const char *) cmd->payload; - const char *name; - int fio_unused ret; - - name = client->name ? client->name : client->hostname; - - if (!client->skip_newline) - fprintf(f_out, "<%s> ", name); - ret = fwrite(buf, cmd->pdu_len, 1, f_out); - fflush(f_out); - client->skip_newline = strchr(buf, '\n') == NULL; + ops->text_op(client, f_out, cmd->pdu_len, buf); free(cmd); break; } case FIO_NET_CMD_DU: - handle_du(client, cmd); + ops->disk_util(client, cmd); free(cmd); break; case FIO_NET_CMD_TS: - handle_ts(cmd); + ops->thread_status(cmd); free(cmd); break; case FIO_NET_CMD_GS: - handle_gs(cmd); + ops->group_stats(cmd); free(cmd); break; case FIO_NET_CMD_ETA: remove_reply_cmd(client, cmd); - handle_eta(client, cmd); + ops->eta(client, cmd); free(cmd); break; case FIO_NET_CMD_PROBE: remove_reply_cmd(client, cmd); - handle_probe(client, cmd); + ops->probe(client, cmd); free(cmd); break; case FIO_NET_CMD_RUN: @@ -980,7 +1002,7 @@ static int fio_client_timed_out(void) return ret; } -int fio_handle_clients(void) +int fio_handle_clients(struct client_ops *ops) { struct pollfd *pfds; int i, ret = 0, retval = 0; @@ -1048,7 +1070,7 @@ int fio_handle_clients(void) log_err("fio: unknown client fd %d\n", pfds[i].fd); continue; } - if (!handle_client(client)) { + if (!handle_client(client, ops)) { log_info("client: host=%s disconnected\n", client->hostname); remove_client(client); diff --git a/client.h b/client.h new file mode 100644 index 00000000..b91b7421 --- /dev/null +++ b/client.h @@ -0,0 +1,32 @@ +#ifndef CLIENT_H +#define CLIENT_H + +struct fio_client; +struct fio_net_cmd; + +typedef void (*client_text_op_func)(struct fio_client *client, + FILE *f, __u16 pdu_len, const char *buf); + +typedef void (*client_disk_util_op_func)(struct fio_client *client, struct fio_net_cmd *cmd); + +typedef void (*client_thread_status_op)(struct fio_net_cmd *cmd); + +typedef void (*client_group_stats_op)(struct fio_net_cmd *cmd); + +typedef void (*client_eta_op)(struct fio_client *client, struct fio_net_cmd *cmd); + +typedef void (*client_probe_op)(struct fio_client *client, struct fio_net_cmd *cmd); + +struct client_ops { + client_text_op_func text_op; + client_disk_util_op_func disk_util; + client_thread_status_op thread_status; + client_group_stats_op group_stats; + client_eta_op eta; + client_probe_op probe; +}; + +extern struct client_ops fio_client_ops; + +#endif + diff --git a/fio.c b/fio.c index be60c5ff..2ca4fe69 100644 --- a/fio.c +++ b/fio.c @@ -34,6 +34,7 @@ #include "profile.h" #include "lib/rand.h" #include "memalign.h" +#include "client.h" #include "server.h" unsigned long page_mask; @@ -105,7 +106,7 @@ int main(int argc, char *argv[], char *envp[]) return 1; if (nr_clients) - return fio_handle_clients(); + return fio_handle_clients(&fio_client_ops); else return fio_backend(); } diff --git a/fio.h b/fio.h index 5c912d0a..3efda51a 100644 --- a/fio.h +++ b/fio.h @@ -36,6 +36,7 @@ struct thread_data; #include "gettime.h" #include "lib/getopt.h" #include "lib/rand.h" +#include "client.h" #include "server.h" #include "stat.h" #include "flow.h" diff --git a/server.h b/server.h index 27da94f2..f8507731 100644 --- a/server.h +++ b/server.h @@ -123,7 +123,7 @@ extern void fio_server_idle_loop(void); extern int fio_clients_connect(void); extern int fio_clients_send_ini(const char *); -extern int fio_handle_clients(void); +extern int fio_handle_clients(struct client_ops *ops); extern int fio_client_add(const char *, void **); extern void fio_client_add_cmd_option(void *, const char *);