server: require poll before fio_net_recv_cmd()
authorJens Axboe <axboe@kernel.dk>
Wed, 5 Oct 2011 19:58:45 +0000 (21:58 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 5 Oct 2011 19:58:45 +0000 (21:58 +0200)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
client.c
server.c
server.h

index 5a6fc39ff8dac6f984e5bdfa2603a210ec9973b4..cd850c5ac618ab36436b39ecc97dfecb799cbd87 100644 (file)
--- a/client.c
+++ b/client.c
@@ -42,7 +42,7 @@ enum {
 
 static FLIST_HEAD(client_list);
 
-static int handle_client(struct fio_client *client, int one, int block);
+static int handle_client(struct fio_client *client);
 
 static struct fio_client *find_client_by_fd(int fd)
 {
@@ -154,6 +154,8 @@ static int fio_client_connect(struct fio_client *client)
                hent = gethostbyname(client->hostname);
                if (!hent) {
                        log_err("fio: gethostbyname: %s\n", strerror(errno));
+                       log_err("fio: failed looking up hostname %s\n",
+                                       client->hostname);
                        return 1;
                }
 
@@ -217,7 +219,7 @@ static void probe_client(struct fio_client *client)
        dprint(FD_NET, "client: send probe\n");
 
        fio_net_send_simple_cmd(client->fd, FIO_NET_CMD_PROBE, 0);
-       handle_client(client, 1, 1);
+       handle_client(client);
 }
 
 static int send_client_cmd_line(struct fio_client *client)
@@ -280,7 +282,7 @@ static int fio_client_send_ini(struct fio_client *client, const char *filename)
 
        fd = open(filename, O_RDONLY);
        if (fd < 0) {
-               log_err("fio: job file open: %s\n", strerror(errno));
+               log_err("fio: job file <%s> open: %s\n", filename, strerror(errno));
                return 1;
        }
 
@@ -479,72 +481,67 @@ static void handle_probe(struct fio_net_cmd *cmd)
                probe->fio_minor, probe->fio_patch);
 }
 
