public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: master - cman: Add a context to trackers so we can see what we are tracking
@ 2009-01-09 13:53 Christine Caulfield
  0 siblings, 0 replies; only message in thread
From: Christine Caulfield @ 2009-01-09 13:53 UTC (permalink / raw)
  To: cluster-cvs-relay

Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c5aea48bfbd78315f996094f1336a194b1f499a2
Commit:        c5aea48bfbd78315f996094f1336a194b1f499a2
Parent:        120736eca8a1043f0dca61ccaca0a5b9078c99f0
Author:        Christine Caulfield <ccaulfie@redhat.com>
AuthorDate:    Fri Jan 9 13:52:31 2009 +0000
Committer:     Christine Caulfield <ccaulfie@redhat.com>
CommitterDate: Fri Jan 9 13:52:31 2009 +0000

cman: Add a context to trackers so we can see what we are tracking

Also remove some redundant code.

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
---
 cman/services/cman/lib/libcman.c                   |   19 ++++---
 cman/services/quorum/include/corosync/cmanquorum.h |    2 +
 .../quorum/include/corosync/ipc_cmanquorum.h       |    3 +-
 cman/services/quorum/lib/libcmanquorum.c           |    9 ++-
 cman/services/quorum/services/cmanquorum.c         |   54 +++++++-------------
 5 files changed, 40 insertions(+), 47 deletions(-)

diff --git a/cman/services/cman/lib/libcman.c b/cman/services/cman/lib/libcman.c
index 4031a1c..ab8acb3 100644
--- a/cman/services/cman/lib/libcman.c
+++ b/cman/services/cman/lib/libcman.c
@@ -55,6 +55,7 @@ static void cfg_shutdown_callback(
 
 static void cmanquorum_notification_callback(
         cmanquorum_handle_t handle,
+	uint64_t context,
         uint32_t quorate,
         uint32_t node_list_entries,
         cmanquorum_node_t node_list[]);
@@ -94,6 +95,7 @@ static void cfg_shutdown_callback(
 
 static void cmanquorum_notification_callback(
         cmanquorum_handle_t handle,
+	uint64_t context,
         uint32_t quorate,
         uint32_t node_list_entries,
         cmanquorum_node_t node_list[])
@@ -115,7 +117,7 @@ static void cmanquorum_notification_callback(
 		}
 	}
 
-	if (cman_inst->notify_callback)
+	if (context && cman_inst->notify_callback)
 		cman_inst->notify_callback((void*)cman_inst, cman_inst->privdata, CMAN_REASON_STATECHANGE, quorate);
 }
 
@@ -134,18 +136,13 @@ static int cmanquorum_check_and_start(struct cman_inst *cman_inst)
 static int refresh_node_list(struct cman_inst *cman_inst)
 {
 	int error;
-	cman_callback_t notify_callback;
 
 	if (cmanquorum_check_and_start(cman_inst))
 		return -1;
 
-	cmanquorum_trackstart(cman_inst->cmq_handle, CS_TRACK_CURRENT);
+	cmanquorum_trackstart(cman_inst->cmq_handle, 0, CS_TRACK_CURRENT);
 
-	// TODO FIXME this is horrible & racy
-	notify_callback = cman_inst->notify_callback;
-	cman_inst->notify_callback = NULL;
 	error = cmanquorum_dispatch(cman_inst->cmq_handle, CS_DISPATCH_ONE);
-	cman_inst->notify_callback = notify_callback;
 	return error;
 }
 
@@ -1048,8 +1045,14 @@ int cman_start_notification(cman_handle_t handle, cman_callback_t callback)
 	cman_inst = (struct cman_inst *)handle;
 	VALIDATE_HANDLE(cman_inst);
 
+	if (cmanquorum_check_and_start(cman_inst))
+		return -1;
+
 	cman_inst->notify_callback = callback;
 
