Add missing trailing \n in log_err/info()
[fio.git] / client.c
index 3456665009b8fb9fc65ad98c7235431774809820..7934661cae1ec73e32491262fcdec854c48b9014 100644 (file)
--- a/client.c
+++ b/client.c
@@ -946,6 +946,21 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src)
        dst->nr_block_infos     = le64_to_cpu(src->nr_block_infos);
        for (i = 0; i < dst->nr_block_infos; i++)
                dst->block_infos[i] = le32_to_cpu(src->block_infos[i]);
+
+       dst->ss_dur             = le64_to_cpu(src->ss_dur);
+       dst->ss_state           = le32_to_cpu(src->ss_state);
+       dst->ss_head            = le32_to_cpu(src->ss_head);
+       dst->ss_limit.u.f       = fio_uint64_to_double(le64_to_cpu(src->ss_limit.u.i));
+       dst->ss_slope.u.f       = fio_uint64_to_double(le64_to_cpu(src->ss_slope.u.i));
+       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) {
+               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]);
+               }
+       }
 }
 
 static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
@@ -957,7 +972,7 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src)
                dst->min_run[i]         = le64_to_cpu(src->min_run[i]);
                dst->max_bw[i]          = le64_to_cpu(src->max_bw[i]);
                dst->min_bw[i]          = le64_to_cpu(src->min_bw[i]);
-               dst->io_kb[i]           = le64_to_cpu(src->io_kb[i]);
+               dst->iobytes[i]         = le64_to_cpu(src->iobytes[i]);
                dst->agg[i]             = le64_to_cpu(src->agg[i]);
        }
 
@@ -1135,11 +1150,11 @@ static void convert_jobs_eta(struct jobs_eta *je)
        je->files_open          = le32_to_cpu(je->files_open);
 
        for (i = 0; i < DDIR_RWDIR_CNT; i++) {
-               je->m_rate[i]   = le32_to_cpu(je->m_rate[i]);
-               je->t_rate[i]   = le32_to_cpu(je->t_rate[i]);
+               je->m_rate[i]   = le64_to_cpu(je->m_rate[i]);
+               je->t_rate[i]   = le64_to_cpu(je->t_rate[i]);
                je->m_iops[i]   = le32_to_cpu(je->m_iops[i]);
                je->t_iops[i]   = le32_to_cpu(je->t_iops[i]);
-               je->rate[i]     = le32_to_cpu(je->rate[i]);
+               je->rate[i]     = le64_to_cpu(je->rate[i]);
                je->iops[i]     = le32_to_cpu(je->iops[i]);
        }
 
@@ -1183,7 +1198,7 @@ void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je)
        strcpy((char *) dst->run_str, (char *) je->run_str);
 }
 
-static void remove_reply_cmd(struct fio_client *client, struct fio_net_cmd *cmd)
+static bool remove_reply_cmd(struct fio_client *client, struct fio_net_cmd *cmd)
 {
        struct fio_net_cmd_reply *reply = NULL;
        struct flist_head *entry;
@@ -1199,12 +1214,13 @@ static void remove_reply_cmd(struct fio_client *client, struct fio_net_cmd *cmd)
 
        if (!reply) {
                log_err("fio: client: unable to find matching tag (%llx)\n", (unsigned long long) cmd->tag);
-               return;
+               return false;
        }
 
        flist_del(&reply->list);
        cmd->tag = reply->saved_tag;
        free(reply);
+       return true;
 }
 
 int fio_client_wait_for_reply(struct fio_client *client, uint64_t tag)
