X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=client.c;h=af3407cefe95a55fc211d5deb92bd4687fd922fc;hb=e13c3b50a1aa156223b5b9d20ed3d38dd4292479;hp=96b844cb6a825433ae55f48e18c7e6d09aa15207;hpb=ca09be4b1a8e97f0bca5cfbddb399899cf561eaa;p=fio.git diff --git a/client.c b/client.c index 96b844cb..af3407ce 100644 --- a/client.c +++ b/client.c @@ -62,6 +62,8 @@ static struct json_object *root = NULL; static struct json_array *clients_array = NULL; static struct json_array *du_array = NULL; +static int error_clients; + #define FIO_CLIENT_HASH_BITS 7 #define FIO_CLIENT_HASH_SZ (1 << FIO_CLIENT_HASH_BITS) #define FIO_CLIENT_HASH_MASK (FIO_CLIENT_HASH_SZ - 1) @@ -89,6 +91,30 @@ static void fio_init fio_client_hash_init(void) INIT_FLIST_HEAD(&client_hash[i]); } +static int read_data(int fd, void *data, size_t size) +{ + ssize_t ret; + + while (size) { + ret = read(fd, data, size); + if (ret < 0) { + if (errno == EAGAIN || errno == EINTR) + continue; + break; + } else if (!ret) + break; + else { + data += ret; + size -= ret; + } + } + + if (size) + return EAGAIN; + + return 0; +} + static void fio_client_json_init(void) { if (output_format != FIO_OUTPUT_JSON) @@ -152,6 +178,9 @@ void fio_put_client(struct fio_client *client) if (!client->did_stat) sum_stat_clients--; + if (client->error) + error_clients++; + free(client); } @@ -356,6 +385,7 @@ static const char *server_name(struct fio_client *client, char *buf, static void probe_client(struct fio_client *client) { struct cmd_client_probe_pdu pdu; + const char *sname; uint64_t tag; char buf[64]; @@ -367,7 +397,9 @@ static void probe_client(struct fio_client *client) pdu.flags = 0; #endif - strcpy((char *) pdu.server, server_name(client, buf, sizeof(buf))); + sname = server_name(client, buf, sizeof(buf)); + memset(pdu.server, 0, sizeof(pdu.server)); + strncpy((char *) pdu.server, sname, sizeof(pdu.server) - 1); fio_net_send_cmd(client->fd, FIO_NET_CMD_PROBE, &pdu, sizeof(pdu), &tag, &client->cmd_list); } @@ -691,21 +723,7 @@ static int __fio_client_send_local_ini(struct fio_client *client, len = sb.st_size; p = buf; - do { - ret = read(fd, p, len); - if (ret > 0) { - len -= ret; - if (!len) - break; - p += ret; - continue; - } else if (!ret) - break; - else if (errno == EAGAIN || errno == EINTR) - continue; - } while (1); - - if (len) { + if (read_data(fd, p, len)) { log_err("fio: failed reading job file %s\n", filename); close(fd); free(pdu); @@ -873,6 +891,10 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) dst->latency_target = le64_to_cpu(src->latency_target); dst->latency_window = le64_to_cpu(src->latency_window); dst->latency_percentile.u.f = fio_uint64_to_double(le64_to_cpu(src->latency_percentile.u.i)); + + 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]); } static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src) @@ -964,14 +986,14 @@ static void convert_agg(struct disk_util_agg *agg) int i; for (i = 0; i < 2; i++) { - agg->ios[i] = le32_to_cpu(agg->ios[i]); - agg->merges[i] = le32_to_cpu(agg->merges[i]); + agg->ios[i] = le64_to_cpu(agg->ios[i]); + agg->merges[i] = le64_to_cpu(agg->merges[i]); agg->sectors[i] = le64_to_cpu(agg->sectors[i]); - agg->ticks[i] = le32_to_cpu(agg->ticks[i]); + agg->ticks[i] = le64_to_cpu(agg->ticks[i]); } - agg->io_ticks = le32_to_cpu(agg->io_ticks); - agg->time_in_queue = le32_to_cpu(agg->time_in_queue); + agg->io_ticks = le64_to_cpu(agg->io_ticks); + agg->time_in_queue = le64_to_cpu(agg->time_in_queue); agg->slavecount = le32_to_cpu(agg->slavecount); agg->max_util.u.f = fio_uint64_to_double(le64_to_cpu(agg->max_util.u.i)); } @@ -981,14 +1003,14 @@ static void convert_dus(struct disk_util_stat *dus) int i; for (i = 0; i < 2; i++) { - dus->s.ios[i] = le32_to_cpu(dus->s.ios[i]); - dus->s.merges[i] = le32_to_cpu(dus->s.merges[i]); + dus->s.ios[i] = le64_to_cpu(dus->s.ios[i]); + dus->s.merges[i] = le64_to_cpu(dus->s.merges[i]); dus->s.sectors[i] = le64_to_cpu(dus->s.sectors[i]); - dus->s.ticks[i] = le32_to_cpu(dus->s.ticks[i]); + dus->s.ticks[i] = le64_to_cpu(dus->s.ticks[i]); } - dus->s.io_ticks = le32_to_cpu(dus->s.io_ticks); - dus->s.time_in_queue = le32_to_cpu(dus->s.time_in_queue); + dus->s.io_ticks = le64_to_cpu(dus->s.io_ticks); + dus->s.time_in_queue = le64_to_cpu(dus->s.time_in_queue); dus->s.msec = le64_to_cpu(dus->s.msec); } @@ -1330,28 +1352,6 @@ static void sendfile_reply(int fd, struct cmd_sendfile_reply *rep, fio_net_send_cmd(fd, FIO_NET_CMD_SENDFILE, rep, size, &tag, NULL); } -static int read_data(int fd, void *data, size_t size) -{ - ssize_t ret; - - while (size) { - ret = read(fd, data, size); - if (ret < 0) - return errno; - else if (!ret) - break; - else { - data += ret; - size -= ret; - } - } - - if (size) - return EAGAIN; - - return 0; -} - static int send_file(struct fio_client *client, struct cmd_sendfile *pdu, uint64_t tag) { @@ -1497,6 +1497,7 @@ int fio_handle_client(struct fio_client *client) char buf[64]; __verify_save_state(pdu, server_name(client, buf, sizeof(buf))); + exec_trigger(trigger_cmd); break; } case FIO_NET_CMD_SENDFILE: { @@ -1624,6 +1625,7 @@ static int fio_check_clients_timed_out(void) else log_err("fio: client %s timed out\n", client->hostname); + client->error = ETIMEDOUT; remove_client(client); ret = 1; } @@ -1717,5 +1719,5 @@ int fio_handle_clients(struct client_ops *ops) fio_client_json_fini(); free(pfds); - return retval; + return retval || error_clients; }