X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=client.c;h=4b77f6920f2236dd67ab03492e3056d694289587;hp=97bfc898f9a54afb3468503e683f4fffc7447b2e;hb=28d3ab07f7c68afe9ad3b07bb9c288f3e94957da;hpb=d05c4a03365f1b677c05840865e67ffaf2c5b05b diff --git a/client.c b/client.c index 97bfc898..4b77f692 100644 --- a/client.c +++ b/client.c @@ -87,31 +87,38 @@ static void remove_client(struct fio_client *client) free(client); } -static void __fio_client_add_cmd_option(struct fio_client *client, - const char *opt) +static int __fio_client_add_cmd_option(struct fio_client *client, + const char *opt) { int index; + if (client->argc == FIO_NET_CMD_JOBLINE_ARGV) { + log_err("fio: max cmd line number reached.\n"); + log_err("fio: cmd line <%s> has been ignored.\n", opt); + return 1; + } + index = client->argc++; client->argv = realloc(client->argv, sizeof(char *) * client->argc); client->argv[index] = strdup(opt); dprint(FD_NET, "client: add cmd %d: %s\n", index, opt); + return 0; } -void fio_client_add_cmd_option(const char *hostname, const char *opt) +int fio_client_add_cmd_option(const char *hostname, const char *opt) { struct fio_client *client; if (!hostname || !opt) - return; + return 0; client = find_client_by_name(hostname); if (!client) { log_err("fio: unknown client %s\n", hostname); - return; + return 1; } - __fio_client_add_cmd_option(client, opt); + return __fio_client_add_cmd_option(client, opt); } void fio_client_add(const char *hostname) @@ -330,9 +337,12 @@ static void convert_io_stat(struct io_stat *dst, struct io_stat *src) dst->max_val = le64_to_cpu(src->max_val); dst->min_val = le64_to_cpu(src->min_val); dst->samples = le64_to_cpu(src->samples); - /* FIXME */ - dst->mean = __le64_to_cpu(src->mean); - dst->S = __le64_to_cpu(src->S); + + /* + * Floats arrive as IEEE 754 encoded uint64_t, convert back to double + */ + dst->mean.u.f = fio_uint64_to_double(le64_to_cpu(dst->mean.u.i)); + dst->S.u.f = fio_uint64_to_double(le64_to_cpu(dst->S.u.i)); } static void convert_ts(struct thread_stat *dst, struct thread_stat *src) @@ -357,7 +367,13 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) dst->minf = le64_to_cpu(src->minf); dst->majf = le64_to_cpu(src->majf); dst->clat_percentiles = le64_to_cpu(src->clat_percentiles); - dst->percentile_list = NULL; + + for (i = 0; i < FIO_IO_U_LIST_MAX_LEN; i++) { + fio_fp64_t *fps = &src->percentile_list[i]; + fio_fp64_t *fpd = &dst->percentile_list[i]; + + fpd->u.f = fio_uint64_to_double(le64_to_cpu(fps->u.i)); + } for (i = 0; i < FIO_IO_U_MAP_NR; i++) { dst->io_u_map[i] = le32_to_cpu(src->io_u_map[i]); @@ -466,13 +482,15 @@ static void handle_probe(struct fio_net_cmd *cmd) static int handle_client(struct fio_client *client, int one) { struct fio_net_cmd *cmd; - int done = 0; + int done = 0, did_cmd = 0; dprint(FD_NET, "client: handle %s\n", client->hostname); while ((cmd = fio_net_recv_cmd(client->fd, 1)) != NULL) { - dprint(FD_NET, "%s: got cmd op %d\n", client->hostname, - cmd->opcode); + did_cmd++; + + dprint(FD_NET, "client: got cmd op %d from %s\n", + cmd->opcode, client->hostname); switch (cmd->opcode) { case FIO_NET_CMD_QUIT: @@ -482,10 +500,11 @@ static int handle_client(struct fio_client *client, int one) break; case FIO_NET_CMD_TEXT: { const char *buf = (const char *) cmd->payload; + int fio_unused ret; if (!client->skip_newline) - fprintf(f_out, "Client <%s>: ", client->hostname); - fwrite(buf, cmd->pdu_len, 1, f_out); + fprintf(f_out, "<%s> ", client->hostname); + ret = fwrite(buf, cmd->pdu_len, 1, f_out); fflush(f_out); client->skip_newline = strchr(buf, '\n') == NULL; free(cmd); @@ -525,7 +544,7 @@ static int handle_client(struct fio_client *client, int one) break; } - return 0; + return did_cmd; } int fio_handle_clients(void) @@ -569,7 +588,11 @@ int fio_handle_clients(void) log_err("fio: unknown client\n"); continue; } - handle_client(client, 0); + if (!handle_client(client, 0)) { + log_info("client: host=%s disconnected\n", + client->hostname); + remove_client(client); + } } }