@@ -1275,7 +1291,7 @@ static void client_flush_hist_samples(FILE *f, int hist_coarseness, void *sample
                s = (struct io_sample *)((char *)__get_sample(samples, log_offset, i) +
                        i * sizeof(struct io_u_plat_entry));
 
-               entry = s->plat_entry;
+               entry = s->data.plat_entry;
                io_u_plat = entry->io_u_plat;
 
                fprintf(f, "%lu, %u, %u, ", (unsigned long) s->time,
@@ -1294,6 +1310,7 @@ static int fio_client_handle_iolog(struct fio_client *client,
 {
        struct cmd_iolog_pdu *pdu;
        bool store_direct;
+       char *log_pathname;
 
        pdu = convert_iolog(cmd, &store_direct);
        if (!pdu) {
@@ -1301,15 +1318,26 @@ static int fio_client_handle_iolog(struct fio_client *client,
                return 1;
        }
 
+        /* allocate buffer big enough for next sprintf() call */
+       log_pathname = malloc(10 + strlen((char *)pdu->name) +
+                       strlen(client->hostname));
+       if (!log_pathname) {
+               log_err("fio: memory allocation of unique pathname failed\n");
+               return -1;
+       }
+       /* generate a unique pathname for the log file using hostname */
+       sprintf(log_pathname, "%s.%s", pdu->name, client->hostname);
+
        if (store_direct) {
                ssize_t ret;
                size_t sz;
                int fd;
 
-               fd = open((const char *) pdu->name,
+               fd = open((const char *) log_pathname,
                                O_WRONLY | O_CREAT | O_TRUNC, 0644);
                if (fd < 0) {
-                       log_err("fio: open log: %s\n", strerror(errno));
+                       log_err("fio: open log %s: %s\n",
+                               log_pathname, strerror(errno));
                        return 1;
                }
 
@@ -1325,10 +1353,10 @@ static int fio_client_handle_iolog(struct fio_client *client,
                return 0;
        } else {
                FILE *f;
-
-               f = fopen((const char *) pdu->name, "w");
+               f = fopen((const char *) log_pathname, "w");
                if (!f) {
-                       log_err("fio: fopen log: %s\n", strerror(errno));
+                       log_err("fio: fopen log %s : %s\n",
+                               log_pathname, strerror(errno));
                        return 1;
                }
 
@@ -1539,7 +1567,7 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd,
                        s = (struct io_sample *)((void *)s + sizeof(struct io_u_plat_entry) * i);
 
                s->time         = le64_to_cpu(s->time);
-               s->val          = le64_to_cpu(s->val);
+               s->data.val     = le64_to_cpu(s->data.val);
                s->__ddir       = le32_to_cpu(s->__ddir);
                s->bs           = le32_to_cpu(s->bs);
 
@@ -1550,9 +1578,9 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd,
                }
 
                if (ret->log_type == IO_LOG_TYPE_HIST) {
-                       s->plat_entry = (struct io_u_plat_entry *)(((void *)s) + sizeof(*s));
-                       s->plat_entry->list.next = NULL;
-                       s->plat_entry->list.prev = NULL;
+                       s->data.plat_entry = (struct io_u_plat_entry *)(((void *)s) + sizeof(*s));
+                       s->data.plat_entry->list.next = NULL;
+                       s->data.plat_entry->list.prev = NULL;
                }
        }
 
@@ -1604,6 +1632,7 @@ int fio_handle_client(struct fio_client *client)
 {
        struct client_ops *ops = client->ops;
        struct fio_net_cmd *cmd;
+       int size;
 
        dprint(FD_NET, "client: handle %s\n", client->hostname);
 
@@ -1636,6 +1665,15 @@ int fio_handle_client(struct fio_client *client)
        case FIO_NET_CMD_TS: {
                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) {
+                       dprint(FD_NET, "client: received steadystate ring buffers\n");
+
+                       size = le64_to_cpu(p->ts.ss_dur);
+                       p->ts.ss_iops_data = (uint64_t *) ((struct cmd_ts_pdu *)cmd->payload + 1);
+                       p->ts.ss_bw_data = p->ts.ss_iops_data + size;
+               }
+
                convert_ts(&p->ts, &p->ts);
                convert_gs(&p->rs, &p->rs);
 
@@ -1653,7 +1691,8 @@ int fio_handle_client(struct fio_client *client)
        case FIO_NET_CMD_ETA: {
                struct jobs_eta *je = (struct jobs_eta *) cmd->payload;
 
-               remove_reply_cmd(client, cmd);
+               if (!remove_reply_cmd(client, cmd))
+                       break;
                convert_jobs_eta(je);
                handle_eta(client, cmd);
                break;