|
@@ -91,7 +91,6 @@
|
|
|
#include "totemnet.h"
|
|
#include "totemnet.h"
|
|
|
|
|
|
|
|
#include "cs_queue.h"
|
|
#include "cs_queue.h"
|
|
|
-#include "util.h"
|
|
|
|
|
|
|
|
|
|
#define LOCALHOST_IP inet_addr("127.0.0.1")
|
|
#define LOCALHOST_IP inet_addr("127.0.0.1")
|
|
|
#define QUEUE_RTR_ITEMS_SIZE_MAX 16384 /* allow 16384 retransmit items */
|
|
#define QUEUE_RTR_ITEMS_SIZE_MAX 16384 /* allow 16384 retransmit items */
|
|
@@ -467,6 +466,14 @@ struct totemsrp_instance {
|
|
|
void (*totemsrp_waiting_trans_ack_cb_fn) (
|
|
void (*totemsrp_waiting_trans_ack_cb_fn) (
|
|
|
int waiting_trans_ack);
|
|
int waiting_trans_ack);
|
|
|
|
|
|
|
|
|
|
+ void (*memb_ring_id_create_or_load) (
|
|
|
|
|
+ struct memb_ring_id *memb_ring_id,
|
|
|
|
|
+ const struct totem_ip_address *addr);
|
|
|
|
|
+
|
|
|
|
|
+ void (*memb_ring_id_store) (
|
|
|
|
|
+ const struct memb_ring_id *memb_ring_id,
|
|
|
|
|
+ const struct totem_ip_address *addr);
|
|
|
|
|
+
|
|
|
int global_seqno;
|
|
int global_seqno;
|
|
|
|
|
|
|
|
int my_token_held;
|
|
int my_token_held;
|
|
@@ -623,8 +630,6 @@ static int srp_addr_equal (const struct srp_addr *a, const struct srp_addr *b);
|
|
|
|
|
|
|
|
static void memb_leave_message_send (struct totemsrp_instance *instance);
|
|
static void memb_leave_message_send (struct totemsrp_instance *instance);
|
|
|
|
|
|
|
|
-static void memb_ring_id_create_or_load (struct totemsrp_instance *, struct memb_ring_id *);
|
|
|
|
|
-
|
|
|
|
|
static void token_callbacks_execute (struct totemsrp_instance *instance, enum totem_callback_token_type type);
|
|
static void token_callbacks_execute (struct totemsrp_instance *instance, enum totem_callback_token_type type);
|
|
|
static void memb_state_gather_enter (struct totemsrp_instance *instance, enum gather_state_from gather_from);
|
|
static void memb_state_gather_enter (struct totemsrp_instance *instance, enum gather_state_from gather_from);
|
|
|
static void messages_deliver_to_app (struct totemsrp_instance *instance, int skip, unsigned int end_point);
|
|
static void messages_deliver_to_app (struct totemsrp_instance *instance, int skip, unsigned int end_point);
|
|
@@ -632,7 +637,7 @@ static int orf_token_mcast (struct totemsrp_instance *instance, struct orf_token
|
|
|
int fcc_mcasts_allowed);
|
|
int fcc_mcasts_allowed);
|
|
|
static void messages_free (struct totemsrp_instance *instance, unsigned int token_aru);
|
|
static void messages_free (struct totemsrp_instance *instance, unsigned int token_aru);
|
|
|
|
|
|
|
|
-static void memb_ring_id_set_and_store (struct totemsrp_instance *instance,
|
|
|
|
|
|
|
+static void memb_ring_id_set (struct totemsrp_instance *instance,
|
|
|
const struct memb_ring_id *ring_id);
|
|
const struct memb_ring_id *ring_id);
|
|
|
static void target_set_completed (void *context);
|
|
static void target_set_completed (void *context);
|
|
|
static void memb_state_commit_token_update (struct totemsrp_instance *instance);
|
|
static void memb_state_commit_token_update (struct totemsrp_instance *instance);
|
|
@@ -871,6 +876,12 @@ int totemsrp_initialize (
|
|
|
instance->totemsrp_subsys_id = totem_config->totem_logging_configuration.log_subsys_id;
|
|
instance->totemsrp_subsys_id = totem_config->totem_logging_configuration.log_subsys_id;
|
|
|
instance->totemsrp_log_printf = totem_config->totem_logging_configuration.log_printf;
|
|
instance->totemsrp_log_printf = totem_config->totem_logging_configuration.log_printf;
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Configure totem store and load functions
|
|
|
|
|
+ */
|
|
|
|
|
+ instance->memb_ring_id_create_or_load = totem_config->totem_memb_ring_id_create_or_load;
|
|
|
|
|
+ instance->memb_ring_id_store = totem_config->totem_memb_ring_id_store;
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
* Initialize local variables for totemsrp
|
|
* Initialize local variables for totemsrp
|
|
|
*/
|
|
*/
|
|
@@ -2107,7 +2118,8 @@ static void memb_state_commit_enter (
|
|
|
|
|
|
|
|
instance->memb_timer_state_gather_consensus_timeout = 0;
|
|
instance->memb_timer_state_gather_consensus_timeout = 0;
|
|
|
|
|
|
|
|
- memb_ring_id_set_and_store (instance, &instance->commit_token->ring_id);
|
|
|
|
|
|
|
+ memb_ring_id_set (instance, &instance->commit_token->ring_id);
|
|
|
|
|
+ instance->memb_ring_id_store (&instance->my_ring_id, &instance->my_id.addr[0]);
|
|
|
|
|
|
|
|
instance->token_ring_id_seq = instance->my_ring_id.seq;
|
|
instance->token_ring_id_seq = instance->my_ring_id.seq;
|
|
|
|
|
|
|
@@ -3292,79 +3304,12 @@ static void memb_merge_detect_transmit (struct totemsrp_instance *instance)
|
|
|
sizeof (struct memb_merge_detect));
|
|
sizeof (struct memb_merge_detect));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void memb_ring_id_create_or_load (
|
|
|
|
|
- struct totemsrp_instance *instance,
|
|
|
|
|
- struct memb_ring_id *memb_ring_id)
|
|
|
|
|
-{
|
|
|
|
|
- int fd;
|
|
|
|
|
- int res = 0;
|
|
|
|
|
- char filename[PATH_MAX];
|
|
|
|
|
-
|
|
|
|
|
- snprintf (filename, sizeof(filename), "%s/ringid_%s",
|
|
|
|
|
- get_run_dir(), totemip_print (&instance->my_id.addr[0]));
|
|
|
|
|
- fd = open (filename, O_RDONLY, 0700);
|
|
|
|
|
- /*
|
|
|
|
|
- * If file can be opened and read, read the ring id
|
|
|
|
|
- */
|
|
|
|
|
- if (fd != -1) {
|
|
|
|
|
- res = read (fd, &memb_ring_id->seq, sizeof (uint64_t));
|
|
|
|
|
- close (fd);
|
|
|
|
|
- }
|
|
|
|
|
- /*
|
|
|
|
|
- * If file could not be opened or read, create a new ring id
|
|
|
|
|
- */
|
|
|
|
|
- if ((fd == -1) || (res != sizeof (uint64_t))) {
|
|
|
|
|
- memb_ring_id->seq = 0;
|
|
|
|
|
- umask(0);
|
|
|
|
|
- fd = open (filename, O_CREAT|O_RDWR, 0700);
|
|
|
|
|
- if (fd != -1) {
|
|
|
|
|
- res = write (fd, &memb_ring_id->seq, sizeof (uint64_t));
|
|
|
|
|
- close (fd);
|
|
|
|
|
- if (res == -1) {
|
|
|
|
|
- LOGSYS_PERROR (errno, instance->totemsrp_log_level_warning,
|
|
|
|
|
- "Couldn't write ringid file '%s'", filename);
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- LOGSYS_PERROR (errno, instance->totemsrp_log_level_warning,
|
|
|
|
|
- "Couldn't create ringid file '%s'", filename);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- totemip_copy(&memb_ring_id->rep, &instance->my_id.addr[0]);
|
|
|
|
|
- assert (!totemip_zero_check(&memb_ring_id->rep));
|
|
|
|
|
- instance->token_ring_id_seq = memb_ring_id->seq;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-static void memb_ring_id_set_and_store (
|
|
|
|
|
|
|
+static void memb_ring_id_set (
|
|
|
struct totemsrp_instance *instance,
|
|
struct totemsrp_instance *instance,
|
|
|
const struct memb_ring_id *ring_id)
|
|
const struct memb_ring_id *ring_id)
|
|
|
{
|
|
{
|
|
|
- char filename[256];
|
|
|
|
|
- int fd;
|
|
|
|
|
- int res;
|
|
|
|
|
|
|
|
|
|
memcpy (&instance->my_ring_id, ring_id, sizeof (struct memb_ring_id));
|
|
memcpy (&instance->my_ring_id, ring_id, sizeof (struct memb_ring_id));
|
|
|
-
|
|
|
|
|
- snprintf (filename, sizeof(filename), "%s/ringid_%s",
|
|
|
|
|
- get_run_dir(), totemip_print (&instance->my_id.addr[0]));
|
|
|
|
|
-
|
|
|
|
|
- fd = open (filename, O_WRONLY, 0777);
|
|
|
|
|
- if (fd == -1) {
|
|
|
|
|
- fd = open (filename, O_CREAT|O_RDWR, 0777);
|
|
|
|
|
- }
|
|
|
|
|
- if (fd == -1) {
|
|
|
|
|
- LOGSYS_PERROR(errno, instance->totemsrp_log_level_warning,
|
|
|
|
|
- "Couldn't store new ring id %llx to stable storage",
|
|
|
|
|
- instance->my_ring_id.seq);
|
|
|
|
|
- assert (0);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- log_printf (instance->totemsrp_log_level_debug,
|
|
|
|
|
- "Storing new sequence id for ring %llx", instance->my_ring_id.seq);
|
|
|
|
|
- //assert (fd > 0);
|
|
|
|
|
- res = write (fd, &instance->my_ring_id.seq, sizeof (unsigned long long));
|
|
|
|
|
- assert (res == sizeof (unsigned long long));
|
|
|
|
|
- close (fd);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int totemsrp_callback_token_create (
|
|
int totemsrp_callback_token_create (
|
|
@@ -4641,7 +4586,9 @@ void main_iface_change_fn (
|
|
|
totemip_copy (&instance->my_memb_list[0].addr[iface_no], iface_addr);
|
|
totemip_copy (&instance->my_memb_list[0].addr[iface_no], iface_addr);
|
|
|
|
|
|
|
|
if (instance->iface_changes++ == 0) {
|
|
if (instance->iface_changes++ == 0) {
|
|
|
- memb_ring_id_create_or_load (instance, &instance->my_ring_id);
|
|
|
|
|
|
|
+ instance->memb_ring_id_create_or_load (&instance->my_ring_id,
|
|
|
|
|
+ &instance->my_id.addr[0]);
|
|
|
|
|
+ instance->token_ring_id_seq = instance->my_ring_id.seq;
|
|
|
log_printf (
|
|
log_printf (
|
|
|
instance->totemsrp_log_level_debug,
|
|
instance->totemsrp_log_level_debug,
|
|
|
"Created or loaded sequence id %llx.%s for this ring.",
|
|
"Created or loaded sequence id %llx.%s for this ring.",
|