Fix verify state for multiple files
[fio.git] / server.c
index f6f34418e8001a1df4f712d20efb319b41d29eb7..dcb7c2da61186411e782415e5f5ae26173addd83 100644 (file)
--- a/server.c
+++ b/server.c
@@ -269,7 +269,7 @@ static int fio_recv_data(int sk, void *p, unsigned int len, bool wait)
        if (wait)
                flags = MSG_WAITALL;
        else
-               flags = MSG_DONTWAIT;
+               flags = OS_MSG_DONTWAIT;
 
        do {
                int ret = recv(sk, p, len, flags);
@@ -971,9 +971,9 @@ static int handle_trigger_cmd(struct fio_net_cmd *cmd)
                struct all_io_list state;
 
                state.threads = cpu_to_le64((uint64_t) 0);
-               fio_net_queue_cmd(FIO_NET_CMD_VTRIGGER, &state, sizeof(state), NULL, SK_F_COPY);
+               fio_net_queue_cmd(FIO_NET_CMD_VTRIGGER, &state, sizeof(state), NULL, SK_F_COPY | SK_F_INLINE);
        } else
-               fio_net_queue_cmd(FIO_NET_CMD_VTRIGGER, rep, sz, NULL, SK_F_FREE);
+               fio_net_queue_cmd(FIO_NET_CMD_VTRIGGER, rep, sz, NULL, SK_F_FREE | SK_F_INLINE);
 
        exec_trigger(buf);
        return 0;
@@ -1062,17 +1062,35 @@ static int fio_send_cmd_ext_pdu(int sk, uint16_t opcode, const void *buf,
 {
        struct fio_net_cmd cmd;
        struct iovec iov[2];
+       size_t this_len;
+       int ret;
 
        iov[0].iov_base = (void *) &cmd;
        iov[0].iov_len = sizeof(cmd);
-       iov[1].iov_base = (void *) buf;
-       iov[1].iov_len = size;
 
-       __fio_init_net_cmd(&cmd, opcode, size, tag);
-       cmd.flags = __cpu_to_le32(flags);
-       fio_net_cmd_crc_pdu(&cmd, buf);
+       do {
+               uint32_t this_flags = flags;
+
+               this_len = size;
+               if (this_len > FIO_SERVER_MAX_FRAGMENT_PDU)
+                       this_len = FIO_SERVER_MAX_FRAGMENT_PDU;
+
+               if (this_len < size)
+                       this_flags |= FIO_NET_CMD_F_MORE;
+
+               __fio_init_net_cmd(&cmd, opcode, this_len, tag);
+               cmd.flags = __cpu_to_le32(this_flags);
+               fio_net_cmd_crc_pdu(&cmd, buf);
+
+               iov[1].iov_base = (void *) buf;
+               iov[1].iov_len = this_len;
 
-       return fio_sendv_data(sk, iov, 2);
+               ret = fio_sendv_data(sk, iov, 2);
+               size -= this_len;
+               buf += this_len;
+       } while (!ret && size);
+
+       return ret;
 }
 
 static void finish_entry(struct sk_entry *entry)
@@ -1801,7 +1819,7 @@ void fio_server_send_start(struct thread_data *td)
 }
 
 int fio_server_get_verify_state(const char *name, int threadnumber,
-                               void **datap, int *version)
+                               void **datap)
 {
        struct thread_io_list *s;
        struct cmd_sendfile out;
@@ -1853,7 +1871,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, version)) {
+       if (verify_state_hdr(rep->data, s)) {
                ret = EILSEQ;
                goto fail;
        }
@@ -1898,11 +1916,10 @@ static int fio_init_server_ip(void)
                return -1;
        }
 #ifdef SO_REUSEPORT
-       if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
-               log_err("fio: setsockopt(REUSEPORT): %s\n", strerror(errno));
-               close(sk);
-               return -1;
-       }
+       /*
+        * Not fatal if fails, so just ignore it if that happens
+        */
+       setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
 #endif
 
        if (use_ipv6) {