mutex: fixup fio_mutex_down_timeout()
[fio.git] / server.c
index 3229bb3992f83e81b3926888abcfc5eb314a56bd..5871228d04b8878dd27c1514ea542055cfad9d4e 100644 (file)
--- a/server.c
+++ b/server.c
@@ -709,33 +709,39 @@ static int handle_send_eta_cmd(struct fio_net_cmd *cmd)
        size_t size;
        int i;
 
-       je = get_jobs_eta(1, &size);
-       if (!je)
-               return 0;
-
        dprint(FD_NET, "server sending status\n");
 
-       je->nr_running          = cpu_to_le32(je->nr_running);
-       je->nr_ramp             = cpu_to_le32(je->nr_ramp);
-       je->nr_pending          = cpu_to_le32(je->nr_pending);
-       je->nr_setting_up       = cpu_to_le32(je->nr_setting_up);
-       je->files_open          = cpu_to_le32(je->files_open);
+       /*
+        * Fake ETA return if we don't have a local one, otherwise the client
+        * will end up timing out waiting for a response to the ETA request
+        */
+       je = get_jobs_eta(true, &size);
+       if (!je) {
+               size = sizeof(*je);
+               je = calloc(1, size);
+       } else {
+               je->nr_running          = cpu_to_le32(je->nr_running);
+               je->nr_ramp             = cpu_to_le32(je->nr_ramp);
+               je->nr_pending          = cpu_to_le32(je->nr_pending);
+               je->nr_setting_up       = cpu_to_le32(je->nr_setting_up);
+               je->files_open          = cpu_to_le32(je->files_open);
+
+               for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+                       je->m_rate[i]   = cpu_to_le32(je->m_rate[i]);
+                       je->t_rate[i]   = cpu_to_le32(je->t_rate[i]);
+                       je->m_iops[i]   = cpu_to_le32(je->m_iops[i]);
+                       je->t_iops[i]   = cpu_to_le32(je->t_iops[i]);
+                       je->rate[i]     = cpu_to_le32(je->rate[i]);
+                       je->iops[i]     = cpu_to_le32(je->iops[i]);
+               }
 
-       for (i = 0; i < DDIR_RWDIR_CNT; i++) {
-               je->m_rate[i]   = cpu_to_le32(je->m_rate[i]);
-               je->t_rate[i]   = cpu_to_le32(je->t_rate[i]);
-               je->m_iops[i]   = cpu_to_le32(je->m_iops[i]);
-               je->t_iops[i]   = cpu_to_le32(je->t_iops[i]);
-               je->rate[i]     = cpu_to_le32(je->rate[i]);
-               je->iops[i]     = cpu_to_le32(je->iops[i]);
+               je->elapsed_sec         = cpu_to_le64(je->elapsed_sec);
+               je->eta_sec             = cpu_to_le64(je->eta_sec);
+               je->nr_threads          = cpu_to_le32(je->nr_threads);
+               je->is_pow2             = cpu_to_le32(je->is_pow2);
+               je->unit_base           = cpu_to_le32(je->unit_base);
        }
 
-       je->elapsed_sec         = cpu_to_le64(je->elapsed_sec);
-       je->eta_sec             = cpu_to_le64(je->eta_sec);
-       je->nr_threads          = cpu_to_le32(je->nr_threads);
-       je->is_pow2             = cpu_to_le32(je->is_pow2);
-       je->unit_base           = cpu_to_le32(je->unit_base);
-
        fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, je, size, &tag, NULL);
        free(je);
        return 0;
@@ -956,7 +962,6 @@ int get_my_addr_str( int sk )
        ret = getsockname(sk, sockaddr_p, &len);
        if (ret) {
                log_err("fio: getsockaddr: %s\n", strerror(errno));
-               close(sk);
                return -1;
        }
        if (use_ipv6)
@@ -965,7 +970,6 @@ int get_my_addr_str( int sk )
                net_addr = (char * )&myaddr4.sin_addr;
        if (NULL == inet_ntop(use_ipv6?AF_INET6:AF_INET, net_addr, client_sockaddr_str, INET6_ADDRSTRLEN-1)) {
                log_err("inet_ntop: failed to convert addr to string\n");
-               close(sk);
                return -1;
        }
        dprint(FD_NET, "fio server bound to addr %s\n", client_sockaddr_str);
@@ -1043,8 +1047,7 @@ static int accept_loop(int listen_sk)
                }
 
                /* exits */
-               if (get_my_addr_str(sk))
-                       return -1; /* error already logged and socket closed */
+               get_my_addr_str(sk); /* if error, it's already logged, non-fatal */
                handle_connection(sk);
        }
 
@@ -1413,7 +1416,7 @@ void fio_server_send_start(struct thread_data *td)
 }
 
 int fio_server_get_verify_state(const char *name, int threadnumber,
-                               void **datap)
+                               void **datap, int *version)
 {
        struct thread_io_list *s;
        struct cmd_sendfile out;
@@ -1442,7 +1445,7 @@ int fio_server_get_verify_state(const char *name, int threadnumber,
        /*
         * Wait for the backend to receive the reply
         */
-       if (fio_mutex_down_timeout(&rep->lock, 10)) {
+       if (fio_mutex_down_timeout(&rep->lock, 10000)) {
                log_err("fio: timed out waiting for reply\n");
                goto fail;
        }
@@ -1461,7 +1464,7 @@ fail:
         * the header, and the thread_io_list checksum
         */
        s = rep->data + sizeof(struct verify_state_hdr);
-       if (verify_state_hdr(rep->data, s))
+       if (verify_state_hdr(rep->data, s, version))
                goto fail;
 
        /*
@@ -1498,13 +1501,13 @@ static int fio_init_server_ip(void)
 
        opt = 1;
        if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)) < 0) {
-               log_err("fio: setsockopt: %s\n", strerror(errno));
+               log_err("fio: setsockopt(REUSEADDR): %s\n", strerror(errno));
                close(sk);
                return -1;
        }
 #ifdef SO_REUSEPORT
        if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
-               log_err("fio: setsockopt: %s\n", strerror(errno));
+               log_err("fio: setsockopt(REUSEPORT): %s\n", strerror(errno));
                close(sk);
                return -1;
        }