+	if (cmanquorum_trackstart(cman_inst->cmq_handle, (uint64_t)handle, CS_TRACK_CURRENT) != CS_OK)
+		return -1;
+
 	return 0;
 }
 
@@ -1060,6 +1063,7 @@ int cman_stop_notification(cman_handle_t handle)
 	cman_inst = (struct cman_inst *)handle;
 	VALIDATE_HANDLE(cman_inst);
 
+	cmanquorum_trackstop(cman_inst->cmq_handle);
 	cman_inst->notify_callback = NULL;
 
 	return 0;
@@ -1095,7 +1099,6 @@ int cman_get_extra_info(cman_handle_t handle, cman_extra_info_t *info, int maxle
 
 	ccs_handle = ccs_connect();
 	if (!ccs_get(ccs_handle, "/totem/interface/@mcastaddr", &value)) {
-	  fprintf(stderr, "CC: got mcast %s\n", value);
 		strcpy(info->ei_addresses, value);
 		free(value);
 	}
diff --git a/cman/services/quorum/include/corosync/cmanquorum.h b/cman/services/quorum/include/corosync/cmanquorum.h
index 98953dc..3705043 100644
--- a/cman/services/quorum/include/corosync/cmanquorum.h
+++ b/cman/services/quorum/include/corosync/cmanquorum.h
@@ -44,6 +44,7 @@ typedef struct {
 
 typedef void (*cmanquorum_notification_fn_t) (
 	cmanquorum_handle_t handle,
+	uint64_t context,
 	uint32_t quorate,
 	uint32_t node_list_entries,
 	cmanquorum_node_t node_list[]
@@ -145,6 +146,7 @@ cs_error_t cmanquorum_killnode (
 /* Track node and quorum changes */
 cs_error_t cmanquorum_trackstart (
 	cmanquorum_handle_t handle,
+	uint64_t context,
 	unsigned int flags );
 
 cs_error_t cmanquorum_trackstop (
diff --git a/cman/services/quorum/include/corosync/ipc_cmanquorum.h b/cman/services/quorum/include/corosync/ipc_cmanquorum.h
index b86faac..4973632 100644
--- a/cman/services/quorum/include/corosync/ipc_cmanquorum.h
+++ b/cman/services/quorum/include/corosync/ipc_cmanquorum.h
@@ -1,7 +1,6 @@
 #ifndef IPC_CMANQUORUM_H_DEFINED
 #define IPC_CMANQUORUM_H_DEFINED
 
-//#include <netinet/in.h>
 #include "corosync/corotypes.h"
 #include "corosync/ipc_gen.h"
 
@@ -58,6 +57,7 @@ struct req_lib_cmanquorum_setexpected {
 
 struct req_lib_cmanquorum_trackstart {
         mar_req_header_t header __attribute__((aligned(8)));
+	uint64_t context;
 	unsigned int track_flags;
 };
 
@@ -115,6 +115,7 @@ struct cmanquorum_node {
 struct res_lib_cmanquorum_notification {
 	mar_res_header_t header __attribute__((aligned(8)));
 	mar_uint32_t quorate __attribute__((aligned(8)));
+	mar_uint64_t context __attribute__((aligned(8)));
 	mar_uint32_t node_list_entries __attribute__((aligned(8)));
 	struct cmanquorum_node node_list[] __attribute__((aligned(8)));
 };
diff --git a/cman/services/quorum/lib/libcmanquorum.c b/cman/services/quorum/lib/libcmanquorum.c
index 07f5413..676a56a 100644
--- a/cman/services/quorum/lib/libcmanquorum.c
+++ b/cman/services/quorum/lib/libcmanquorum.c
@@ -559,6 +559,7 @@ error_exit:
 
 cs_error_t cmanquorum_trackstart (
 	cmanquorum_handle_t handle,
+	uint64_t context,
 	unsigned int flags )
 {
 	cs_error_t error;
@@ -577,6 +578,7 @@ cs_error_t cmanquorum_trackstart (
 	req_lib_cmanquorum_trackstart.header.size = sizeof (struct req_lib_cmanquorum_trackstart);
 	req_lib_cmanquorum_trackstart.header.id = MESSAGE_REQ_CMANQUORUM_TRACKSTART;
 	req_lib_cmanquorum_trackstart.track_flags = flags;
+	req_lib_cmanquorum_trackstart.context = context;
 
 	iov[0].iov_base = (char *)&req_lib_cmanquorum_trackstart;
 	iov[0].iov_len = sizeof (struct req_lib_cmanquorum_trackstart);
@@ -790,9 +792,10 @@ cs_error_t cmanquorum_dispatch (
 			res_lib_cmanquorum_notification = (struct res_lib_cmanquorum_notification *)&dispatch_data;
 
 			callbacks.cmanquorum_notify_fn ( handle,
-						     res_lib_cmanquorum_notification->quorate,
-						     res_lib_cmanquorum_notification->node_list_entries,
-						     (cmanquorum_node_t *)res_lib_cmanquorum_notification->node_list );
+							 res_lib_cmanquorum_notification->context,
+							 res_lib_cmanquorum_notification->quorate,
+							 res_lib_cmanquorum_notification->node_list_entries,
+							 (cmanquorum_node_t *)res_lib_cmanquorum_notification->node_list );
 				;
 			break;
 
diff --git a/cman/services/quorum/services/cmanquorum.c b/cman/services/quorum/services/cmanquorum.c
index ee0218c..f31859b 100644
--- a/cman/services/quorum/services/cmanquorum.c
+++ b/cman/services/quorum/services/cmanquorum.c
@@ -39,7 +39,7 @@
 #define DEFAULT_EXPECTED   1024
 #define DEFAULT_QDEV_POLL 10000
 
-LOGSYS_DECLARE_SUBSYS ("CMANQUORUM", LOG_INFO);
+LOGSYS_DECLARE_SUBSYS ("CMANQ", LOG_INFO);
 
 enum quorum_message_req_types {
 	MESSAGE_REQ_EXEC_CMANQUORUM_NODEINFO  = 0,
@@ -56,7 +56,7 @@ enum quorum_message_req_types {
 
 
 typedef enum { NODESTATE_JOINING=1, NODESTATE_MEMBER,
-	       NODESTATE_DEAD, NODESTATE_LEAVING, NODESTATE_AISONLY } nodestate_t;
+	       NODESTATE_DEAD, NODESTATE_LEAVING, NODESTATE_DISALLOWED } nodestate_t;
 
 
 /* This structure is tacked onto the start of a cluster message packet for our
@@ -85,8 +85,8 @@ struct cluster_node {
 };
 
 #define CMANQUORUM_FLAG_FEATURE_DISALLOWED 1
-
 static int quorum_flags;
+
 static int quorum;
 static int cluster_is_quorate;
 static int first_trans = 1;
@@ -121,7 +121,7 @@ static uint32_t cluster_id;
 static uint32_t config_version;
 #else
 static struct corosync_tpg_group quorum_group[1] = {
-        { .group          = "CMANQUORUM", .group_len      = 6},
+        { .group          = "CMANQ", .group_len      = 5},
 };
 #endif
 
@@ -131,6 +131,7 @@ static struct corosync_tpg_group quorum_group[1] = {
 struct quorum_pd {
 	unsigned char track_flags;
 	int tracking_enabled;
+	uint64_t tracking_context;
 	struct list_head list;
 	void *conn;
 };
@@ -415,20 +416,6 @@ struct req_exec_quorum_killnode {
 	int nodeid;
 };
 
-#ifdef CMAN_COMPATIBILITY
-static uint16_t generate_cluster_id(char *name)
-{
-	int i;
-	int value = 0;
-
-	for (i=0; i<strlen(name); i++) {
-		value <<= 1;
-		value += name[i];
-	}
-	return value & 0xFFFF;
-}
-#endif
-
 /* These just make the access a little neater */
 static inline int objdb_get_string(struct corosync_api_v1 *corosync, unsigned int object_service_handle,
 				   char *key, char **value)
@@ -529,8 +516,6 @@ static int cmanquorum_exec_init_fn (struct corosync_api_v1 *api)
 			strcpy(clustername, name);
 
 		objdb_get_int(corosync_api, object_handle, "cluster_id", &cluster_id, 0);
-		if (cluster_id == 0)
-			cluster_id = generate_cluster_id(clustername);
 		objdb_get_int(corosync_api, object_handle, "config_version", &config_version, 0);
 	}
 	corosync_api->object_find_destroy(find_handle);
@@ -558,7 +543,7 @@ static int quorum_lib_exit_fn (void *conn)
 }
 
 
-static int send_quorum_notification(void *conn)
+static int send_quorum_notification(void *conn, uint64_t context)
 {
 	struct res_lib_cmanquorum_notification *res_lib_cmanquorum_notification;
 	struct list_head *tmp;
@@ -586,6 +571,7 @@ static int send_quorum_notification(void *conn)
 	res_lib_cmanquorum_notification = (struct res_lib_cmanquorum_notification *)buf;
 	res_lib_cmanquorum_notification->quorate = cluster_is_quorate;
 	res_lib_cmanquorum_notification->node_list_entries = cluster_members;
+	res_lib_cmanquorum_notification->context = context;
 	list_iterate(tmp, &cluster_members_list) {
 		node = list_entry(tmp, struct cluster_node, list);
 		res_lib_cmanquorum_notification->node_list[i].nodeid = node->node_id;
@@ -610,7 +596,7 @@ static int send_quorum_notification(void *conn)
 
 		list_iterate(tmp, &trackers_list) {
 			qpd = list_entry(tmp, struct quorum_pd, list);
-
+			res_lib_cmanquorum_notification->context = qpd->tracking_context;
 			corosync_api->ipc_conn_send_response(corosync_api->ipc_conn_partner_get(qpd->conn), buf, size);
 		}
 	}
@@ -635,14 +621,14 @@ static void set_quorate(int total_votes)
 	if (!cluster_is_quorate && quorate)
 		log_printf(LOG_INFO, "quorum regained, resuming activity\n");
 
-	/* If we are newly quorate, then kill any AISONLY nodes */
+	/* If we are newly quorate, then kill any DISALLOWED nodes */
 	if (!cluster_is_quorate && quorate) {
 		struct cluster_node *node = NULL;
 		struct list_head *tmp;
 
 		list_iterate(tmp, &cluster_members_list) {
 			node = list_entry(tmp, struct cluster_node, list);
-			if (node->state == NODESTATE_AISONLY)
+			if (node->state == NODESTATE_DISALLOWED)
 				quorum_exec_send_killnode(node->node_id, CMANQUORUM_REASON_KILL_REJOIN);
 		}
 	}
@@ -722,7 +708,7 @@ static void recalculate_quorum(int allow_decrease)
 	ENTER();
 	quorum = calculate_quorum(allow_decrease, &total_votes);
 	set_quorate(total_votes);
-	send_quorum_notification(NULL);
+	send_quorum_notification(NULL, 0L);
 	LEAVE();
 }
 
@@ -733,7 +719,7 @@ static int have_disallowed(void)
 
 	list_iterate(tmp, &cluster_members_list) {
 		node = list_entry(tmp, struct cluster_node, list);
-		if (node->state == NODESTATE_AISONLY)
+		if (node->state == NODESTATE_DISALLOWED)
 			return 1;
 	}
 
@@ -908,9 +894,6 @@ static void exec_quorum_nodeinfo_endian_convert (void *msg)
 	nodeinfo->patch_version = swab32(nodeinfo->patch_version);
 	nodeinfo->config_version = swab32(nodeinfo->config_version);
 	nodeinfo->flags = swab32(nodeinfo->flags);
-#ifdef CMAN_COMPATIBILITY
-	nodeinfo->fence_time = swab64(nodeinfo->fence_time);
-#endif
 }
 
 static void exec_quorum_reconfigure_endian_convert (void *msg)
@@ -991,7 +974,7 @@ static void message_handler_req_exec_quorum_nodeinfo (
 
 	if (req_exec_quorum_nodeinfo->flags & NODE_FLAGS_SEESDISALLOWED && !have_disallowed()) {
 		/* Must use syslog directly here or the message will never arrive */
-		syslog(LOG_CRIT, "[CMANQUORUM]: Joined a cluster with disallowed nodes. must die");
+		syslog(LOG_CRIT, "[CMANQ]: Joined a cluster with disallowed nodes. must die");
 		corosync_api->fatal_error(2, __FILE__, __LINE__); // CC:
 		exit(2);
 	}
@@ -1006,15 +989,15 @@ static void message_handler_req_exec_quorum_nodeinfo (
 	if (quorum_flags & CMANQUORUM_FLAG_FEATURE_DISALLOWED) {
 		if ((req_exec_quorum_nodeinfo->flags & NODE_FLAGS_DIRTY && node->flags & NODE_FLAGS_BEENDOWN) ||
 		    (req_exec_quorum_nodeinfo->flags & NODE_FLAGS_DIRTY && req_exec_quorum_nodeinfo->first_trans && !(node->flags & NODE_FLAGS_US))) {
-			if (node->state != NODESTATE_AISONLY) {
+			if (node->state != NODESTATE_DISALLOWED) {
 				if (cluster_is_quorate) {
 					log_printf(LOG_CRIT, "Killing node %d because it has rejoined the cluster with existing state", node->node_id);
-					node->state = NODESTATE_AISONLY;
+					node->state = NODESTATE_DISALLOWED;
 					quorum_exec_send_killnode(nodeid, CMANQUORUM_REASON_KILL_REJOIN);
 				}
 				else {
 					log_printf(LOG_CRIT, "Node %d not joined to quorum because it has existing state", node->node_id);
-					node->state = NODESTATE_AISONLY;
+					node->state = NODESTATE_DISALLOWED;
 				}
 			}
 		}
@@ -1416,7 +1399,7 @@ static void message_handler_req_lib_cmanquorum_trackstart (void *conn, void *msg
 	if (req_lib_cmanquorum_trackstart->track_flags & CS_TRACK_CURRENT ||
 	    req_lib_cmanquorum_trackstart->track_flags & CS_TRACK_CHANGES) {
 		log_printf(LOG_LEVEL_DEBUG, "sending initial status to %p\n", conn);
-		send_quorum_notification(corosync_api->ipc_conn_partner_get (conn));
+		send_quorum_notification(corosync_api->ipc_conn_partner_get (conn), req_lib_cmanquorum_trackstart->context);
 	}
 
 	/*
@@ -1427,11 +1410,12 @@ static void message_handler_req_lib_cmanquorum_trackstart (void *conn, void *msg
 
 		quorum_pd->track_flags = req_lib_cmanquorum_trackstart->track_flags;
 		quorum_pd->tracking_enabled = 1;
+		quorum_pd->tracking_context = req_lib_cmanquorum_trackstart->context;
 
 		list_add (&quorum_pd->list, &trackers_list);
 	}
 
-	/* send status */
+	/* Send status */
 	res_lib_cmanquorum_status.header.size = sizeof(res_lib_cmanquorum_status);
 	res_lib_cmanquorum_status.header.id = MESSAGE_RES_CMANQUORUM_STATUS;
 	res_lib_cmanquorum_status.header.error = CS_OK;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-01-09 13:53 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-09 13:53 cluster: master - cman: Add a context to trackers so we can see what we are tracking Christine Caulfield

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).