server: require poll before fio_net_recv_cmd()
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/client.c b/client.c
index 5a6fc39..cd850c5 100644
--- a/client.c
+++ b/client.c
@@ -42,7 +42,7 @@
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 @@
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 @@
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 @@
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 @@
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;
+ 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;
- }
- 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;
+ 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 @@
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 f586235..2aff062 100644
--- a/server.c
+++ b/server.c
@@ -113,7 +113,7 @@
/*
* 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 @@
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 @@
/* 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 3d1d79c..82a6db6 100644
--- a/server.h
+++ b/server.h
@@ -92,7 +92,7 @@
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;