From e951bdc47d094d43d6f41de95c6af191b8346459 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 5 Oct 2011 21:58:45 +0200 Subject: [PATCH] server: require poll before fio_net_recv_cmd() Signed-off-by: Jens Axboe --- client.c | 115 +++++++++++++++++++++++++++---------------------------- server.c | 62 ++++++++++++++---------------- server.h | 2 +- 3 files changed, 86 insertions(+), 93 deletions(-) diff --git a/client.c b/client.c index 5a6fc39f..cd850c5a 100644 --- 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); diff --git a/server.c b/server.c index f586235f..2aff0625 100644 --- 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; diff --git a/server.h b/server.h index 3d1d79c3..82a6db66 100644 --- 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; -- 2.25.1