X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=client.c;h=e0047af06a3e97f6bdd57caeb4b3ebbd823956cd;hp=62823751b4421860e6b747f78b9bcd0fd59028a0;hb=da92f848c5e0d29db6dda12c4c97bf1338a01128;hpb=7c6686fcd9dc145c4dbab907ab29d2336f0ba935 diff --git a/client.c b/client.c index 62823751..e0047af0 100644 --- a/client.c +++ b/client.c @@ -59,6 +59,7 @@ struct group_run_stats client_gs; int sum_stat_clients; static int sum_stat_nr; +static struct buf_output allclients; static struct json_object *root = NULL; static struct json_object *job_opt_object = NULL; static struct json_array *clients_array = NULL; @@ -200,17 +201,21 @@ static void fio_client_json_fini(void) { struct buf_output out; - if (!(output_format & FIO_OUTPUT_JSON)) + if (!root) return; buf_output_init(&out); + __log_buf(&out, "\n"); json_print_object(root, &out); __log_buf(&out, "\n"); log_info_buf(out.buf, out.buflen); + buf_output_free(&out); + json_free_object(root); root = NULL; + job_opt_object = NULL; clients_array = NULL; du_array = NULL; } @@ -515,7 +520,7 @@ static void probe_client(struct fio_client *client) sname = server_name(client, buf, sizeof(buf)); memset(pdu.server, 0, sizeof(pdu.server)); - strncpy((char *) pdu.server, sname, sizeof(pdu.server) - 1); + snprintf((char *) pdu.server, sizeof(pdu.server), "%s", sname); fio_net_send_cmd(client->fd, FIO_NET_CMD_PROBE, &pdu, sizeof(pdu), &tag, &client->cmd_list); } @@ -569,7 +574,8 @@ static int fio_client_connect_sock(struct fio_client *client) memset(addr, 0, sizeof(*addr)); addr->sun_family = AF_UNIX; - strncpy(addr->sun_path, client->hostname, sizeof(addr->sun_path) - 1); + snprintf(addr->sun_path, sizeof(addr->sun_path), "%s", + client->hostname); fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { @@ -996,6 +1002,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) dst->total_submit = le64_to_cpu(src->total_submit); dst->total_complete = le64_to_cpu(src->total_complete); + dst->nr_zone_resets = le64_to_cpu(src->nr_zone_resets); for (i = 0; i < DDIR_RWDIR_CNT; i++) { dst->io_bytes[i] = le64_to_cpu(src->io_bytes[i]); @@ -1034,6 +1041,9 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) dst->ss_bw_data[i] = le64_to_cpu(src->ss_bw_data[i]); } } + + dst->cachehit = le64_to_cpu(src->cachehit); + dst->cachemiss = le64_to_cpu(src->cachemiss); } static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src) @@ -1095,7 +1105,7 @@ static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd) if (++sum_stat_nr == sum_stat_clients) { strcpy(client_ts.name, "All clients"); - tsobj = show_thread_status(&client_ts, &client_gs, NULL, &client->buf); + tsobj = show_thread_status(&client_ts, &client_gs, NULL, &allclients); if (tsobj) { json_object_add_client_info(tsobj, client); json_array_add_value_object(clients_array, tsobj); @@ -1201,11 +1211,8 @@ static void handle_du(struct fio_client *client, struct fio_net_cmd *cmd) { struct cmd_du_pdu *du = (struct cmd_du_pdu *) cmd->payload; - if (!client->disk_stats_shown) { + if (!client->disk_stats_shown) client->disk_stats_shown = true; - if (!(output_format & FIO_OUTPUT_JSON)) - __log_buf(&client->buf, "\nDisk stats (read/write):\n"); - } if (output_format & FIO_OUTPUT_JSON) { struct json_object *duobj; @@ -1214,10 +1221,14 @@ static void handle_du(struct fio_client *client, struct fio_net_cmd *cmd) duobj = json_array_last_value_object(du_array); json_object_add_client_info(duobj, client); } - if (output_format & FIO_OUTPUT_TERSE) - print_disk_util(&du->dus, &du->agg, 1, &client->buf); - if (output_format & FIO_OUTPUT_NORMAL) + if (output_format & FIO_OUTPUT_NORMAL) { + __log_buf(&client->buf, "\nDisk stats (read/write):\n"); print_disk_util(&du->dus, &du->agg, 0, &client->buf); + } + if (output_format & FIO_OUTPUT_TERSE && terse_version >= 3) { + print_disk_util(&du->dus, &du->agg, 1, &client->buf); + __log_buf(&client->buf, "\n"); + } } static void convert_jobs_eta(struct jobs_eta *je) @@ -1486,10 +1497,11 @@ static void handle_probe(struct fio_client *client, struct fio_net_cmd *cmd) sprintf(bit, "%d-bit", probe->bpp * 8); probe->flags = le64_to_cpu(probe->flags); - if (!(output_format & FIO_OUTPUT_JSON)) + if (output_format & FIO_OUTPUT_NORMAL) { log_info("hostname=%s, be=%u, %s, os=%s, arch=%s, fio=%s, flags=%lx\n", probe->hostname, probe->bigendian, bit, os, arch, probe->fio_version, (unsigned long) probe->flags); + } if (!client->name) client->name = strdup((char *) probe->hostname); @@ -1591,6 +1603,11 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd, err = inflate(&stream, Z_NO_FLUSH); /* may be Z_OK, or Z_STREAM_END */ if (err < 0) { + /* + * Z_STREAM_ERROR and Z_BUF_ERROR can safely be + * ignored */ + if (err == Z_STREAM_ERROR || err == Z_BUF_ERROR) + break; log_err("fio: inflate error %d\n", err); free(ret); ret = NULL; @@ -2117,6 +2134,9 @@ int fio_handle_clients(struct client_ops *ops) } } + log_info_buf(allclients.buf, allclients.buflen); + buf_output_free(&allclients); + fio_client_json_fini(); free(pfds);