X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=client.c;h=410ffb891d4a487515ed396161892d02b7653aad;hp=c61301de99dd2bfbcb9c4d35b91108fa0ba276be;hb=2ed0bd1cefe817d44e2f735e2cea41f6253f571d;hpb=54e62ad43c0432a610b102eb82842176b482d18c diff --git a/client.c b/client.c index c61301de..410ffb89 100644 --- a/client.c +++ b/client.c @@ -226,13 +226,12 @@ static void fio_drain_client_text(struct fio_client *client) if (!cmd) break; - if (cmd->opcode != FIO_NET_CMD_TEXT) { - free(cmd); - continue; + if (cmd->opcode == FIO_NET_CMD_TEXT) { + convert_text(cmd); + client->ops->text(client, cmd); } - convert_text(cmd); - client->ops->text(client, cmd); + free(cmd); } while (1); } @@ -348,7 +347,7 @@ err: return NULL; } -int fio_client_add_ini_file(void *cookie, const char *ini_file, int remote) +int fio_client_add_ini_file(void *cookie, const char *ini_file, bool remote) { struct fio_client *client = cookie; struct client_file *cf; @@ -558,7 +557,7 @@ int fio_client_terminate(struct fio_client *client) return fio_net_send_quit(client->fd); } -void fio_clients_terminate(void) +static void fio_clients_terminate(void) { struct flist_head *entry; struct fio_client *client; @@ -790,7 +789,7 @@ static int __fio_client_send_local_ini(struct fio_client *client, } int fio_client_send_ini(struct fio_client *client, const char *filename, - int remote) + bool remote) { int ret; @@ -817,6 +816,8 @@ int fio_clients_send_ini(const char *filename) struct flist_head *entry, *tmp; flist_for_each_safe(entry, tmp, &client_list) { + bool failed = false; + client = flist_entry(entry, struct fio_client, list); if (client->nr_files) { @@ -828,12 +829,13 @@ int fio_clients_send_ini(const char *filename) cf = &client->files[i]; if (fio_client_send_cf(client, cf)) { + failed = true; remove_client(client); break; } } } - if (client->sent_job) + if (client->sent_job || failed) continue; if (!filename || fio_client_send_ini(client, filename, 0)) remove_client(client); @@ -1249,11 +1251,50 @@ static void handle_eta(struct fio_client *client, struct fio_net_cmd *cmd) fio_client_dec_jobs_eta(eta, client->ops->eta); } +static void client_flush_hist_samples(FILE *f, int hist_coarseness, void *samples, + uint64_t sample_size) +{ + struct io_sample *s; + int log_offset; + uint64_t i, j, nr_samples; + struct io_u_plat_entry *entry; + unsigned int *io_u_plat; + + int stride = 1 << hist_coarseness; + + if (!sample_size) + return; + + s = __get_sample(samples, 0, 0); + log_offset = (s->__ddir & LOG_OFFSET_SAMPLE_BIT) != 0; + + nr_samples = sample_size / __log_entry_sz(log_offset); + + for (i = 0; i < nr_samples; i++) { + + s = (struct io_sample *)((char *)__get_sample(samples, log_offset, i) + + i * sizeof(struct io_u_plat_entry)); + + entry = s->plat_entry; + io_u_plat = entry->io_u_plat; + + fprintf(f, "%lu, %u, %u, ", (unsigned long) s->time, + io_sample_ddir(s), s->bs); + for (j = 0; j < FIO_IO_U_PLAT_NR - stride; j += stride) { + fprintf(f, "%lu, ", hist_sum(j, stride, io_u_plat, NULL)); + } + fprintf(f, "%lu\n", (unsigned long) + hist_sum(FIO_IO_U_PLAT_NR - stride, stride, io_u_plat, NULL)); + + } +} + static int fio_client_handle_iolog(struct fio_client *client, struct fio_net_cmd *cmd) { struct cmd_iolog_pdu *pdu; bool store_direct; + char *log_pathname; pdu = convert_iolog(cmd, &store_direct); if (!pdu) { @@ -1261,15 +1302,24 @@ static int fio_client_handle_iolog(struct fio_client *client, return 1; } + /* generate a unique pathname for the log file using hostname */ + log_pathname = malloc(PATH_MAX+10); + if (!log_pathname) { + log_err("fio: memory allocation of unique pathname failed"); + return -1; + } + 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; } @@ -1285,15 +1335,20 @@ 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; } - flush_samples(f, pdu->samples, - pdu->nr_samples * sizeof(struct io_sample)); + if (pdu->log_type == IO_LOG_TYPE_HIST) { + client_flush_hist_samples(f, pdu->log_hist_coarseness, pdu->samples, + pdu->nr_samples * sizeof(struct io_sample)); + } else { + flush_samples(f, pdu->samples, + pdu->nr_samples * sizeof(struct io_sample)); + } fclose(f); return 0; } @@ -1393,7 +1448,11 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd, */ nr_samples = le64_to_cpu(pdu->nr_samples); - total = nr_samples * __log_entry_sz(le32_to_cpu(pdu->log_offset)); + if (pdu->log_type == IO_LOG_TYPE_HIST) + total = nr_samples * (__log_entry_sz(le32_to_cpu(pdu->log_offset)) + + sizeof(struct io_u_plat_entry)); + else + total = nr_samples * __log_entry_sz(le32_to_cpu(pdu->log_offset)); ret = malloc(total + sizeof(*pdu)); ret->nr_samples = nr_samples; @@ -1461,7 +1520,6 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, return NULL; #endif ret = convert_iolog_gz(cmd, pdu); - printf("compressed iolog, %p\n", ret); if (!ret) { log_err("fio: failed decompressing log\n"); return NULL; @@ -1477,6 +1535,7 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, ret->log_type = le32_to_cpu(ret->log_type); ret->compressed = le32_to_cpu(ret->compressed); ret->log_offset = le32_to_cpu(ret->log_offset); + ret->log_hist_coarseness = le32_to_cpu(ret->log_hist_coarseness); if (*store_direct) return ret; @@ -1486,6 +1545,9 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, struct io_sample *s; 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->time = le64_to_cpu(s->time); s->val = le64_to_cpu(s->val); s->__ddir = le32_to_cpu(s->__ddir); @@ -1496,6 +1558,12 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd, so->offset = le64_to_cpu(so->offset); } + + 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; + } } return ret;