The event service uses barriers internally to ensure it has synchronized
its db before continuing. We send fake barriers in evil.c.
Index: exec/evil.c
===================================================================
--- exec/evil.c (revision 2308)
+++ exec/evil.c (working copy)
@@ -87,8 +87,17 @@
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);
static struct sync_callbacks clm_sync_operations = {
@@ -99,6 +108,14 @@
.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 @@
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 @@
{
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;
+}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais