CTS: make test agent shutdown more gracefully

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
Reviewed-by: Steven Dake <sdake@redhat.com>
This commit is contained in:
Angus Salkeld 2010-12-14 16:12:28 +10:00
parent d3f0a492d2
commit 90745acb39
6 changed files with 102 additions and 31 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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;
}

View File

@ -570,6 +570,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;
@ -578,6 +580,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;
@ -594,6 +598,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;
@ -602,6 +608,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;
@ -687,9 +695,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);
@ -760,15 +773,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;
}

View File

@ -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;
}

View File

@ -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,14 @@ 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;
}
@ -98,10 +103,14 @@ 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;
}
@ -222,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);
}
@ -243,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);
}
@ -321,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;
}