X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=client.c;h=bf09d7ef4dadad7a343ecda88a80aaca4e2053fe;hb=24baa4c70c850d4c1703ae8f4e2b35fc5c5a57ea;hp=8c85d2b5c6a673f433f2930fbb41c6a70e8b354b;hpb=c2cb68696255a8fda93043a1f2219b60af614549;p=fio.git diff --git a/client.c b/client.c index 8c85d2b5..bf09d7ef 100644 --- a/client.c +++ b/client.c @@ -37,6 +37,7 @@ struct fio_client { char *hostname; int port; int fd; + unsigned int refs; char *name; @@ -57,6 +58,9 @@ struct fio_client { uint16_t argc; char **argv; + + char **ini_file; + unsigned int nr_ini_file; }; static struct timeval eta_tv; @@ -119,8 +123,10 @@ static struct fio_client *find_client_by_fd(int fd) flist_for_each(entry, &client_hash[bucket]) { client = flist_entry(entry, struct fio_client, hash_list); - if (client->fd == fd) + if (client->fd == fd) { + client->refs++; return client; + } } return NULL; @@ -128,6 +134,11 @@ static struct fio_client *find_client_by_fd(int fd) static void remove_client(struct fio_client *client) { + assert(client->refs); + + if (--client->refs) + return; + dprint(FD_NET, "client: removed <%s>\n", client->hostname); flist_del(&client->list); @@ -143,12 +154,21 @@ static void remove_client(struct fio_client *client) free(client->argv); if (client->name) free(client->name); + while (client->nr_ini_file) + free(client->ini_file[--client->nr_ini_file]); + if (client->ini_file) + free(client->ini_file); free(client); nr_clients--; sum_stat_clients--; } +static void put_client(struct fio_client *client) +{ + remove_client(client); +} + static void __fio_client_add_cmd_option(struct fio_client *client, const char *opt) { @@ -180,6 +200,19 @@ void fio_client_add_cmd_option(void *cookie, const char *opt) } } +void fio_client_add_ini_file(void *cookie, const char *ini_file) +{ + struct fio_client *client = cookie; + size_t new_size; + + dprint(FD_NET, "client <%s>: add ini %s\n", client->hostname, ini_file); + + new_size = (client->nr_ini_file + 1) * sizeof(char *); + client->ini_file = realloc(client->ini_file, new_size); + client->ini_file[client->nr_ini_file] = strdup(ini_file); + client->nr_ini_file++; +} + int fio_client_add(const char *hostname, void **cookie) { struct fio_client *existing = *cookie; @@ -215,6 +248,7 @@ int fio_client_add(const char *hostname, void **cookie) return -1; client->fd = -1; + client->refs = 1; __fio_client_add_cmd_option(client, "fio"); @@ -330,6 +364,11 @@ static void sig_int(int sig) fio_clients_terminate(); } +static void sig_show_status(int sig) +{ + show_running_run_stats(); +} + static void client_signal_handler(void) { struct sigaction act; @@ -343,6 +382,19 @@ static void client_signal_handler(void) act.sa_handler = sig_int; act.sa_flags = SA_RESTART; sigaction(SIGTERM, &act, NULL); + +/* Windows uses SIGBREAK as a quit signal from other applications */ +#ifdef WIN32 + memset(&act, 0, sizeof(act)); + act.sa_handler = sig_int; + act.sa_flags = SA_RESTART; + sigaction(SIGBREAK, &act, NULL); +#endif + + memset(&act, 0, sizeof(act)); + act.sa_handler = sig_show_status; + act.sa_flags = SA_RESTART; + sigaction(SIGUSR1, &act, NULL); } static void probe_client(struct fio_client *client) @@ -497,7 +549,18 @@ int fio_clients_send_ini(const char *filename) flist_for_each_safe(entry, tmp, &client_list) { client = flist_entry(entry, struct fio_client, list); - if (fio_client_send_ini(client, filename)) + if (client->nr_ini_file) { + int i; + + for (i = 0; i < client->nr_ini_file; i++) { + const char *ini = client->ini_file[i]; + + if (fio_client_send_ini(client, ini)) { + remove_client(client); + break; + } + } + } else if (!filename || fio_client_send_ini(client, filename)) remove_client(client); client->sent_job = 1; @@ -678,7 +741,7 @@ static void handle_du(struct fio_client *client, struct fio_net_cmd *cmd) log_info("\nDisk stats (read/write):\n"); } - print_disk_util(&du->dus, &du->agg, terse_output); + print_disk_util(&du->dus, &du->agg, output_format == FIO_OUTPUT_TERSE); } static void convert_jobs_eta(struct jobs_eta *je) @@ -701,6 +764,7 @@ static void convert_jobs_eta(struct jobs_eta *je) je->elapsed_sec = le64_to_cpu(je->elapsed_sec); je->eta_sec = le64_to_cpu(je->eta_sec); + je->is_pow2 = le32_to_cpu(je->is_pow2); } static void sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je) @@ -792,9 +856,9 @@ static void handle_probe(struct fio_client *client, struct fio_net_cmd *cmd) sprintf(bit, "%d-bit", probe->bpp * 8); - log_info("hostname=%s, be=%u, %s, os=%s, arch=%s, fio=%u.%u.%u\n", + log_info("hostname=%s, be=%u, %s, os=%s, arch=%s, fio=%s\n", probe->hostname, probe->bigendian, bit, os, arch, - probe->fio_major, probe->fio_minor, probe->fio_patch); + probe->fio_version); if (!client->name) client->name = strdup((char *) probe->hostname); @@ -1055,6 +1119,7 @@ int fio_handle_clients(void) retval = 1; } else if (client->error) retval = 1; + put_client(client); } }