X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=server.c;h=938f58bb3d4e39c9d308dd5aacf5dbb58e6e1f29;hp=7202f10fcbbd542e9d9bdc05319c20c8a24041a1;hb=c28e8e8c68f7e908085f4585299e6e4d74d01837;hpb=817f06bbc52aea4011ab975d8fa3e3f1065c6065 diff --git a/server.c b/server.c index 7202f10f..938f58bb 100644 --- a/server.c +++ b/server.c @@ -120,6 +120,32 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk) void *pdu = NULL; do { + struct pollfd pfd; + + pfd.fd = sk; + pfd.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 (ret >= 0); + + if (ret < 0) + break; + ret = fio_recv_data(sk, &cmd, sizeof(cmd)); if (ret) break; @@ -168,9 +194,7 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk) if (ret) { free(cmdret); cmdret = NULL; - } - - if (cmdret) + } else if (cmdret) cmdret->flags &= ~FIO_NET_CMD_F_MORE; return cmdret; @@ -216,7 +240,7 @@ int fio_net_send_cmd(int fd, uint16_t opcode, const void *buf, off_t size) return ret; } -static int send_simple_command(int sk, uint16_t opcode, uint64_t serial) +int fio_net_send_simple_cmd(int sk, uint16_t opcode, uint64_t serial) { struct fio_net_cmd cmd = { .version = __cpu_to_le16(FIO_SERVER_VER1), @@ -229,29 +253,10 @@ static int send_simple_command(int sk, uint16_t opcode, uint64_t serial) return fio_send_data(sk, &cmd, sizeof(cmd)); } -/* - * Send an ack for this command - */ -static int ack_command(int sk, struct fio_net_cmd *cmd) -{ -#if 0 - return send_simple_command(sk, FIO_NET_CMD_ACK, cmd->serial); -#else - return 0; -#endif -} - -#if 0 -static int nak_command(int sk, struct fio_net_cmd *cmd) -{ - return send_simple_command(sk, FIO_NET_CMD_NAK, cmd->serial); -} -#endif - static int send_quit_command(void) { dprint(FD_NET, "server: sending quit\n"); - return send_simple_command(server_fd, FIO_NET_CMD_QUIT, 0); + return fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_QUIT, 0); } static int handle_cur_job(struct fio_net_cmd *cmd) @@ -266,6 +271,19 @@ static int handle_cur_job(struct fio_net_cmd *cmd) return ret; } +static int handle_probe_cmd(struct fio_net_cmd *cmd) +{ + struct cmd_probe_pdu probe; + + memset(&probe, 0, sizeof(probe)); + gethostname((char *) probe.hostname, sizeof(probe.hostname)); + probe.fio_major = 1; + probe.fio_minor = 58; + probe.fio_patch = 0; + + return fio_net_send_cmd(server_fd, FIO_NET_CMD_PROBE, &probe, sizeof(probe)); +} + static int handle_command(struct fio_net_cmd *cmd) { int ret; @@ -274,17 +292,17 @@ static int handle_command(struct fio_net_cmd *cmd) switch (cmd->opcode) { case FIO_NET_CMD_QUIT: - return 1; + fio_terminate_threads(TERMINATE_ALL); + return -1; case FIO_NET_CMD_EXIT: exit_backend = 1; - return 1; - case FIO_NET_CMD_ACK: - return 0; - case FIO_NET_CMD_NAK: - return 1; + return -1; case FIO_NET_CMD_JOB: ret = handle_cur_job(cmd); break; + case FIO_NET_CMD_PROBE: + ret = handle_probe_cmd(cmd); + break; default: log_err("fio: unknown opcode: %d\n", cmd->opcode); ret = 1; @@ -302,14 +320,10 @@ static int handle_connection(int sk) while (!exit_backend) { cmd = fio_net_recv_cmd(sk); if (!cmd) { - ret = 1; + ret = -1; break; } - ret = ack_command(sk, cmd); - if (ret) - break; - ret = handle_command(cmd); if (ret) break; @@ -324,6 +338,12 @@ static int handle_connection(int sk) return ret; } +void fio_server_idle_loop(void) +{ + if (server_fd != -1) + handle_connection(server_fd); +} + static int accept_loop(int listen_sk) { struct sockaddr addr; @@ -399,7 +419,7 @@ static int fio_server(void) #ifdef SO_REUSEPORT if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) { log_err("fio: setsockopt: %s\n", strerror(errno)); - return 1; + return -1; } #endif @@ -472,6 +492,8 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) struct cmd_ts_pdu p; int i, j; + memset(&p, 0, sizeof(p)); + strcpy(p.ts.name, ts->name); strcpy(p.ts.verror, ts->verror); strcpy(p.ts.description, ts->description); @@ -513,10 +535,10 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) for (i = 0; i < 3; i++) { p.ts.total_io_u[i] = cpu_to_le64(ts->total_io_u[i]); - p.ts.short_io_u[i] = cpu_to_le64(ts->total_io_u[i]); + p.ts.short_io_u[i] = cpu_to_le64(ts->short_io_u[i]); } - p.ts.total_submit = cpu_to_le64(ts->total_submit); + p.ts.total_submit = cpu_to_le64(ts->total_submit); p.ts.total_complete = cpu_to_le64(ts->total_complete); for (i = 0; i < 2; i++) { @@ -543,6 +565,44 @@ void fio_server_send_gs(struct group_run_stats *rs) fio_net_send_cmd(server_fd, FIO_NET_CMD_GS, &gs, sizeof(gs)); } +void fio_server_send_status(void) +{ + struct jobs_eta *je; + size_t size; + void *buf; + int i; + + size = sizeof(*je) + thread_number * sizeof(char); + buf = malloc(size); + memset(buf, 0, size); + je = buf; + + if (!calc_thread_status(je)) { + free(je); + return; + } + + 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->files_open = cpu_to_le32(je->files_open); + je->m_rate = cpu_to_le32(je->m_rate); + je->t_rate = cpu_to_le32(je->t_rate); + je->m_iops = cpu_to_le32(je->m_iops); + je->t_iops = cpu_to_le32(je->t_iops); + + for (i = 0; i < 2; i++) { + je->rate[i] = cpu_to_le32(je->rate[i]); + je->iops[i] = cpu_to_le32(je->iops[i]); + } + + je->elapsed_sec = cpu_to_le32(je->nr_running); + je->eta_sec = cpu_to_le64(je->eta_sec); + + fio_net_send_cmd(server_fd, FIO_NET_CMD_ETA, buf, size); + free(je); +} + int fio_server_log(const char *format, ...) { char buffer[1024]; @@ -567,7 +627,7 @@ int fio_start_server(int daemonize) pid = fork(); if (pid < 0) { syslog(LOG_ERR, "failed server fork"); - return 1; + return -1; } else if (pid) exit(0);