client: support per-client job files
authorJens Axboe <axboe@kernel.dk>
Sun, 26 Aug 2012 15:33:34 +0000 (17:33 +0200)
committerJens Axboe <axboe@kernel.dk>
Sun, 26 Aug 2012 15:33:34 +0000 (17:33 +0200)
Currently the fio network client sends all job files to all clients.
This isn't very flexible.

Add support for specifying a specific job file for each client. Example:

$ fio --client hostname1 jobfile1 --client hostname2 jobfile2

would before add jobfile1 and jobfile2 as job files for both clients.
With this change, only jobfile1 is sent to hostname1, and only
jobfile2 is sent to hostname2.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
client.c
client.h
init.c

index c1e516d5288d7453798d1cd8d217280d5d637bd7..a9b63e2a66e38b4dc6e313c80ad8a89c3c428ca0 100644 (file)
--- a/client.c
+++ b/client.c
@@ -111,6 +111,10 @@ 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);
 
        free(client);
 }
@@ -227,6 +231,19 @@ err:
        return NULL;
 }
 
+void fio_client_add_ini_file(void *cookie, const char *ini_file)
+{
+       struct fio_client *client = cookie;
+       size_t new_size;
+
+       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++;
+}
+
 int fio_client_add(struct client_ops *ops, const char *hostname, void **cookie)
 {
        struct fio_client *existing = *cookie;
@@ -620,7 +637,18 @@ 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 (fio_client_send_ini(client, filename))
+               if (client->nr_ini_file) {
+                       int i;
+
+                       for (i = 0; i < client->nr_ini_file; i++) {
+                               const char *ini = client->ini_file[i];
+
+                               if (fio_client_send_ini(client, ini)) {
+                                       remove_client(client);
+                                       break;
+                               }
+                       }
+               } else if (!filename || fio_client_send_ini(client, filename))
                        remove_client(client);
        }
 
index acb5a88f59b415920a44200a740af2bc720065ca..341d26069449a94f4b95ecaa69b0cb16e472ebed 100644 (file)
--- a/client.h
+++ b/client.h
@@ -61,6 +61,9 @@ struct fio_client {
 
        struct client_ops *ops;
        void *client_data;
+
+       char **ini_file;
+       unsigned int nr_ini_file;
 };
 
 struct cmd_iolog_pdu;
@@ -120,6 +123,7 @@ extern int fio_handle_clients(struct client_ops *);
 extern int fio_client_add(struct client_ops *, const char *, void **);
 extern struct fio_client *fio_client_add_explicit(struct client_ops *, const char *, int, int);
 extern void fio_client_add_cmd_option(void *, const char *);
+extern void fio_client_add_ini_file(void *, const char *);
 extern int fio_client_terminate(struct fio_client *);
 extern void fio_clients_terminate(void);
 extern struct fio_client *fio_get_client(struct fio_client *);
diff --git a/init.c b/init.c
index 2b581fbc519668a4057d541493481f2d979e4724..ae96c6c63e20904434f21cf5ae663e8259e3714c 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1577,6 +1577,18 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                exit_val = 1;
                                break;
                        }
+                       /*
+                        * If the next argument exists and isn't an option,
+                        * assume it's a job file for this client only.
+                        */
+                       while (optind < argc) {
+                               if (!strncmp(argv[optind], "--", 2) ||
+                                   !strncmp(argv[optind], "-", 1))
+                                       break;
+
+                               fio_client_add_ini_file(cur_client, argv[optind]);
+                               optind++;
+                       }
                        break;
                default:
                        do_exit++;
@@ -1660,6 +1672,11 @@ int parse_options(int argc, char *argv[])
                                free(ini_file[i]);
                        }
                }
+       } else if (nr_clients) {
+               if (fill_def_thread())
+                       return 1;
+               if (fio_clients_send_ini(NULL))
+                       return 1;
        }
 
        free(ini_file);