backend: make it clear that we passed 'fd' to the new thread
[fio.git] / client.c
index 281d853f14a771f1ecb36b62fedc5f5ca565848b..3b54bfdfe6e183b5b0428d0b0fb09b2db5e0fe79 100644 (file)
--- a/client.c
+++ b/client.c
@@ -893,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++) {
@@ -941,6 +942,8 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
        dst->kb_base            = le32_to_cpu(src->kb_base);
        dst->unit_base          = le32_to_cpu(src->unit_base);
 
+       dst->sig_figs           = le32_to_cpu(src->sig_figs);
+
        dst->latency_depth      = le32_to_cpu(src->latency_depth);
        dst->latency_target     = le64_to_cpu(src->latency_target);
        dst->latency_window     = le64_to_cpu(src->latency_window);
@@ -958,7 +961,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
        dst->ss_deviation.u.f   = fio_uint64_to_double(le64_to_cpu(src->ss_deviation.u.i));
        dst->ss_criterion.u.f   = fio_uint64_to_double(le64_to_cpu(src->ss_criterion.u.i));
 
-       if (dst->ss_state & __FIO_SS_DATA) {
+       if (dst->ss_state & FIO_SS_DATA) {
                for (i = 0; i < dst->ss_dur; i++ ) {
                        dst->ss_iops_data[i] = le64_to_cpu(src->ss_iops_data[i]);
                        dst->ss_bw_data[i] = le64_to_cpu(src->ss_bw_data[i]);
@@ -981,6 +984,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
 
        dst->kb_base    = le32_to_cpu(src->kb_base);
        dst->unit_base  = le32_to_cpu(src->unit_base);
+       dst->sig_figs   = le32_to_cpu(src->sig_figs);
        dst->groupid    = le32_to_cpu(src->groupid);
        dst->unified_rw_rep     = le32_to_cpu(src->unified_rw_rep);
 }
@@ -1166,6 +1170,7 @@ static void convert_jobs_eta(struct jobs_eta *je)
        je->nr_threads          = le32_to_cpu(je->nr_threads);
        je->is_pow2             = le32_to_cpu(je->is_pow2);
        je->unit_base           = le32_to_cpu(je->unit_base);
+       je->sig_figs            = le32_to_cpu(je->sig_figs);
 }
 
 void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
@@ -1311,14 +1316,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 */
@@ -1326,7 +1333,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);
@@ -1341,7 +1349,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);
@@ -1350,17 +1359,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) {
@@ -1371,8 +1382,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)
@@ -1646,6 +1666,8 @@ int fio_handle_client(struct fio_client *client)
        dprint(FD_NET, "client: got cmd op %s from %s (pdu=%u)\n",
                fio_server_op(cmd->opcode), client->hostname, cmd->pdu_len);
 
+       client->last_cmd = cmd->opcode;
+
        switch (cmd->opcode) {
        case FIO_NET_CMD_QUIT:
                if (ops->quit)
@@ -1669,7 +1691,7 @@ int fio_handle_client(struct fio_client *client)
                struct cmd_ts_pdu *p = (struct cmd_ts_pdu *) cmd->payload;
 
                dprint(FD_NET, "client: ts->ss_state = %u\n", (unsigned int) le32_to_cpu(p->ts.ss_state));
-               if (le32_to_cpu(p->ts.ss_state) & __FIO_SS_DATA) {
+               if (le32_to_cpu(p->ts.ss_state) & FIO_SS_DATA) {
                        dprint(FD_NET, "client: received steadystate ring buffers\n");
 
                        size = le64_to_cpu(p->ts.ss_dur);
@@ -1848,10 +1870,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);
@@ -1918,7 +1942,10 @@ static int fio_check_clients_timed_out(void)
                else
                        log_err("fio: client %s timed out\n", client->hostname);
 
-               client->error = ETIMEDOUT;
+               if (client->last_cmd != FIO_NET_CMD_VTRIGGER)
+                       client->error = ETIMEDOUT;
+               else
+                       log_info("fio: ignoring timeout due to vtrigger\n");
                remove_client(client);
                ret = 1;
        }