server: error handling fixes
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 61ef88b315eb6da4ace155967d8f1bce19eee716..b242f9445cb872c14c0ec008cba1f257dd4f53f1 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -77,6 +77,50 @@ struct io_log *agg_io_log[2];
 
 #define JOB_START_TIMEOUT      (5 * 1000)
 
+static const char *fio_os_strings[os_nr] = {
+       "Invalid",
+       "Linux",
+       "AIX",
+       "FreeBSD",
+       "HP-UX",
+       "OSX",
+       "NetBSD",
+       "Solaris",
+       "Windows"
+};
+
+static const char *fio_arch_strings[arch_nr] = {
+       "Invalid",
+       "x86-64",
+       "x86",
+       "ppc",
+       "ia64",
+       "s390",
+       "alpha",
+       "sparc",
+       "sparc64",
+       "arm",
+       "sh",
+       "hppa",
+       "generic"
+};
+
+const char *fio_get_os_string(int nr)
+{
+       if (nr < os_nr)
+               return fio_os_strings[nr];
+
+       return NULL;
+}
+
+const char *fio_get_arch_string(int nr)
+{
+       if (nr < arch_nr)
+               return fio_arch_strings[nr];
+
+       return NULL;
+}
+
 void td_set_runstate(struct thread_data *td, int runstate)
 {
        if (td->runstate == runstate)
@@ -121,10 +165,14 @@ void fio_terminate_threads(int group_id)
 static void sig_int(int sig)
 {
        if (threads) {
-               log_info("\nfio: terminating on signal %d\n", sig);
-               exit_backend = 1;
-               fflush(stdout);
-               exit_value = 128;
+               if (is_backend)
+                       fio_server_got_signal(sig);
+               else {
+                       log_info("\nfio: terminating on signal %d\n", sig);
+                       fflush(stdout);
+                       exit_value = 128;
+               }
+
                fio_terminate_threads(TERMINATE_ALL);
        }
 }
@@ -139,9 +187,7 @@ static void *disk_thread_main(void *data)
                        break;
                update_io_ticks();
 
-               if (is_backend)
-                       fio_server_send_status();
-               else
+               if (!is_backend)
                        print_thread_status();
        }
 
@@ -217,7 +263,7 @@ static int __check_min_rate(struct thread_data *td, struct timeval *now,
        if (mtime_since(&td->start, now) < 2000)
                return 0;
 
-       iops += td->io_blocks[ddir];
+       iops += td->this_io_blocks[ddir];
        bytes += td->this_io_bytes[ddir];
        ratemin += td->o.ratemin[ddir];
        rate_iops += td->o.rate_iops[ddir];
@@ -986,6 +1032,8 @@ static void reset_io_counters(struct thread_data *td)
 {
        td->stat_io_bytes[0] = td->stat_io_bytes[1] = 0;
        td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
+       td->stat_io_blocks[0] = td->stat_io_blocks[1] = 0;
+       td->this_io_blocks[0] = td->this_io_blocks[1] = 0;
        td->zone_bytes = 0;
        td->rate_bytes[0] = td->rate_bytes[1] = 0;
        td->rate_blocks[0] = td->rate_blocks[1] = 0;
@@ -1184,12 +1232,12 @@ static void *thread_main(void *data)
        clear_state = 0;
        while (keep_running(td)) {
                fio_gettime(&td->start, NULL);
-               memcpy(&td->stat_sample_time[0], &td->start, sizeof(td->start));
-               memcpy(&td->stat_sample_time[1], &td->start, sizeof(td->start));
+               memcpy(&td->bw_sample_time, &td->start, sizeof(td->start));
+               memcpy(&td->iops_sample_time, &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->stat_sample_time,
+                       memcpy(&td->lastrate, &td->bw_sample_time,
                                                        sizeof(td->lastrate));
 
                if (clear_state)
@@ -1266,6 +1314,14 @@ static void *thread_main(void *data)
                } else
                        finish_log(td, td->clat_log, "clat");
        }
+       if (td->iops_log) {
+               if (td->o.iops_log_file) {
+                       finish_log_named(td, td->iops_log,
+                                               td->o.iops_log_file, "iops");
+               } else
+                       finish_log(td, td->iops_log, "iops");
+       }
+
        fio_mutex_up(writeout_mutex);
        if (td->o.exec_postrun)
                exec_string(td->o.exec_postrun);
@@ -1687,8 +1743,12 @@ static void run_threads(void)
 
                reap_threads(&nr_running, &t_rate, &m_rate);
 
-               if (todo)
-                       usleep(100000);
+               if (todo) {
+                       if (is_backend)
+                               fio_server_idle_loop();
+                       else
+                               usleep(100000);
+               }
        }
 
        while (nr_running) {