server: error handling and probe command
authorJens Axboe <axboe@kernel.dk>
Tue, 4 Oct 2011 06:57:39 +0000 (08:57 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 4 Oct 2011 06:57:39 +0000 (08:57 +0200)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
client.c
server.c
server.h

index 89c2b442ec9754b6f19c769ba6d3e8d716332bbc..0a93be0c0a4b2f98fd3a3d64538e7147f6222897 100644 (file)
--- a/client.c
+++ b/client.c
@@ -376,9 +376,6 @@ static int handle_client(struct fio_client *client)
                                                        cmd->opcode);
 
                switch (cmd->opcode) {
                                                        cmd->opcode);
 
                switch (cmd->opcode) {
-               case FIO_NET_CMD_ACK:
-                       free(cmd);
-                       break;
                case FIO_NET_CMD_QUIT:
                        remove_client(client);
                        free(cmd);
                case FIO_NET_CMD_QUIT:
                        remove_client(client);
                        free(cmd);
index 74f5e6ad8ff36e53713deafbe1eb6272d26f99a1..938f58bb3d4e39c9d308dd5aacf5dbb58e6e1f29 100644 (file)
--- a/server.c
+++ b/server.c
@@ -271,6 +271,19 @@ static int handle_cur_job(struct fio_net_cmd *cmd)
        return ret;
 }
 
        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;
 static int handle_command(struct fio_net_cmd *cmd)
 {
        int ret;
@@ -280,17 +293,16 @@ static int handle_command(struct fio_net_cmd *cmd)
        switch (cmd->opcode) {
        case FIO_NET_CMD_QUIT:
                fio_terminate_threads(TERMINATE_ALL);
        switch (cmd->opcode) {
        case FIO_NET_CMD_QUIT:
                fio_terminate_threads(TERMINATE_ALL);
-               return 1;
+               return -1;
        case FIO_NET_CMD_EXIT:
                exit_backend = 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_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;
        default:
                log_err("fio: unknown opcode: %d\n", cmd->opcode);
                ret = 1;
@@ -308,7 +320,7 @@ static int handle_connection(int sk)
        while (!exit_backend) {
                cmd = fio_net_recv_cmd(sk);
                if (!cmd) {
        while (!exit_backend) {
                cmd = fio_net_recv_cmd(sk);
                if (!cmd) {
-                       ret = 1;
+                       ret = -1;
                        break;
                }
 
                        break;
                }
 
@@ -407,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));
 #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
 
        }
 #endif
 
@@ -615,7 +627,7 @@ int fio_start_server(int daemonize)
        pid = fork();
        if (pid < 0) {
                syslog(LOG_ERR, "failed server fork");
        pid = fork();
        if (pid < 0) {
                syslog(LOG_ERR, "failed server fork");
-               return 1;
+               return -1;
        } else if (pid)
                exit(0);
 
        } else if (pid)
                exit(0);
 
index 61b61f35d4df1f9b4153ac6bb53829916206d7d8..4783238ba7e77c1b77e668bd60385948224db1bc 100644 (file)
--- a/server.h
+++ b/server.h
@@ -34,12 +34,11 @@ enum {
        FIO_NET_CMD_QUIT        = 1,
        FIO_NET_CMD_EXIT        = 2,
        FIO_NET_CMD_JOB         = 3,
        FIO_NET_CMD_QUIT        = 1,
        FIO_NET_CMD_EXIT        = 2,
        FIO_NET_CMD_JOB         = 3,
-       FIO_NET_CMD_ACK         = 4,
-       FIO_NET_CMD_NAK         = 5,
-       FIO_NET_CMD_TEXT        = 6,
-       FIO_NET_CMD_TS          = 7,
-       FIO_NET_CMD_GS          = 8,
-       FIO_NET_CMD_ETA         = 9,
+       FIO_NET_CMD_TEXT        = 4,
+       FIO_NET_CMD_TS          = 5,
+       FIO_NET_CMD_GS          = 6,
+       FIO_NET_CMD_ETA         = 7,
+       FIO_NET_CMD_PROBE       = 8,
 
        FIO_NET_CMD_F_MORE      = 1UL << 0,
 
 
        FIO_NET_CMD_F_MORE      = 1UL << 0,
 
@@ -53,6 +52,13 @@ struct cmd_ts_pdu {
        struct group_run_stats rs;
 };
 
        struct group_run_stats rs;
 };
 
+struct cmd_probe_pdu {
+       uint8_t hostname[64];
+       uint8_t fio_major;
+       uint8_t fio_minor;
+       uint8_t fio_patch;
+};
+
 extern int fio_start_server(int);
 extern int fio_server_text_output(const char *, unsigned int len);
 extern int fio_server_log(const char *format, ...);
 extern int fio_start_server(int);
 extern int fio_server_text_output(const char *, unsigned int len);
 extern int fio_server_log(const char *format, ...);