Selaa lähdekoodia

votequorum: Return current ring id in callback

Returning ring id will be used in poll function.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Jan Friesse 11 vuotta sitten
vanhempi
commit
5f6f68805c

+ 1 - 0
cts/agents/votequorum_test_agent.c

@@ -61,6 +61,7 @@ static void votequorum_notification_fn(
 	votequorum_handle_t handle,
 	votequorum_handle_t handle,
 	uint64_t context,
 	uint64_t context,
 	uint32_t quorate,
 	uint32_t quorate,
+	votequorum_ring_id_t ring_id,
 	uint32_t node_list_entries,
 	uint32_t node_list_entries,
 	votequorum_node_t node_list[])
 	votequorum_node_t node_list[])
 {
 {

+ 3 - 0
exec/votequorum.c

@@ -49,6 +49,7 @@
 #include <corosync/logsys.h>
 #include <corosync/logsys.h>
 #include <corosync/coroapi.h>
 #include <corosync/coroapi.h>
 #include <corosync/icmap.h>
 #include <corosync/icmap.h>
+#include <corosync/votequorum.h>
 #include <corosync/ipc_votequorum.h>
 #include <corosync/ipc_votequorum.h>
 
 
 #include "service.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 = (struct res_lib_votequorum_notification *)&buf;
 	res_lib_votequorum_notification->quorate = cluster_is_quorate;
 	res_lib_votequorum_notification->quorate = cluster_is_quorate;
 	res_lib_votequorum_notification->node_list_entries = cluster_members;
 	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;
 	res_lib_votequorum_notification->context = context;
 	list_iterate(tmp, &cluster_members_list) {
 	list_iterate(tmp, &cluster_members_list) {
 		node = list_entry(tmp, struct cluster_node, list);
 		node = list_entry(tmp, struct cluster_node, list);

+ 14 - 0
include/corosync/ipc_votequorum.h

@@ -61,6 +61,11 @@ enum res_votequorum_types {
 	MESSAGE_RES_VOTEQUORUM_EXPECTEDVOTES_NOTIFICATION
 	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 req_lib_votequorum_qdevice_register {
 	struct qb_ipc_request_header header __attribute__((aligned(8)));
 	struct qb_ipc_request_header header __attribute__((aligned(8)));
 	char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN];
 	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)));
 	struct qb_ipc_response_header header __attribute__((aligned(8)));
 	mar_uint32_t quorate __attribute__((aligned(8)));
 	mar_uint32_t quorate __attribute__((aligned(8)));
 	mar_uint64_t context __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)));
 	mar_uint32_t node_list_entries __attribute__((aligned(8)));
 	struct votequorum_node node_list[] __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)));
 	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
 #endif

+ 6 - 0
include/corosync/votequorum.h

@@ -81,10 +81,16 @@ typedef struct {
 	uint32_t state;
 	uint32_t state;
 } votequorum_node_t;
 } votequorum_node_t;
 
 
+typedef struct {
+	uint32_t nodeid;
+	uint64_t seq;
+} votequorum_ring_id_t;
+
 typedef void (*votequorum_notification_fn_t) (
 typedef void (*votequorum_notification_fn_t) (
 	votequorum_handle_t handle,
 	votequorum_handle_t handle,
 	uint64_t context,
 	uint64_t context,
 	uint32_t quorate,
 	uint32_t quorate,
+	votequorum_ring_id_t ring_id,
 	uint32_t node_list_entries,
 	uint32_t node_list_entries,
 	votequorum_node_t node_list[]);
 	votequorum_node_t node_list[]);
 
 

+ 3 - 0
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_notification *res_lib_votequorum_notification;
 	struct res_lib_votequorum_expectedvotes_notification *res_lib_votequorum_expectedvotes_notification;
 	struct res_lib_votequorum_expectedvotes_notification *res_lib_votequorum_expectedvotes_notification;
 	char dispatch_buf[IPC_DISPATCH_SIZE];
 	char dispatch_buf[IPC_DISPATCH_SIZE];
+	votequorum_ring_id_t ring_id;
 
 
 	if (dispatch_types != CS_DISPATCH_ONE &&
 	if (dispatch_types != CS_DISPATCH_ONE &&
 		dispatch_types != CS_DISPATCH_ALL &&
 		dispatch_types != CS_DISPATCH_ALL &&
@@ -507,10 +508,12 @@ cs_error_t votequorum_dispatch (
 				break;
 				break;
 			}
 			}
 			res_lib_votequorum_notification = (struct res_lib_votequorum_notification *)dispatch_data;
 			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,
 			callbacks.votequorum_notify_fn ( handle,
 							 res_lib_votequorum_notification->context,
 							 res_lib_votequorum_notification->context,
 							 res_lib_votequorum_notification->quorate,
 							 res_lib_votequorum_notification->quorate,
+							 ring_id,
 							 res_lib_votequorum_notification->node_list_entries,
 							 res_lib_votequorum_notification->node_list_entries,
 							 (votequorum_node_t *)res_lib_votequorum_notification->node_list );
 							 (votequorum_node_t *)res_lib_votequorum_notification->node_list );
 				;
 				;

+ 5 - 0
man/votequorum_initialize.3.in

@@ -64,6 +64,11 @@ typedef void (*votequorum_notification_fn_t) (
 	);
 	);
 
 
 .fi
 .fi
+
+Current ring_id (one get in votequorum_notification_fn) must be passed to
+.B votequorum_qdevice_poll
+to make qdevice voting valid.
+
 .PP
 .PP
 Every time the expected votes are changed, the callback is called.
 Every time the expected votes are changed, the callback is called.
 The expected votes callback function is described by the following type definitions:
 The expected votes callback function is described by the following type definitions:

+ 3 - 0
test/testvotequorum1.c

@@ -35,6 +35,7 @@
 #include <config.h>
 #include <config.h>
 
 
 #include <sys/types.h>
 #include <sys/types.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdio.h>
 #include <string.h>
 #include <string.h>
 #include <stdint.h>
 #include <stdint.h>
@@ -79,6 +80,7 @@ static void votequorum_notification_fn(
 	votequorum_handle_t handle,
 	votequorum_handle_t handle,
 	uint64_t context,
 	uint64_t context,
 	uint32_t quorate,
 	uint32_t quorate,
+	votequorum_ring_id_t ring_id,
 	uint32_t node_list_entries,
 	uint32_t node_list_entries,
 	votequorum_node_t node_list[]
 	votequorum_node_t node_list[]
 	)
 	)
@@ -88,6 +90,7 @@ static void votequorum_notification_fn(
 	printf("votequorum notification called \n");
 	printf("votequorum notification called \n");
 	printf("  quorate         = %d\n", quorate);
 	printf("  quorate         = %d\n", quorate);
 	printf("  number of nodes = %d\n", node_list_entries);
 	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++) {
 	for (i = 0; i< node_list_entries; i++) {
 		printf("      %d: %s\n", node_list[i].nodeid, node_state(node_list[i].state));
 		printf("      %d: %s\n", node_list[i].nodeid, node_state(node_list[i].state));