Signed-off-by: Angus Salkeld <[email protected]>
---
 cts/agents/common_test_agent.c     |   44 +++++++++++++++++++++++++++---------
 cts/agents/common_test_agent.h     |    3 +-
 cts/agents/confdb_test_agent.c     |   10 +++++--
 cts/agents/cpg_test_agent.c        |   33 +++++++++++++++++++++++---
 cts/agents/sam_test_agent.c        |    6 ++--
 cts/agents/votequorum_test_agent.c |   35 +++++++++++++++++++++-------
 6 files changed, 100 insertions(+), 31 deletions(-)

diff --git a/cts/agents/common_test_agent.c b/cts/agents/common_test_agent.c
index ceb311d..03bd677 100644
--- a/cts/agents/common_test_agent.c
+++ b/cts/agents/common_test_agent.c
@@ -55,13 +55,22 @@ int32_t parse_debug = 0;
 static char big_and_buf_rx[HOW_BIG_AND_BUF];
 ta_do_command_fn do_command;
 static qb_loop_t *poll_handle;
-
+static pre_exit_fn pre_exit = NULL;
 
 qb_loop_t *ta_poll_handle_get(void)
 {
        return poll_handle;
 }
 
+static void shut_me_down(void)
+{
+       if (pre_exit) {
+               pre_exit();
+       }
+       qb_loop_stop(poll_handle);
+}
+
+
 static void ta_handle_command (int sock, char* msg)
 {
        int num_args;
@@ -112,6 +121,11 @@ static int server_process_data_fn (
        char *cmd;
        int32_t nbytes;
 
+       if (revents & POLLHUP) {
+               shut_me_down();
+               return -1;
+       }
+
        if ((nbytes = recv (fd, big_and_buf_rx, sizeof (big_and_buf_rx), 0)) <= 
0) {
                /* got error or connection closed by client */
                if (nbytes == 0) {
@@ -120,8 +134,8 @@ static int server_process_data_fn (
                } else {
                        syslog (LOG_ERR,"recv() failed: %s", strerror(errno));
                }
-               close (fd);
-               qb_loop_stop (ta_poll_handle_get());
+               shut_me_down();
+               return -1;
        } else {
                big_and_buf_rx[nbytes] = '\0';
 
@@ -146,6 +160,11 @@ static int server_accept_fn (
        int new_fd;
        int res;
 
+       if (revents & POLLHUP) {
+               shut_me_down();
+               return -1;
+       }
+
        addrlen = sizeof (struct sockaddr_in);
 
 retry_accept:
@@ -254,23 +273,26 @@ static int create_server_sockect (int server_port)
 
 static int32_t sig_exit_handler (int num, void *data)
 {
-       qb_loop_stop(poll_handle);
+       shut_me_down();
        return 0;
 }
 
-int test_agent_run(int server_port, ta_do_command_fn func)
+int test_agent_run(int server_port, ta_do_command_fn func, pre_exit_fn exit_fn)
 {
        int listener;
 
        do_command = func;
+       pre_exit = exit_fn;
        poll_handle = qb_loop_create ();
 
-       qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
-               SIGINT, NULL, sig_exit_handler, NULL);
-       qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
-               SIGQUIT, NULL, sig_exit_handler, NULL);
-       qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
-               SIGTERM, NULL, sig_exit_handler, NULL);
+       if (exit_fn) {
+               qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
+                       SIGINT, NULL, sig_exit_handler, NULL);
+               qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
+                       SIGQUIT, NULL, sig_exit_handler, NULL);
+               qb_loop_signal_add(poll_handle, QB_LOOP_HIGH,
+                       SIGTERM, NULL, sig_exit_handler, NULL);
+       }
 
        listener = create_server_sockect (server_port);
        qb_loop_poll_add (poll_handle,
diff --git a/cts/agents/common_test_agent.h b/cts/agents/common_test_agent.h
index 37e8e65..477f5c7 100644
--- a/cts/agents/common_test_agent.h
+++ b/cts/agents/common_test_agent.h
@@ -46,8 +46,9 @@ extern int32_t parse_debug;
 #define HOW_BIG_AND_BUF 4096
 
 typedef void (*ta_do_command_fn) (int sock, char* func, char*args[], int 
num_args);
+typedef void (*pre_exit_fn) (void);
 
-int test_agent_run(int server_port, ta_do_command_fn func);
+int test_agent_run(int server_port, ta_do_command_fn func, pre_exit_fn 
exit_fn);
 
 qb_loop_t *ta_poll_handle_get(void);
 
diff --git a/cts/agents/confdb_test_agent.c b/cts/agents/confdb_test_agent.c
index 87165d3..97a3407 100644
--- a/cts/agents/confdb_test_agent.c
+++ b/cts/agents/confdb_test_agent.c
@@ -621,17 +621,21 @@ static void do_command (int sock, char* func, 
char*args[], int num_args)
        }
 }
 
