client: add a newline after terse disk util
[fio.git] / client.c
index 62823751b4421860e6b747f78b9bcd0fd59028a0..43cfbd43b9d3eb1252a1ce9674afee4a6be69cf8 100644 (file)
--- 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;
 }
@@ -996,6 +1001,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 +1040,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 +1104,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 +1210,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 +1220,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 +1496,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 +1602,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 +2133,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);