Browse Source

Send fake barriers for the event service when operating in compatibility mode
whitetank.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2309 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 16 years ago
parent
commit
654810365b
1 changed files with 100 additions and 2 deletions
  1. 100 2
      exec/evil.c

+ 100 - 2
exec/evil.c

@@ -87,7 +87,16 @@ static void clm_sync_activate (void);
 
 static void clm_sync_abort (void);
 
-static int clm_nodejoin_send (void);
+static void evt_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
+
+static int evt_sync_process (void);
+
+static void evt_sync_activate (void);
+
+static void evt_sync_abort (void);
 
 static int clm_hack_init (void);
 
@@ -99,6 +108,14 @@ static struct sync_callbacks clm_sync_operations = {
 	.sync_abort		= clm_sync_abort,
 };
 
+static struct sync_callbacks evt_sync_operations = {
+	.name			= "dummy EVT service",
+	.sync_init		= evt_sync_init,
+	.sync_process		= evt_sync_process,
+	.sync_activate		= evt_sync_activate,
+	.sync_abort		= evt_sync_abort,
+};
+
 static struct corosync_api_v1 *api = NULL;
 
 static void sync_dummy_init (
@@ -152,7 +169,8 @@ extern int evil_callbacks_load (int sync_id,
 			callbacks->name = "dummy CKPT service";
 			break;
 		case EVT_SERVICE:
-			callbacks->name = "dummy EVT service";
+			memcpy (callbacks, &evt_sync_operations, sizeof (struct sync_callbacks));
+			callbacks_init = 0;
 			break;
 		case LCK_SERVICE:
 			callbacks_init = 0;
@@ -366,3 +384,83 @@ static void clm_sync_abort (void)
 {
 	return;
 }
+
+enum evt_sync_states {
+	EVT_SYNC_PART_ONE,
+	EVT_SYNC_PART_TWO
+};
+
+static enum evt_sync_states evt_sync_state;
+
+enum evt_chan_ops {
+	EVT_OPEN_CHAN_OP,               /* chc_chan */
+	EVT_CLOSE_CHAN_OP,              /* chc_close_unlink_chan */
+	EVT_UNLINK_CHAN_OP,             /* chc_close_unlink_chan */
+	EVT_CLEAR_RET_OP,               /* chc_event_id */
+	EVT_SET_ID_OP,                  /* chc_set_id */
+	EVT_CONF_DONE,                  /* no data used */
+	EVT_OPEN_COUNT,                 /* chc_set_opens */
+	EVT_OPEN_COUNT_DONE             /* no data used */
+};
+
+enum evt_message_req_types {
+	MESSAGE_REQ_EXEC_EVT_EVENTDATA = 0,
+	MESSAGE_REQ_EXEC_EVT_CHANCMD = 1,
+	MESSAGE_REQ_EXEC_EVT_RECOVERY_EVENTDATA = 2
+};
+
+struct req_evt_chan_command {
+	mar_req_header_t chc_head __attribute__((aligned(8)));
+	mar_uint32_t chc_op __attribute__((aligned(8)));
+};
+
+static void evt_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
+{
+	evt_sync_state = EVT_SYNC_PART_ONE;
+	return;
+}
+
+static int evt_sync_process (void)
+{
+	int res;
+	struct req_evt_chan_command cpkt;
+	struct iovec chn_iovec;
+
+	memset(&cpkt, 0, sizeof(cpkt));
+	cpkt.chc_head.id =
+		SERVICE_ID_MAKE(EVT_SERVICE, MESSAGE_REQ_EXEC_EVT_CHANCMD);
+	cpkt.chc_head.size = sizeof(cpkt);
+	chn_iovec.iov_base = &cpkt;
+	chn_iovec.iov_len = cpkt.chc_head.size;
+
+	if (evt_sync_state == EVT_SYNC_PART_ONE) {
+		cpkt.chc_op = EVT_OPEN_COUNT_DONE;
+
+		res = api->totem_mcast(&chn_iovec, 1,TOTEMPG_AGREED);
+		if (res == -1) {
+			return (res);
+		}
+		evt_sync_state = EVT_SYNC_PART_TWO;
+	}
+	if (evt_sync_state == EVT_SYNC_PART_TWO) {
+		cpkt.chc_op = EVT_CONF_DONE;
+		res = api->totem_mcast(&chn_iovec, 1,TOTEMPG_AGREED);
+		if (res == -1) {
+			return (res);
+		}
+	}
+	return (0);
+}
+
+static void evt_sync_activate (void)
+{
+	return;
+}
+
+static void evt_sync_abort (void)
+{
+	return;
+}