server: idle loop support
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index a15080b4a26e89bebea6edf5def458e701e0cddd..3e4dbb749fd97d9a7af718d27a22d5cc15cb749c 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -75,7 +75,6 @@ unsigned long arch_flags = 0;
 
 struct io_log *agg_io_log[2];
 
-#define TERMINATE_ALL          (-1)
 #define JOB_START_TIMEOUT      (5 * 1000)
 
 void td_set_runstate(struct thread_data *td, int runstate)
@@ -88,7 +87,7 @@ void td_set_runstate(struct thread_data *td, int runstate)
        td->runstate = runstate;
 }
 
-static void terminate_threads(int group_id)
+void fio_terminate_threads(int group_id)
 {
        struct thread_data *td;
        int i;
@@ -126,7 +125,7 @@ static void sig_int(int sig)
                exit_backend = 1;
                fflush(stdout);
                exit_value = 128;
-               terminate_threads(TERMINATE_ALL);
+               fio_terminate_threads(TERMINATE_ALL);
        }
 }
 
@@ -140,7 +139,9 @@ static void *disk_thread_main(void *data)
                        break;
                update_io_ticks();
 
-               if (!is_backend)
+               if (is_backend)
+                       fio_server_send_status();
+               else
                        print_thread_status();
        }
 
@@ -182,6 +183,13 @@ static void set_sig_handlers(void)
        act.sa_handler = sig_int;
        act.sa_flags = SA_RESTART;
        sigaction(SIGTERM, &act, NULL);
+
+       if (is_backend) {
+               memset(&act, 0, sizeof(act));
+               act.sa_handler = sig_int;
+               act.sa_flags = SA_RESTART;
+               sigaction(SIGPIPE, &act, NULL);
+       }
 }
 
 /*
@@ -748,7 +756,7 @@ sync_done:
                if (!in_ramp_time(td) && should_check_rate(td, bytes_done)) {
                        if (check_min_rate(td, &comp_time, bytes_done)) {
                                if (exitall_on_terminate)
-                                       terminate_threads(td->groupid);
+                                       fio_terminate_threads(td->groupid);
                                td_verror(td, EIO, "check_min_rate");
                                break;
                        }
@@ -976,7 +984,7 @@ static int keep_running(struct thread_data *td)
 
 static void reset_io_counters(struct thread_data *td)
 {
-       td->ts.stat_io_bytes[0] = td->ts.stat_io_bytes[1] = 0;
+       td->stat_io_bytes[0] = td->stat_io_bytes[1] = 0;
        td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
        td->zone_bytes = 0;
        td->rate_bytes[0] = td->rate_bytes[1] = 0;
@@ -1171,19 +1179,17 @@ static void *thread_main(void *data)
        }
 
        fio_gettime(&td->epoch, NULL);
-       getrusage(RUSAGE_SELF, &td->ts.ru_start);
+       getrusage(RUSAGE_SELF, &td->ru_start);
 
        clear_state = 0;
        while (keep_running(td)) {
                fio_gettime(&td->start, NULL);
-               memcpy(&td->ts.stat_sample_time[0], &td->start,
-                               sizeof(td->start));
-               memcpy(&td->ts.stat_sample_time[1], &td->start,
-                               sizeof(td->start));
+               memcpy(&td->stat_sample_time[0], &td->start, sizeof(td->start));
+               memcpy(&td->stat_sample_time[1], &td->start, sizeof(td->start));
                memcpy(&td->tv_cache, &td->start, sizeof(td->start));
 
                if (td->o.ratemin[0] || td->o.ratemin[1])
-                       memcpy(&td->lastrate, &td->ts.stat_sample_time,
+                       memcpy(&td->lastrate, &td->stat_sample_time,
                                                        sizeof(td->lastrate));
 
                if (clear_state)
@@ -1232,40 +1238,40 @@ static void *thread_main(void *data)
        td->ts.io_bytes[1] = td->io_bytes[1];
 
        fio_mutex_down(writeout_mutex);
-       if (td->ts.bw_log) {
+       if (td->bw_log) {
                if (td->o.bw_log_file) {
-                       finish_log_named(td, td->ts.bw_log,
+                       finish_log_named(td, td->bw_log,
                                                td->o.bw_log_file, "bw");
                } else
-                       finish_log(td, td->ts.bw_log, "bw");
+                       finish_log(td, td->bw_log, "bw");
        }
-       if (td->ts.lat_log) {
+       if (td->lat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.lat_log,
+                       finish_log_named(td, td->lat_log,
                                                td->o.lat_log_file, "lat");
                } else
-                       finish_log(td, td->ts.lat_log, "lat");
+                       finish_log(td, td->lat_log, "lat");
        }
-       if (td->ts.slat_log) {
+       if (td->slat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.slat_log,
+                       finish_log_named(td, td->slat_log,
                                                td->o.lat_log_file, "slat");
                } else
-                       finish_log(td, td->ts.slat_log, "slat");
+                       finish_log(td, td->slat_log, "slat");
        }
-       if (td->ts.clat_log) {
+       if (td->clat_log) {
                if (td->o.lat_log_file) {
-                       finish_log_named(td, td->ts.clat_log,
+                       finish_log_named(td, td->clat_log,
                                                td->o.lat_log_file, "clat");
                } else
-                       finish_log(td, td->ts.clat_log, "clat");
+                       finish_log(td, td->clat_log, "clat");
        }
        fio_mutex_up(writeout_mutex);
        if (td->o.exec_postrun)
                exec_string(td->o.exec_postrun);
 
        if (exitall_on_terminate)
-               terminate_threads(td->groupid);
+               fio_terminate_threads(td->groupid);
 
 err:
        if (td->error)
@@ -1419,7 +1425,7 @@ reaped:
        }
 
        if (*nr_running == cputhreads && !pending && realthreads)
-               terminate_threads(TERMINATE_ALL);
+               fio_terminate_threads(TERMINATE_ALL);
 }
 
 static void *gtod_thread_main(void *data)
@@ -1481,6 +1487,8 @@ static void run_threads(void)
        if (fio_gtod_offload && fio_start_gtod_thread())
                return;
 
+       set_sig_handlers();
+
        if (!terse_output) {
                log_info("Starting ");
                if (nr_thread)
@@ -1496,8 +1504,6 @@ static void run_threads(void)
                fflush(stdout);
        }
 
-       set_sig_handlers();
-
        todo = thread_number;
        nr_running = 0;
        nr_started = 0;
@@ -1613,7 +1619,7 @@ static void run_threads(void)
                        dprint(FD_MUTEX, "wait on startup_mutex\n");
                        if (fio_mutex_down_timeout(startup_mutex, 10)) {
                                log_err("fio: job startup hung? exiting.\n");
-                               terminate_threads(TERMINATE_ALL);
+                               fio_terminate_threads(TERMINATE_ALL);
                                fio_abort = 1;
                                nr_started--;
                                break;
@@ -1687,7 +1693,11 @@ static void run_threads(void)
 
        while (nr_running) {
                reap_threads(&nr_running, &t_rate, &m_rate);
-               usleep(10000);
+
+               if (is_backend)
+                       fio_server_idle_loop();
+               else
+                       usleep(10000);
        }
 
        update_io_ticks();
@@ -1696,6 +1706,8 @@ static void run_threads(void)
 
 int exec_run(void)
 {
+       if (nr_clients)
+               return fio_handle_clients();
        if (exec_profile && load_profile(exec_profile))
                return 1;