-static int handle_client(struct fio_client *client, int one, int block)
+static int handle_client(struct fio_client *client)
 {
        struct fio_net_cmd *cmd;
-       int done = 0, did_cmd = 0;
 
        dprint(FD_NET, "client: handle %s\n", client->hostname);
 
-       while ((cmd = fio_net_recv_cmd(client->fd, block)) != NULL) {
-               did_cmd++;
+       cmd = fio_net_recv_cmd(client->fd);
+       if (!cmd)
+               return 0;
 
-               dprint(FD_NET, "client: got cmd op %d from %s\n",
+       dprint(FD_NET, "client: got cmd op %d from %s\n",
                                        cmd->opcode, client->hostname);
 
-               switch (cmd->opcode) {
-               case FIO_NET_CMD_QUIT:
-                       remove_client(client);
-                       free(cmd);
-                       done = 1;
-                       break;
-               case FIO_NET_CMD_TEXT: {
-                       const char *buf = (const char *) cmd->payload;
-                       int fio_unused ret;
-
-                       if (!client->skip_newline)
-                               fprintf(f_out, "<%s> ", client->hostname);
-                       ret = fwrite(buf, cmd->pdu_len, 1, f_out);
-                       fflush(f_out);
-                       client->skip_newline = strchr(buf, '\n') == NULL;
-                       free(cmd);
-                       break;
-                       }
-               case FIO_NET_CMD_TS:
-                       handle_ts(cmd);
-                       free(cmd);
-                       break;
-               case FIO_NET_CMD_GS:
-                       handle_gs(cmd);
-                       free(cmd);
-                       break;
-               case FIO_NET_CMD_ETA:
-                       handle_eta(cmd);
-                       free(cmd);
-                       break;
-               case FIO_NET_CMD_PROBE:
-                       handle_probe(cmd);
-                       free(cmd);
-                       break;
-               case FIO_NET_CMD_START:
-                       client->state = Client_started;
-                       free(cmd);
-                       break;
-               case FIO_NET_CMD_STOP:
-                       client->state = Client_stopped;
-                       free(cmd);
-                       break;
-               default:
-                       log_err("fio: unknown client op: %d\n", cmd->opcode);
-                       free(cmd);
-                       break;
+       switch (cmd->opcode) {
+       case FIO_NET_CMD_QUIT:
+               remove_client(client);
+               free(cmd);
+               break;
+       case FIO_NET_CMD_TEXT: {
+               const char *buf = (const char *) cmd->payload;
+               int fio_unused ret;
+
+               if (!client->skip_newline)
+                       fprintf(f_out, "<%s> ", client->hostname);
+               ret = fwrite(buf, cmd->pdu_len, 1, f_out);
+               fflush(f_out);
+               client->skip_newline = strchr(buf, '\n') == NULL;
+               free(cmd);
+               break;
                }
-
-               if (done || one)
-                       break;
+       case FIO_NET_CMD_TS:
+               handle_ts(cmd);
+               free(cmd);
+               break;
+       case FIO_NET_CMD_GS:
+               handle_gs(cmd);
+               free(cmd);
+               break;
+       case FIO_NET_CMD_ETA:
+               handle_eta(cmd);
+               free(cmd);
+               break;
+       case FIO_NET_CMD_PROBE:
+               handle_probe(cmd);
+               free(cmd);
+               break;
+       case FIO_NET_CMD_START:
+               client->state = Client_started;
+               free(cmd);
+               break;
+       case FIO_NET_CMD_STOP:
+               client->state = Client_stopped;
+               free(cmd);
+               break;
+       default:
+               log_err("fio: unknown client op: %d\n", cmd->opcode);
+               free(cmd);
+               break;
        }
 
-       return did_cmd;
+       return 1;
 }
 
 int fio_handle_clients(void)
@@ -588,7 +585,7 @@ int fio_handle_clients(void)
                                log_err("fio: unknown client\n");
                                continue;
                        }
-                       if (!handle_client(client, 0, 0)) {
+                       if (!handle_client(client)) {
                                log_info("client: host=%s disconnected\n",
                                                client->hostname);
                                remove_client(client);
index f586235fc1a44b16a6b3ae2f488410e38a0bf124..2aff0625092c78ab01229380460a9400cdf7d695 100644 (file)
--- a/server.c
+++ b/server.c
@@ -113,7 +113,7 @@ static int verify_convert_cmd(struct fio_net_cmd *cmd)
 /*
  * Read (and defragment, if necessary) incoming commands
  */
-struct fio_net_cmd *fio_net_recv_cmd(int sk, int block)
+struct fio_net_cmd *fio_net_recv_cmd(int sk)
 {
        struct fio_net_cmd cmd, *cmdret = NULL;
        size_t cmd_size = 0, pdu_offset = 0;
@@ -122,37 +122,6 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk, int block)
        void *pdu = NULL;
 
        do {
-               struct pollfd pfd;
-
-               pfd.fd = sk;
-               pfd.events = POLLIN;
-               ret = 0;
-               do {
-                       int timeo = block ? 100 : 10;
-
-                       ret = poll(&pfd, 1, timeo);
-                       if (ret < 0) {
-                               if (errno == EINTR)
-                                       break;
-                               log_err("fio: poll: %s\n", strerror(errno));
-                               break;
-                       } else if (!ret) {
-                               if (!block)
-                                       return NULL;
-                               continue;
-                       }
-
-                       if (pfd.revents & POLLIN)
-                               break;
-                       if (pfd.revents & (POLLERR|POLLHUP)) {
-                               ret = 1;
-                               break;
-                       }
-               } while (ret >= 0 && block);
-
-               if (ret < 0)
-                       break;
-
                ret = fio_recv_data(sk, &cmd, sizeof(cmd));
                if (ret)
                        break;
@@ -376,7 +345,34 @@ static int handle_connection(int sk, int block)
 
        /* read forever */
        while (!exit_backend) {
-               cmd = fio_net_recv_cmd(sk, block);
+               struct pollfd pfd = {
+                       .fd     = sk,
+                       .events = POLLIN,
+               };
+
+               ret = 0;
+               do {
+                       ret = poll(&pfd, 1, 100);
+                       if (ret < 0) {
+                               if (errno == EINTR)
+                                       break;
+                               log_err("fio: poll: %s\n", strerror(errno));
+                               break;
+                       } else if (!ret)
+                               continue;
+
+                       if (pfd.revents & POLLIN)
+                               break;
+                       if (pfd.revents & (POLLERR|POLLHUP)) {
+                               ret = 1;
+                               break;
+                       }
+               } while (1);
+
+               if (ret < 0)
+                       break;
+
+               cmd = fio_net_recv_cmd(sk);
                if (!cmd) {
                        ret = -1;
                        break;
index 3d1d79c3c8cd2a0c7d3f1eed8e154b48263b1767..82a6db660ce7a4a72fa4cfeabd555f07dfae5e30 100644 (file)
--- a/server.h
+++ b/server.h
@@ -92,7 +92,7 @@ extern int fio_client_add_cmd_option(const char *, const char *);
 extern int fio_recv_data(int sk, void *p, unsigned int len);
 extern int fio_send_data(int sk, const void *p, unsigned int len);
 extern void fio_net_cmd_crc(struct fio_net_cmd *);
-extern struct fio_net_cmd *fio_net_recv_cmd(int sk, int block);
+extern struct fio_net_cmd *fio_net_recv_cmd(int sk);
 
 extern int exit_backend;
 extern int fio_net_port;