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).