X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=client.c;h=edc02a0a13416c04fbb546bf2c05799a440bbf84;hp=af6621dc63d3e0ce7c196e1bd5daa0e747463a7d;hb=fda2cfacd5ebe1212fade95e6286f7e7ec8919f9;hpb=1cb964148482b2d50b1f82966f96545ebeec6428 diff --git a/client.c b/client.c index af6621dc..edc02a0a 100644 --- a/client.c +++ b/client.c @@ -60,7 +60,6 @@ static int sum_stat_nr; static struct json_object *root = NULL; static struct json_array *clients_array = NULL; static struct json_array *du_array = NULL; -static int do_output_all_clients; #define FIO_CLIENT_HASH_BITS 7 #define FIO_CLIENT_HASH_SZ (1 << FIO_CLIENT_HASH_BITS) @@ -141,13 +140,16 @@ void fio_put_client(struct fio_client *client) free(client->argv); if (client->name) free(client->name); - while (client->nr_ini_file) - free(client->ini_file[--client->nr_ini_file]); - if (client->ini_file) - free(client->ini_file); + while (client->nr_files) { + struct client_file *cf = &client->files[--client->nr_files]; + + free(cf->file); + } + if (client->files) + free(client->files); if (!client->did_stat) - sum_stat_clients -= client->nr_stat; + sum_stat_clients--; free(client); } @@ -262,17 +264,29 @@ err: return NULL; } -void fio_client_add_ini_file(void *cookie, const char *ini_file) +int fio_client_add_ini_file(void *cookie, const char *ini_file, int remote) { struct fio_client *client = cookie; + struct client_file *cf; size_t new_size; + void *new_files; + + if (!client) + return 1; dprint(FD_NET, "client <%s>: add ini %s\n", client->hostname, ini_file); - new_size = (client->nr_ini_file + 1) * sizeof(char *); - client->ini_file = realloc(client->ini_file, new_size); - client->ini_file[client->nr_ini_file] = strdup(ini_file); - client->nr_ini_file++; + new_size = (client->nr_files + 1) * sizeof(struct client_file); + new_files = realloc(client->files, new_size); + if (!new_files) + return 1; + + client->files = new_files; + cf = &client->files[client->nr_files]; + cf->file = strdup(ini_file); + cf->remote = remote; + client->nr_files++; + return 0; } int fio_client_add(struct client_ops *ops, const char *hostname, void **cookie) @@ -599,11 +613,34 @@ int fio_start_all_clients(void) return flist_empty(&client_list); } +static int __fio_client_send_remote_ini(struct fio_client *client, + const char *filename) +{ + struct cmd_load_file_pdu *pdu; + size_t p_size; + int ret; + + dprint(FD_NET, "send remote ini %s to %s\n", filename, client->hostname); + + p_size = sizeof(*pdu) + strlen(filename) + 1; + pdu = malloc(p_size); + memset(pdu, 0, p_size); + pdu->name_len = strlen(filename); + strcpy((char *) pdu->file, filename); + pdu->client_type = cpu_to_le16((uint16_t) client->type); + + client->sent_job = 1; + ret = fio_net_send_cmd(client->fd, FIO_NET_CMD_LOAD_FILE, pdu, p_size,NULL, NULL); + free(pdu); + return ret; +} + /* * Send file contents to server backend. We could use sendfile(), but to remain * more portable lets just read/write the darn thing. */ -static int __fio_client_send_ini(struct fio_client *client, const char *filename) +static int __fio_client_send_local_ini(struct fio_client *client, + const char *filename) { struct cmd_job_pdu *pdu; size_t p_size; @@ -668,17 +705,28 @@ static int __fio_client_send_ini(struct fio_client *client, const char *filename return ret; } -int fio_client_send_ini(struct fio_client *client, const char *filename) +int fio_client_send_ini(struct fio_client *client, const char *filename, + int remote) { int ret; - ret = __fio_client_send_ini(client, filename); + if (!remote) + ret = __fio_client_send_local_ini(client, filename); + else + ret = __fio_client_send_remote_ini(client, filename); + if (!ret) client->sent_job = 1; return ret; } +static int fio_client_send_cf(struct fio_client *client, + struct client_file *cf) +{ + return fio_client_send_ini(client, cf->file, cf->remote); +} + int fio_clients_send_ini(const char *filename) { struct fio_client *client; @@ -687,18 +735,23 @@ int fio_clients_send_ini(const char *filename) flist_for_each_safe(entry, tmp, &client_list) { client = flist_entry(entry, struct fio_client, list); - if (client->nr_ini_file) { + if (client->nr_files) { int i; - for (i = 0; i < client->nr_ini_file; i++) { - const char *ini = client->ini_file[i]; + for (i = 0; i < client->nr_files; i++) { + struct client_file *cf; + + cf = &client->files[i]; - if (fio_client_send_ini(client, ini)) { + if (fio_client_send_cf(client, cf)) { remove_client(client); break; } } - } else if (!filename || fio_client_send_ini(client, filename)) + } + if (client->sent_job) + continue; + if (!filename || fio_client_send_ini(client, filename, 0)) remove_client(client); } @@ -780,6 +833,7 @@ static void convert_ts(struct thread_stat *dst, struct thread_stat *src) for (i = 0; i < DDIR_RWDIR_CNT; i++) { dst->total_io_u[i] = le64_to_cpu(src->total_io_u[i]); dst->short_io_u[i] = le64_to_cpu(src->short_io_u[i]); + dst->drop_io_u[i] = le64_to_cpu(src->drop_io_u[i]); } dst->total_submit = le64_to_cpu(src->total_submit); @@ -823,9 +877,11 @@ static void convert_gs(struct group_run_stats *dst, struct group_run_stats *src) } static void json_object_add_client_info(struct json_object *obj, -struct fio_client *client) + struct fio_client *client) { - json_object_add_value_string(obj, "hostname", client->hostname); + const char *hostname = client->hostname ? client->hostname : ""; + + json_object_add_value_string(obj, "hostname", hostname); json_object_add_value_int(obj, "port", client->port); } @@ -841,7 +897,7 @@ static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd) json_array_add_value_object(clients_array, tsobj); } - if (!do_output_all_clients) + if (sum_stat_clients <= 1) return; sum_thread_stats(&client_ts, &p->ts, sum_stat_nr); @@ -899,7 +955,7 @@ static void convert_agg(struct disk_util_agg *agg) agg->io_ticks = le32_to_cpu(agg->io_ticks); agg->time_in_queue = le32_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)); + agg->max_util.u.f = fio_uint64_to_double(le64_to_cpu(agg->max_util.u.i)); } static void convert_dus(struct disk_util_stat *dus) @@ -987,7 +1043,12 @@ void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je) dst->eta_sec = je->eta_sec; dst->nr_threads += je->nr_threads; - /* we need to handle je->run_str too ... */ + + /* + * This wont be correct for multiple strings, but at least it + * works for the basic cases. + */ + strcpy((char *) dst->run_str, (char *) je->run_str); } void fio_client_dec_jobs_eta(struct client_eta *eta, client_eta_op eta_fn) @@ -1098,9 +1159,6 @@ static void handle_start(struct fio_client *client, struct fio_net_cmd *cmd) client->jobs = le32_to_cpu(pdu->jobs); client->nr_stat = le32_to_cpu(pdu->stat_outputs); - if (sum_stat_clients > 1) - do_output_all_clients = 1; - sum_stat_clients += client->nr_stat; } @@ -1149,9 +1207,9 @@ static struct cmd_iolog_pdu *convert_iolog_gz(struct fio_net_cmd *cmd, /* * Get header first, it's not compressed */ - nr_samples = le32_to_cpu(pdu->nr_samples); + nr_samples = le64_to_cpu(pdu->nr_samples); - total = nr_samples * sizeof(struct io_sample); + total = nr_samples * __log_entry_sz(le32_to_cpu(pdu->log_offset)); ret = malloc(total + sizeof(*pdu)); ret->nr_samples = nr_samples; @@ -1201,7 +1259,8 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd) { struct cmd_iolog_pdu *pdu = (struct cmd_iolog_pdu *) cmd->payload; struct cmd_iolog_pdu *ret; - int i; + uint64_t i; + void *samples; /* * Convert if compressed and we support it. If it's not @@ -1220,18 +1279,27 @@ static struct cmd_iolog_pdu *convert_iolog(struct fio_net_cmd *cmd) } else ret = pdu; + ret->nr_samples = le64_to_cpu(ret->nr_samples); ret->thread_number = le32_to_cpu(ret->thread_number); - ret->nr_samples = le32_to_cpu(ret->nr_samples); 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); + samples = &ret->samples[0]; for (i = 0; i < ret->nr_samples; i++) { - struct io_sample *s = &ret->samples[i]; + struct io_sample *s; + + s = __get_sample(samples, ret->log_offset, i); + s->time = le64_to_cpu(s->time); + s->val = le64_to_cpu(s->val); + s->__ddir = le32_to_cpu(s->__ddir); + s->bs = le32_to_cpu(s->bs); - s->time = le64_to_cpu(s->time); - s->val = le64_to_cpu(s->val); - s->ddir = le32_to_cpu(s->ddir); - s->bs = le32_to_cpu(s->bs); + if (ret->log_offset) { + struct io_sample_offset *so = (void *) s; + + so->offset = le64_to_cpu(so->offset); + } } return ret; @@ -1374,8 +1442,7 @@ static void request_client_etas(struct client_ops *ops) dprint(FD_NET, "client: request eta (%d)\n", nr_clients); - eta = malloc(sizeof(*eta)); - memset(&eta->eta, 0, sizeof(eta->eta)); + eta = calloc(1, sizeof(*eta) + __THREAD_RUNSTR_SZ(REAL_MAX_JOBS)); eta->pending = nr_clients; flist_for_each(entry, &client_list) {