client: support per-client job files
authorJens Axboe <axboe@kernel.dk>
Sun, 26 Aug 2012 15:30:45 +0000 (17:30 +0200)
committerJens Axboe <axboe@kernel.dk>
Sun, 26 Aug 2012 15:30:45 +0000 (17:30 +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
init.c
server.h

index 7c9910961e7dee6685cd473b5d2193c0cd8a0391..50c17041bc189336688f97e99b45e210a80be4f4 100644 (file)
--- a/client.c
+++ b/client.c
@@ -58,6 +58,9 @@ struct fio_client {
 
        uint16_t argc;
        char **argv;
+
+       char **ini_file;
+       unsigned int nr_ini_file;
 };
 
 static struct timeval eta_tv;
@@ -151,6 +154,10 @@ static void remove_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);
        nr_clients--;
@@ -193,6 +200,19 @@ void fio_client_add_cmd_option(void *cookie, const char *opt)
        }
 }
 
+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(const char *hostname, void **cookie)
 {
        struct fio_client *existing = *cookie;
@@ -521,7 +541,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);
 
                client->sent_job = 1;
diff --git a/init.c b/init.c
index 475a6ad29f69a87da2463f4e020609c5e99861b5..824828cfa5d6ff5d809693c36236ec6355b1e59d 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1534,6 +1534,18 @@ int parse_cmd_line(int argc, char *argv[])
                                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++;
@@ -1604,6 +1616,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);
index 6d5a83d505234eeabd8656d0da452c32dab2f0d1..9bf8907f1b7d754fb7f35386be70a95ea787015c 100644 (file)
--- a/server.h
+++ b/server.h
@@ -124,6 +124,7 @@ extern int fio_clients_send_ini(const char *);
 extern int fio_handle_clients(void);
 extern int fio_client_add(const char *, void **);
 extern void fio_client_add_cmd_option(void *, const char *);
+extern void fio_client_add_ini_file(void *, const char *);
 
 extern int fio_recv_data(int sk, void *p, unsigned int len);
 extern int fio_send_data(int sk, const void *p, unsigned int len);