trigger: enable separate remote and local trigger
authorJens Axboe <axboe@fb.com>
Wed, 19 Nov 2014 15:36:12 +0000 (08:36 -0700)
committerJens Axboe <axboe@fb.com>
Wed, 19 Nov 2014 15:36:12 +0000 (08:36 -0700)
Change the options so that we have the trigger file and command
separate, and remote and local trigger command separate as well.

Signed-off-by: Jens Axboe <axboe@fb.com>
backend.c
fio.h
init.c

index 77f52337119ef8751a21019a3e88b2def24c90d6..9bb017451f6bad52c62dbba069d8184ee9e6dde9 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -1804,9 +1804,12 @@ void exec_trigger(const char *cmd)
 void check_trigger_file(void)
 {
        if (__check_trigger_file() || trigger_timedout()) {
-               if (nr_clients)
-                       fio_clients_send_trigger(trigger_cmd);
-               else {
+               if (nr_clients) {
+                       if (trigger_remote_cmd)
+                               fio_clients_send_trigger(trigger_remote_cmd);
+                       if (trigger_cmd)
+                               exec_trigger(trigger_cmd);
+               } else {
                        verify_save_state();
                        fio_terminate_threads(TERMINATE_ALL);
                        exec_trigger(trigger_cmd);
diff --git a/fio.h b/fio.h
index 50cf1b03f3956985d9244a32330969ae57ff12c1..0601b376414b80cd31f44eb80d5e60e7119cf268 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -393,6 +393,7 @@ extern int helper_do_stat;
 extern pthread_cond_t helper_cond;
 extern char *trigger_file;
 extern char *trigger_cmd;
+extern char *trigger_remote_cmd;
 extern long long trigger_timeout;
 
 extern struct thread_data *threads;
diff --git a/init.c b/init.c
index 108f2b88d1ae611f20308f8c09a8d41f7b61e5b2..b72689a3782cc816a0acf879e9fd1e0ef322058f 100644 (file)
--- a/init.c
+++ b/init.c
@@ -65,8 +65,9 @@ int read_only = 0;
 int status_interval = 0;
 
 char *trigger_file = NULL;
-char *trigger_cmd = NULL;
 long long trigger_timeout = 0;
+char *trigger_cmd = NULL;
+char *trigger_remote_cmd = NULL;
 
 static int prev_group_jobs;
 
@@ -246,7 +247,7 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
                .val            = 'L',
        },
        {
-               .name           = (char *) "trigger",
+               .name           = (char *) "trigger-file",
                .has_arg        = required_argument,
                .val            = 'W',
        },
@@ -255,6 +256,16 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
                .has_arg        = required_argument,
                .val            = 'B',
        },
+       {
+               .name           = (char *) "trigger",
+               .has_arg        = required_argument,
+               .val            = 'H',
+       },
+       {
+               .name           = (char *) "trigger-remote",
+               .has_arg        = required_argument,
+               .val            = 'J',
+       },
        {
                .name           = NULL,
        },
@@ -287,6 +298,11 @@ static void free_shm(void)
                free_threads_shm();
        }
 
+       free(trigger_file);
+       free(trigger_cmd);
+       free(trigger_remote_cmd);
+       trigger_file = trigger_cmd = trigger_remote_cmd = NULL;
+
        options_free(fio_options, &def_thread);
        fio_filelock_exit();
        scleanup();
@@ -1679,8 +1695,10 @@ static void usage(const char *name)
 #ifdef CONFIG_ZLIB
        printf("  --inflate-log=log\tInflate and output compressed log\n");
 #endif
-       printf("  --trigger=file:cmd\tExecute trigger cmd when file exists\n");
+       printf("  --trigger-file=file\tExecute trigger cmd when file exists\n");
        printf("  --trigger-timeout=t\tExecute trigger af this time\n");
+       printf("  --trigger=cmd\t\tSet this command as local trigger\n");
+       printf("  --trigger-remote=cmd\tSet this command as remote trigger\n");
        printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
        printf("\n                   Jens Axboe <jaxboe@fusionio.com>");
        printf("\n                   Jens Axboe <axboe@fb.com>\n");
@@ -2200,33 +2218,15 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        status_interval = val / 1000;
                        break;
                        }
-               case 'W': {
-                       char *split, *cmd;
-                       size_t sz;
-
-                       split = strchr(optarg, ':');
-                       if (!split) {
-                               log_err("fio: trigger is file:command\n");
-                               do_exit++;
-                               exit_val = 1;
-                       }
-
-                       sz = split - optarg;
-                       if (sz) {
-                               trigger_file = calloc(1, sz + 1);
-                               strncpy(trigger_file, optarg, sz);
-                       }
-
-                       split++;
-                       cmd = trigger_cmd = strdup(split);
-                       strip_blank_front(&trigger_cmd);
-                       strip_blank_end(trigger_cmd);
-                       if (strlen(trigger_cmd) == 0) {
-                               free(cmd);
-                               trigger_cmd = NULL;
-                       }
+               case 'W':
+                       trigger_file = strdup(optarg);
+                       break;
+               case 'H':
+                       trigger_cmd = strdup(optarg);
+                       break;
+               case 'J':
+                       trigger_remote_cmd = strdup(optarg);
                        break;
-                       }
                case 'B':
                        if (check_str_time(optarg, &trigger_timeout, 1)) {
                                log_err("fio: failed parsing time %s\n", optarg);