+static void my_pre_exit(void)
+{
+       syslog (LOG_INFO, "%s PRE EXIT", __FILE__);
+}
 
 int main (int argc, char *argv[])
 {
        int ret;
 
        openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
-       syslog (LOG_ERR, "confdb_test_agent STARTING");
+       syslog (LOG_ERR, "%s STARTING", __FILE__);
 
        parse_debug = 1;
-       ret = test_agent_run (9035, do_command);
-       syslog (LOG_ERR, "confdb_test_agent EXITING");
+       ret = test_agent_run (9035, do_command, my_pre_exit);
+       syslog (LOG_ERR, "%s EXITING", __FILE__);
 
        return ret;
 }
diff --git a/cts/agents/cpg_test_agent.c b/cts/agents/cpg_test_agent.c
index 614497a..9c340a6 100644
--- a/cts/agents/cpg_test_agent.c
+++ b/cts/agents/cpg_test_agent.c
@@ -567,6 +567,8 @@ static int cfg_dispatch_wrapper_fn (
        cs_error_t error;
        if (revents & POLLHUP || revents & POLLERR) {
                syslog (LOG_ERR, "%s() got POLLHUP disconnecting from CFG", 
__func__);
+               corosync_cfg_finalize(cfg_handle);
+               cfg_handle = 0;
                qb_loop_poll_del (ta_poll_handle_get(), cfg_fd);
                close (cfg_fd);
                cfg_fd = -1;
@@ -575,6 +577,8 @@ static int cfg_dispatch_wrapper_fn (
        error = corosync_cfg_dispatch (cfg_handle, CS_DISPATCH_ALL);
        if (error == CS_ERR_LIBRARY) {
                syslog (LOG_ERR, "%s() got LIB error disconnecting from CFG.", 
__func__);
+               corosync_cfg_finalize(cfg_handle);
+               cfg_handle = 0;
                qb_loop_poll_del (ta_poll_handle_get(), cfg_fd);
                close (cfg_fd);
                cfg_fd = -1;
@@ -591,6 +595,8 @@ static int cpg_dispatch_wrapper_fn (
        cs_error_t error;
        if (revents & POLLHUP || revents & POLLERR) {
                syslog (LOG_ERR, "%s() got POLLHUP disconnecting from CPG", 
__func__);
+               cpg_finalize(cpg_handle);
+               cpg_handle = 0;
                qb_loop_poll_del (ta_poll_handle_get(), cpg_fd);
                close (cpg_fd);
                cpg_fd = -1;
@@ -599,6 +605,8 @@ static int cpg_dispatch_wrapper_fn (
        error = cpg_dispatch (cpg_handle, CS_DISPATCH_ALL);
        if (error == CS_ERR_LIBRARY) {
                syslog (LOG_ERR, "%s() got LIB error disconnecting from CPG", 
__func__);
+               cpg_finalize(cpg_handle);
+               cpg_handle = 0;
                qb_loop_poll_del (ta_poll_handle_get(), cpg_fd);
                close (cpg_fd);
                cpg_fd = -1;
@@ -684,9 +692,14 @@ static void do_command (int sock, char* func, char*args[], 
int num_args)
                send (sock, response, strlen (response), 0);
        } else if (strcmp ("cpg_finalize", func) == 0) {
 
-               cpg_finalize (cpg_handle);
-               qb_loop_poll_del (ta_poll_handle_get(), cpg_fd);
-               cpg_fd = -1;
+               if (cpg_handle > 0) {
+                       cpg_finalize (cpg_handle);
+                       cpg_handle = 0;
+               }
+               if (cpg_fd > 0) {
+                       qb_loop_poll_del (ta_poll_handle_get(), cpg_fd);
+                       cpg_fd = -1;
+               }
 
        } else if (strcmp ("record_config_events", func) == 0) {
                record_config_events (sock);
@@ -757,15 +770,27 @@ static void cs_ipcs_libqb_log_fn(const char *file_name,
        syslog(severity, "%s:%d %s() %s", file_name, file_line, __func__, msg);
 }
 
+static void my_pre_exit(void)
+{
+       syslog (LOG_INFO, "%s PRE EXIT", __FILE__);
+       if (cpg_handle > 0) {
+               cpg_finalize (cpg_handle);
+               cpg_handle = 0;
+       }
+}
 
 int main (int argc, char *argv[])
 {
+       int res = 0;
        openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
+       syslog (LOG_INFO, "%s STARTING", __FILE__);
 
        qb_util_set_log_function (cs_ipcs_libqb_log_fn);
        list_init (&msg_log_head);
        list_init (&config_chg_log_head);
 
-       return test_agent_run (9034, do_command);
+       res = test_agent_run (9034, do_command, my_pre_exit);
+       syslog (LOG_INFO, "%s EXITING", __FILE__);
+       return res;
 }
 
diff --git a/cts/agents/sam_test_agent.c b/cts/agents/sam_test_agent.c
index 430a907..c527a93 100644
--- a/cts/agents/sam_test_agent.c
+++ b/cts/agents/sam_test_agent.c
@@ -1495,11 +1495,11 @@ int main (int argc, char *argv[])
        int ret;
 
        openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
-       syslog (LOG_ERR, "sam_test_agent STARTING");
+       syslog (LOG_INFO, "%s STARTNG", __FILE__);
 
        parse_debug = 1;
-       ret = test_agent_run (9036, do_command);
-       syslog (LOG_ERR, "sam_test_agent EXITING");
+       ret = test_agent_run (9036, do_command, NULL);
+       syslog (LOG_INFO, "%s EXITING", __FILE__);
 
        return ret;
 }
diff --git a/cts/agents/votequorum_test_agent.c 
b/cts/agents/votequorum_test_agent.c
index 11851fb..ceb983e 100644
--- a/cts/agents/votequorum_test_agent.c
+++ b/cts/agents/votequorum_test_agent.c
@@ -53,6 +53,7 @@
 #include <corosync/votequorum.h>
 #include <corosync/quorum.h>
 #include "common_test_agent.h"
+#include "../../lib/util.h"
 
 static quorum_handle_t q_handle = 0;
 static votequorum_handle_t vq_handle = 0;
@@ -84,10 +85,13 @@ static int vq_dispatch_wrapper_fn (
        void *data)
 {
        cs_error_t error = votequorum_dispatch (vq_handle, CS_DISPATCH_ALL);
-       if (error == CS_ERR_LIBRARY) {
-               syslog (LOG_ERR, "%s() got LIB error disconnecting from 
corosync.", __func__);
+       if (error != CS_OK) {
+               syslog (LOG_ERR, "%s() got %s error, disconnecting.",
+                       __func__, cs_strerror(error));
+               votequorum_finalize(vq_handle);
                qb_loop_poll_del (ta_poll_handle_get(), fd);
                close (fd);
+               vq_handle = 0;
                return -1;
        }
        return 0;
@@ -99,10 +103,13 @@ static int q_dispatch_wrapper_fn (
        void *data)
 {
        cs_error_t error = quorum_dispatch (q_handle, CS_DISPATCH_ALL);
-       if (error == CS_ERR_LIBRARY) {
-               syslog (LOG_ERR, "%s() got LIB error disconnecting from 
corosync.", __func__);
+       if (error != CS_OK) {
+               syslog (LOG_ERR, "%s() got %s error, disconnecting.",
+                       __func__, cs_strerror(error));
+               quorum_finalize(q_handle);
                qb_loop_poll_del (ta_poll_handle_get(), fd);
                close (fd);
+               q_handle = 0;
                return -1;
        }
        return 0;
@@ -224,7 +231,6 @@ static void setexpected (int sock, char *arg)
        snprintf (response, 100, "%s", OK_STR);
 
 send_response:
-       votequorum_finalize (vq_handle);
        send (sock, response, strlen (response) + 1, 0);
 }
 
@@ -245,7 +251,6 @@ static void setvotes (int sock, char *arg)
        snprintf (response, 100, "%s", OK_STR);
 
 send_response:
-       votequorum_finalize (vq_handle);
        send (sock, response, strlen (response), 0);
 }
 
@@ -323,17 +328,29 @@ static void do_command (int sock, char* func, 
char*args[], int num_args)
        }
 }
 
+static void my_pre_exit(void)
+{
+       syslog (LOG_INFO, "PRE EXIT");
+       if (vq_handle) {
+               votequorum_finalize(vq_handle);
+               vq_handle = 0;
+       }
+       if (q_handle) {
+               quorum_finalize(q_handle);
+               q_handle = 0;
+       }
+}
 
 int main (int argc, char *argv[])
 {
        int ret;
 
        openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
-       syslog (LOG_ERR, "votequorum_test_agent STARTING");
+       syslog (LOG_INFO, "%s STARTING", __FILE__);
 
        parse_debug = 1;
-       ret = test_agent_run (9037, do_command);
-       syslog (LOG_ERR, "votequorum_test_agent EXITING");
+       ret = test_agent_run (9037, do_command, my_pre_exit);
+       syslog (LOG_INFO, "EXITING");
 
        return ret;
 }
-- 
1.7.3.1

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to