Returning ring id will be used in poll function.
Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
---
cts/agents/votequorum_test_agent.c | 1 +
exec/votequorum.c | 3 +++
include/corosync/ipc_votequorum.h | 14 ++++++++++++++
include/corosync/votequorum.h | 6 ++++++
lib/votequorum.c | 3 +++
man/votequorum_initialize.3.in | 5 +++++
test/testvotequorum1.c | 3 +++
7 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/cts/agents/votequorum_test_agent.c
b/cts/agents/votequorum_test_agent.c
index e460f25..c61a4af 100644
--- a/cts/agents/votequorum_test_agent.c
+++ b/cts/agents/votequorum_test_agent.c
@@ -61,6 +61,7 @@ static void votequorum_notification_fn(
votequorum_handle_t handle,
uint64_t context,
uint32_t quorate,
+ votequorum_ring_id_t ring_id,
uint32_t node_list_entries,
votequorum_node_t node_list[])
{
diff --git a/exec/votequorum.c b/exec/votequorum.c
index d365147..54b6fbe 100644
--- a/exec/votequorum.c
+++ b/exec/votequorum.c
@@ -49,6 +49,7 @@
#include <corosync/logsys.h>
#include <corosync/coroapi.h>
#include <corosync/icmap.h>
+#include <corosync/votequorum.h>
#include <corosync/ipc_votequorum.h>
#include "service.h"
@@ -1677,6 +1678,8 @@ static int
votequorum_exec_send_quorum_notification(void *conn, uint64_t context
res_lib_votequorum_notification = (struct
res_lib_votequorum_notification *)&buf;
res_lib_votequorum_notification->quorate = cluster_is_quorate;
res_lib_votequorum_notification->node_list_entries =
cluster_members;
+ res_lib_votequorum_notification->ring_id.nodeid =
quorum_ringid.rep.nodeid;
+ res_lib_votequorum_notification->ring_id.seq = quorum_ringid.seq;
res_lib_votequorum_notification->context = context;
list_iterate(tmp, &cluster_members_list) {
node = list_entry(tmp, struct cluster_node, list);
diff --git a/include/corosync/ipc_votequorum.h
b/include/corosync/ipc_votequorum.h
index c7bb3ed..0fdcd8b 100644
--- a/include/corosync/ipc_votequorum.h
+++ b/include/corosync/ipc_votequorum.h
@@ -61,6 +61,11 @@ enum res_votequorum_types {
MESSAGE_RES_VOTEQUORUM_EXPECTEDVOTES_NOTIFICATION
};
+struct mar_votequorum_ring_id {
+ mar_uint32_t nodeid;
+ mar_uint64_t seq;
+};
+
struct req_lib_votequorum_qdevice_register {
struct qb_ipc_request_header header __attribute__((aligned(8)));
char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN];
@@ -157,6 +162,7 @@ struct res_lib_votequorum_notification {
struct qb_ipc_response_header header __attribute__((aligned(8)));
mar_uint32_t quorate __attribute__((aligned(8)));
mar_uint64_t context __attribute__((aligned(8)));
+ struct mar_votequorum_ring_id ring_id __attribute__((aligned(8)));
mar_uint32_t node_list_entries __attribute__((aligned(8)));
struct votequorum_node node_list[] __attribute__((aligned(8)));
};
@@ -167,4 +173,12 @@ struct
res_lib_votequorum_expectedvotes_notification {
mar_uint32_t expected_votes __attribute__((aligned(8)));
};
+static inline void marshall_from_mar_votequorum_ring_id (
+ votequorum_ring_id_t *dest,
+ const struct mar_votequorum_ring_id *src)
+{
+ dest->nodeid = src->nodeid;
+ dest->seq = src->seq;
+};
+
#endif
diff --git a/include/corosync/votequorum.h
b/include/corosync/votequorum.h
index c85f281..bba964b 100644
--- a/include/corosync/votequorum.h
+++ b/include/corosync/votequorum.h
@@ -81,10 +81,16 @@ typedef struct {
uint32_t state;
} votequorum_node_t;
+typedef struct {
+ uint32_t nodeid;
+ uint64_t seq;
+} votequorum_ring_id_t;
+
typedef void (*votequorum_notification_fn_t) (
votequorum_handle_t handle,
uint64_t context,
uint32_t quorate,
+ votequorum_ring_id_t ring_id,
uint32_t node_list_entries,
votequorum_node_t node_list[]);
diff --git a/lib/votequorum.c b/lib/votequorum.c
index 56ac517..20843cf 100644
--- a/lib/votequorum.c
+++ b/lib/votequorum.c
@@ -438,6 +438,7 @@ cs_error_t votequorum_dispatch (
struct res_lib_votequorum_notification
*res_lib_votequorum_notification;
struct res_lib_votequorum_expectedvotes_notification
*res_lib_votequorum_expectedvotes_notification;
char dispatch_buf[IPC_DISPATCH_SIZE];
+ votequorum_ring_id_t ring_id;
if (dispatch_types != CS_DISPATCH_ONE &&
dispatch_types != CS_DISPATCH_ALL &&
@@ -507,10 +508,12 @@ cs_error_t votequorum_dispatch (
break;
}
res_lib_votequorum_notification = (struct
res_lib_votequorum_notification *)dispatch_data;
+ marshall_from_mar_votequorum_ring_id (&ring_id,
&res_lib_votequorum_notification->ring_id);
callbacks.votequorum_notify_fn ( handle,
res_lib_votequorum_notification->context,
res_lib_votequorum_notification->quorate,
+ ring_id,
res_lib_votequorum_notification->node_list_entries,
(votequorum_node_t
*)res_lib_votequorum_notification->node_list );
;
diff --git a/man/votequorum_initialize.3.in
b/man/votequorum_initialize.3.in
index 64b78de..b74f964 100644
--- a/man/votequorum_initialize.3.in
+++ b/man/votequorum_initialize.3.in
@@ -64,6 +64,11 @@ typedef void (*votequorum_notification_fn_t) (
);
.fi
+
+Current ring_id (one get in votequorum_notification_fn) have to be
passed to
+.B votequorum_qdevice_poll
+to make qdevice voting valid.
+
.PP
Every time the expected votes are changed, the callback is called.
The expected votes callback function is described by the following
type definitions:
diff --git a/test/testvotequorum1.c b/test/testvotequorum1.c
index 0e443c3..87547ae 100644
--- a/test/testvotequorum1.c
+++ b/test/testvotequorum1.c
@@ -35,6 +35,7 @@
#include <config.h>
#include <sys/types.h>
+#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
@@ -79,6 +80,7 @@ static void votequorum_notification_fn(
votequorum_handle_t handle,
uint64_t context,
uint32_t quorate,
+ votequorum_ring_id_t ring_id,
uint32_t node_list_entries,
votequorum_node_t node_list[]
)
@@ -88,6 +90,7 @@ static void votequorum_notification_fn(
printf("votequorum notification called \n");
printf(" quorate = %d\n", quorate);
printf(" number of nodes = %d\n", node_list_entries);
+ printf(" current ringid = (%u.%"PRIu64")\n", ring_id.nodeid,
ring_id.seq);
for (i = 0; i< node_list_entries; i++) {
printf(" %d: %s\n", node_list[i].nodeid,
node_state(node_list[i].state));