mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-10-04 04:08:57 +00:00
cpghum: Allow to continue if corosync is restarted
Signed-off-by: Christine Caulfield <ccaulfie@redhat.com> Reviewed-by: Jan Friesse <jfriesse@redhat.com>
This commit is contained in:
parent
d5b53fd227
commit
f6f6f41a87
@ -431,7 +431,7 @@ static void cpg_flood (
|
||||
}
|
||||
}
|
||||
|
||||
static void cpg_test (
|
||||
static int cpg_test (
|
||||
cpg_handle_t handle_in,
|
||||
int write_size,
|
||||
int delay_time,
|
||||
@ -458,6 +458,10 @@ static void cpg_test (
|
||||
send_retries++;
|
||||
goto resend;
|
||||
}
|
||||
if (res == CS_ERR_LIBRARY) {
|
||||
send_counter--;
|
||||
return -1;
|
||||
}
|
||||
if (res != CS_OK) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "send failed: %d\n", res);
|
||||
send_fails++;
|
||||
@ -478,7 +482,7 @@ static void cpg_test (
|
||||
cpgh_log_printf(CPGH_LOG_RTT, "RTT min/avg/max: %ld/%ld/%ld\n", min_rtt, avg_rtt, max_rtt);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sigalrm_handler (int num)
|
||||
@ -572,6 +576,41 @@ static long parse_bytes(const char *valstring)
|
||||
return value * multiplier;
|
||||
}
|
||||
|
||||
static int connect_and_join(int model, int verbose)
|
||||
{
|
||||
int res;
|
||||
|
||||
switch (model) {
|
||||
case 0:
|
||||
res = cpg_initialize (&handle, &callbacks);
|
||||
break;
|
||||
case 1:
|
||||
res = cpg_model_initialize (&handle, CPG_MODEL_V1, (cpg_model_data_t *)&model1_data, NULL);
|
||||
break;
|
||||
default:
|
||||
res=999; // can't get here but it keeps the compiler happy
|
||||
break;
|
||||
}
|
||||
|
||||
if (res != CS_OK) {
|
||||
if (verbose) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "cpg_initialize failed with result %d\n", res);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
res = cpg_join (handle, &group_name);
|
||||
if (res != CS_OK) {
|
||||
if (verbose) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "cpg_join failed with result %d\n", res);
|
||||
}
|
||||
cpg_finalize(handle);
|
||||
return -1;
|
||||
}
|
||||
pthread_create (&thread, NULL, dispatch_thread, NULL);
|
||||
return CS_OK;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char *argv[]) {
|
||||
int i;
|
||||
@ -707,36 +746,17 @@ int main (int argc, char *argv[]) {
|
||||
|
||||
signal (SIGALRM, sigalrm_handler);
|
||||
signal (SIGINT, sigint_handler);
|
||||
switch (model) {
|
||||
case 0:
|
||||
res = cpg_initialize (&handle, &callbacks);
|
||||
break;
|
||||
case 1:
|
||||
res = cpg_model_initialize (&handle, CPG_MODEL_V1, (cpg_model_data_t *)&model1_data, NULL);
|
||||
break;
|
||||
default:
|
||||
res=999; // can't get here but it keeps the compiler happy
|
||||
break;
|
||||
|
||||
if (connect_and_join(model, 1) != CS_OK) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (res != CS_OK) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "cpg_initialize failed with result %d\n", res);
|
||||
exit (1);
|
||||
}
|
||||
res = cpg_local_get(handle, &g_our_nodeid);
|
||||
if (res != CS_OK) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "cpg_local_get failed with result %d\n", res);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
pthread_create (&thread, NULL, dispatch_thread, NULL);
|
||||
|
||||
res = cpg_join (handle, &group_name);
|
||||
if (res != CS_OK) {
|
||||
cpgh_log_printf(CPGH_LOG_ERR, "cpg_join failed with result %d\n", res);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (listen_only) {
|
||||
int secs = 0;
|
||||
|
||||
@ -786,7 +806,23 @@ int main (int argc, char *argv[]) {
|
||||
else {
|
||||
send_counter = -1; /* So we start from zero to allow listeners to sync */
|
||||
for (i = 0; i < repetitions && !stopped; i++) {
|
||||
cpg_test (handle, write_size, delay_time, print_time);
|
||||
if (cpg_test (handle, write_size, delay_time, print_time) == -1) {
|
||||
/* Try to reconnect when corosync stops */
|
||||
res = -1;
|
||||
cpg_finalize(handle);
|
||||
pthread_cancel(thread);
|
||||
signal (SIGINT, SIG_DFL);
|
||||
printf("Reconnecting...");
|
||||
fflush(stdout);
|
||||
while (res != CS_OK) {
|
||||
sleep(1);
|
||||
printf(".");
|
||||
fflush(stdout);
|
||||
res = connect_and_join(model, 0);
|
||||
}
|
||||
printf("done\n");
|
||||
signal (SIGINT, sigint_handler);
|
||||
}
|
||||
signal (SIGALRM, sigalrm_handler);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user