Update compression documentation
[fio.git] / client.c
index 7a986aae8110942f2cf175015e24f7f2447d3add..779fb9d7f8d04f53bd56388d13f869d0760980e5 100644 (file)
--- a/client.c
+++ b/client.c
@@ -885,6 +885,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
                convert_io_stat(&dst->slat_stat[i], &src->slat_stat[i]);
                convert_io_stat(&dst->lat_stat[i], &src->lat_stat[i]);
                convert_io_stat(&dst->bw_stat[i], &src->bw_stat[i]);
+               convert_io_stat(&dst->iops_stat[i], &src->iops_stat[i]);
        }
 
        dst->usr_time           = le64_to_cpu(src->usr_time);
@@ -892,7 +893,8 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
        dst->ctx                = le64_to_cpu(src->ctx);
        dst->minf               = le64_to_cpu(src->minf);
        dst->majf               = le64_to_cpu(src->majf);
-       dst->clat_percentiles   = le64_to_cpu(src->clat_percentiles);
+       dst->clat_percentiles   = le32_to_cpu(src->clat_percentiles);
+       dst->lat_percentiles    = le32_to_cpu(src->lat_percentiles);
        dst->percentile_precision = le64_to_cpu(src->percentile_precision);
 
        for (i = 0; i < FIO_IO_U_LIST_MAX_LEN; i++) {
@@ -1310,14 +1312,16 @@ static void client_flush_hist_samples(FILE *f, int hist_coarseness, void *sample
 static int fio_client_handle_iolog(struct fio_client *client,
                                   struct fio_net_cmd *cmd)
 {
-       struct cmd_iolog_pdu *pdu;
+       struct cmd_iolog_pdu *pdu = NULL;
        bool store_direct;
-       char *log_pathname;
+       char *log_pathname = NULL;
+       int ret = 0;
 
        pdu = convert_iolog(cmd, &store_direct);
        if (!pdu) {
                log_err("fio: failed converting IO log\n");
-               return 1;
+               ret = 1;
+               goto out;
        }
 
         /* allocate buffer big enough for next sprintf() call */
@@ -1325,7 +1329,8 @@ static int fio_client_handle_iolog(struct fio_client *client,
                        strlen(client->hostname));
        if (!log_pathname) {
                log_err("fio: memory allocation of unique pathname failed\n");
-               return -1;
+               ret = -1;
+               goto out;
        }
        /* generate a unique pathname for the log file using hostname */
        sprintf(log_pathname, "%s.%s", pdu->name, client->hostname);
@@ -1340,7 +1345,8 @@ static int fio_client_handle_iolog(struct fio_client *client,
                if (fd < 0) {
                        log_err("fio: open log %s: %s\n",
                                log_pathname, strerror(errno));
-                       return 1;
+                       ret = 1;
+                       goto out;
                }
 
                sz = cmd->pdu_len - sizeof(*pdu);
@@ -1349,17 +1355,19 @@ static int fio_client_handle_iolog(struct fio_client *client,
 
                if (ret != sz) {
                        log_err("fio: short write on compressed log\n");
-                       return 1;
+                       ret = 1;
+                       goto out;
                }
 
-               return 0;
+               ret = 0;
        } else {
                FILE *f;
                f = fopen((const char *) log_pathname, "w");
                if (!f) {
                        log_err("fio: fopen log %s : %s\n",
                                log_pathname, strerror(errno));
-                       return 1;
+                       ret = 1;
+                       goto out;
                }
 
                if (pdu->log_type == IO_LOG_TYPE_HIST) {
@@ -1370,8 +1378,17 @@ static int fio_client_handle_iolog(struct fio_client *client,
                                        pdu->nr_samples * sizeof(struct io_sample));
                }
                fclose(f);
-               return 0;
+               ret = 0;
        }
+
+out:
+       if (pdu && pdu != (void *) cmd->payload)
+               free(pdu);
+
+       if (log_pathname)
+               free(log_pathname);
+
+       return ret;
 }
 
 static void handle_probe(struct fio_client *client, struct fio_net_cmd *cmd)
@@ -1452,7 +1469,7 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd,
        z_stream stream;
        uint32_t nr_samples;
        size_t total;
-       void *p;
+       char *p;
 
        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
@@ -1478,10 +1495,10 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd,
 
        memcpy(ret, pdu, sizeof(*pdu));
 
-       p = (void *) ret + sizeof(*pdu);
+       p = (char *) ret + sizeof(*pdu);
 
        stream.avail_in = cmd->pdu_len - sizeof(*pdu);
-       stream.next_in = (void *) pdu + sizeof(*pdu);
+       stream.next_in = (void *)((char *) pdu + sizeof(*pdu));
        while (stream.avail_in) {
                unsigned int this_chunk = 65536;
                unsigned int this_len;
@@ -1491,7 +1508,7 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd,
                        this_chunk = total;
 
                stream.avail_out = this_chunk;
-               stream.next_out = p;
+               stream.next_out = (void *)p;
                err = inflate(&stream, Z_NO_FLUSH);
                /* may be Z_OK, or Z_STREAM_END */
                if (err < 0) {
@@ -1566,7 +1583,7 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd,
 
                s = __get_sample(samples, ret->log_offset, i);
                if (ret->log_type == IO_LOG_TYPE_HIST)
-                       s = (struct io_sample *)((void *)s + sizeof(struct io_u_plat_entry) * i);
+                       s = (struct io_sample *)((char *)s + sizeof(struct io_u_plat_entry) * i);
 
                s->time         = le64_to_cpu(s->time);
                s->data.val     = le64_to_cpu(s->data.val);
@@ -1580,7 +1597,7 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd,
                }
 
                if (ret->log_type == IO_LOG_TYPE_HIST) {
-                       s->data.plat_entry = (struct io_u_plat_entry *)(((void *)s) + sizeof(*s));
+                       s->data.plat_entry = (struct io_u_plat_entry *)(((char *)s) + sizeof(*s));
                        s->data.plat_entry->list.next = NULL;
                        s->data.plat_entry->list.prev = NULL;
                }
@@ -1847,10 +1864,12 @@ static void request_client_etas(struct client_ops *ops)
 static int handle_cmd_timeout(struct fio_client *client,
                              struct fio_net_cmd_reply *reply)
 {
+       uint16_t reply_opcode = reply->opcode;
+
        flist_del(&reply->list);
        free(reply);
 
-       if (reply->opcode != FIO_NET_CMD_SEND_ETA)
+       if (reply_opcode != FIO_NET_CMD_SEND_ETA)
                return 1;
 
        log_info("client <%s>: timeout on SEND_ETA\n", client->hostname);