[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] cluster/cman cman_tool/cman_tool.h cman_tool/j ...



CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	pcaulfield sourceware org	2007-11-29 11:19:12

Modified files:
	cman/cman_tool : cman_tool.h join.c main.c 
	cman/daemon    : ais.c cmanccs.c commands.c 
	cman/man       : cman_tool.8 

Log message:
	Reinstate 'cman_tool join -X', allowing people to start a cluster without
	the hassle of a cluster.conf file. There are some caveats to this,
	which are mentioned in the man page.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/cman_tool.h.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/join.c.diff?cvsroot=cluster&r1=1.51&r2=1.52
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/main.c.diff?cvsroot=cluster&r1=1.59&r2=1.60
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/ais.c.diff?cvsroot=cluster&r1=1.54&r2=1.55
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/cmanccs.c.diff?cvsroot=cluster&r1=1.37&r2=1.38
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/commands.c.diff?cvsroot=cluster&r1=1.75&r2=1.76
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/man/cman_tool.8.diff?cvsroot=cluster&r1=1.14&r2=1.15

--- cluster/cman/cman_tool/cman_tool.h	2007/09/19 15:59:46	1.13
+++ cluster/cman/cman_tool/cman_tool.h	2007/11/29 11:19:12	1.14
@@ -98,6 +98,7 @@
 	int wait_quorate_opt;
 	int fence_opt;
 	int addresses_opt;
+	int noccs_opt;
 };
 typedef struct commandline commandline_t;
 
--- cluster/cman/cman_tool/join.c	2007/09/07 14:21:30	1.51
+++ cluster/cman/cman_tool/join.c	2007/11/29 11:19:12	1.52
@@ -62,12 +62,15 @@
 	int ctree;
 	int p[2];
 
-	ctree = ccs_force_connect(NULL, 1);
-	if (ctree < 0)
+	if (!comline->noccs_opt)
 	{
-		die("ccsd is not running\n");
+		ctree = ccs_force_connect(NULL, 1);
+		if (ctree < 0)
+		{
+			die("ccsd is not running\n");
+		}
+		ccs_disconnect(ctree);
 	}
-	ccs_disconnect(ctree);
 
         /*
 	 * If we can talk to cman then we're already joined (or joining);
@@ -114,6 +117,10 @@
 		snprintf(scratch, sizeof(scratch), "CMAN_DEBUGLOG=%d", comline->verbose);
 		envp[envptr++] = strdup(scratch);
 	}
+	if (comline->noccs_opt) {
+		snprintf(scratch, sizeof(scratch), "CMAN_NOCCS=TRUE");
+		envp[envptr++] = strdup(scratch);
+	}
 
 	/* Use cman to configure services */
 	envp[envptr++] = strdup("OPENAIS_DEFAULT_CONFIG_IFACE=cmanconfig");
--- cluster/cman/cman_tool/main.c	2007/09/28 12:18:19	1.59
+++ cluster/cman/cman_tool/main.c	2007/11/29 11:19:12	1.60
@@ -20,7 +20,7 @@
 #include "libcman.h"
 #include "cman_tool.h"
 
-#define OPTION_STRING		("m:n:v:e:2p:c:r:i:N:t:o:k:F:Vwfqah?d::")
+#define OPTION_STRING		("m:n:v:e:2p:c:r:i:N:t:o:k:F:Vwfqah?Xd::")
 #define OP_JOIN			1
 #define OP_LEAVE		2
 #define OP_EXPECTED		3
@@ -63,6 +63,7 @@
 		printf("  -q               Wait until the cluster is quorate\n");
 		printf("  -t               Maximum time (in seconds) to wait\n");
 		printf("  -k <file>        Private key file for AIS communications\n");
+		printf("  -X               Don't use CCS for configuration\n");
 		printf("\n");
 	}
 
@@ -228,6 +229,7 @@
 	printf("Nodes: %d\n", einfo->ei_members);
 	printf("Expected votes: %d\n", einfo->ei_expected_votes);
 	printf("Total votes: %d\n", einfo->ei_total_votes);
+
 	printf("Quorum: %d %s\n", einfo->ei_quorum, quorate?" ":"Activity blocked");
 	printf("Active subsystems: %d\n", cman_get_subsys_count(h));
 	printf("Flags:");
@@ -333,21 +335,128 @@
 	return FMT_NONE;
 }
 
+
+static void print_node(commandline_t *comline, cman_handle_t h, int *format, struct cman_node *node)
+{
+	char member_type;
+	struct tm *ftime;
+	struct tm *jtime;
+	char jstring[1024];
+	int i,j,k;
+
+	if (comline->num_nodenames > 0) {
+		if (node_filter(comline, node->cn_name) == 0) {
+			return;
+		}
+	}
+
+	switch (node->cn_member) {
+	case 0:
+		member_type = 'X';
+		break;
+	case 1:
+		member_type = 'M';
+		break;
+	case 2:
+		member_type = 'd';
+		break;
+	default:
+		member_type = '?';
+		break;
+	}
+
+	jtime = localtime(&node->cn_jointime.tv_sec);
+	if (node->cn_jointime.tv_sec && node->cn_member)
+		strftime(jstring, sizeof(jstring), "%F %H:%M:%S", jtime);
+	else
+		strcpy(jstring, "                   ");
+
+	if (!comline->format_opts) {
+		printf("%4d   %c  %5d   %s  %s\n",
+		       node->cn_nodeid, member_type,
+		       node->cn_incarnation, jstring, node->cn_name);
+	}
+
+	if (comline->fence_opt && !comline->format_opts) {
+		char agent[255];
+		uint64_t fence_time;
+		int fenced;
+
+		if (!cman_get_fenceinfo(h, node->cn_nodeid, &fence_time, &fenced, agent)) {
+			if (fence_time) {
+				time_t fence_time_t = (time_t)fence_time;
+				ftime = localtime(&fence_time_t);
+				strftime(jstring, sizeof(jstring), "%F %H:%M:%S", ftime);
+				printf("       Last fenced:   %-15s by %s\n", jstring, agent);
+			}
+			if (!node->cn_member && node->cn_incarnation && !fenced) {
+				printf("       Node has not been fenced since it went down\n");
+			}
+		}
+	}
+
+	int numaddrs;
+	struct cman_node_address addrs[MAX_INTERFACES];
+
+	if (comline->addresses_opt || comline->format_opts) {
+		if (!cman_get_node_addrs(h, node->cn_nodeid, MAX_INTERFACES, &numaddrs, addrs) &&
+		    numaddrs)
+		{
+			if (!comline->format_opts) {
+				printf("       Addresses: ");
+				for (i = 0; i < numaddrs; i++)
+				{
+					print_address(addrs[i].cna_address);
+					printf(" ");
+				}
+				printf("\n");
+			}
+		}
+	}
+
+	if (comline->format_opts) {
+		for (j = 0; j < MAX_FORMAT_OPTS; j++) {
+			switch (format[j]) {
+			case FMT_NONE:
+				break;
+			case FMT_ID:
+				printf("%d ", node->cn_nodeid);
+				break;
+			case FMT_NAME:
+				printf("%s ", node->cn_name);
+				break;
+			case FMT_TYPE:
+				printf("%c ", member_type);
+				break;
+			case FMT_ADDR:
+				for (k = 0; k < numaddrs; k++) {
+					print_address(addrs[k].cna_address);
+					if (k != (numaddrs - 1)) {
+						printf(",");
+					}
+				}
+				printf(" ");
+				break;
+			default:
+				break;
+			}
+		}
+		printf("\n");
+	}
+}
+
 static void show_nodes(commandline_t *comline)
 {
 	cman_handle_t h;
 	int count;
 	int i;
 	int j;
-	int k;
 	int numnodes;
 	int dis_count;
 	int format[MAX_FORMAT_OPTS];
 	cman_node_t *dis_nodes;
 	cman_node_t *nodes;
-	struct tm *jtime;
-	struct tm *ftime;
-	char jstring[1024];
+	cman_node_t qdev_node;
 
 	h = open_cman_handle(0);
 
@@ -399,108 +508,14 @@
 		printf("Node  Sts   Inc   Joined               Name\n");
 	}
 
-	for (i = 0; i < numnodes; i++) {
-		char member_type;
+	/* Get quorum device & print it. */
+	memset(&qdev_node, 0, sizeof(qdev_node));
+	if (!cman_get_node(h, CMAN_NODEID_QDISK, &qdev_node))
+		print_node(comline, h, format, &qdev_node);
 
-		if (comline->num_nodenames > 0) {
-			if (node_filter(comline, nodes[i].cn_name) == 0) {
-				continue;
-			}
-		}
-
-		switch (nodes[i].cn_member) {
-		case 0:
-			member_type = 'X';
-			break;
-		case 1:
-			member_type = 'M';
-			break;
-		case 2:
-			member_type = 'd';
-			break;
-		default:
-			member_type = '?';
-			break;
-		}
-
-		jtime = localtime(&nodes[i].cn_jointime.tv_sec);
-		if (nodes[i].cn_jointime.tv_sec && nodes[i].cn_member)
-			strftime(jstring, sizeof(jstring), "%F %H:%M:%S", jtime);
-		else
-			strcpy(jstring, "                   ");
-
-		if (!comline->format_opts) {
-			printf("%4d   %c  %5d   %s  %s\n",
-			       nodes[i].cn_nodeid, member_type,
-			       nodes[i].cn_incarnation, jstring, nodes[i].cn_name);
-		}
-
-		if (comline->fence_opt && !comline->format_opts) {
-			char agent[255];
-			uint64_t fence_time;
-			int fenced;
-
-			if (!cman_get_fenceinfo(h, nodes[i].cn_nodeid, &fence_time, &fenced, agent)) {
-				if (fence_time) {
-					time_t fence_time_t = (time_t)fence_time;
-					ftime = localtime(&fence_time_t);
-					strftime(jstring, sizeof(jstring), "%F %H:%M:%S", ftime);
-					printf("       Last fenced:   %-15s by %s\n", jstring, agent);
-				}
-				if (!nodes[i].cn_member && nodes[i].cn_incarnation && !fenced) {
-					printf("       Node has not been fenced since it went down\n");
-				}
-			}
-		}
-		
-		int numaddrs;
-		struct cman_node_address addrs[MAX_INTERFACES];
-
-		if (comline->addresses_opt || comline->format_opts) {
-			if (!cman_get_node_addrs(h, nodes[i].cn_nodeid, MAX_INTERFACES, &numaddrs, addrs) &&
-				numaddrs)
-			{
-				if (!comline->format_opts) {
-					printf("       Addresses: ");
-					for (i = 0; i < numaddrs; i++)
-					{
-						print_address(addrs[i].cna_address);
-						printf(" ");
-					}
-					printf("\n");
-				}
-			}
-		}
-
-		if (comline->format_opts) {
-			for (j = 0; j < MAX_FORMAT_OPTS; j++) {
-				switch (format[j]) {
-				case FMT_NONE:
-					break;
-				case FMT_ID:
-					printf("%d ", nodes[i].cn_nodeid);
-					break;
-				case FMT_NAME:
-					printf("%s ", nodes[i].cn_name);
-					break;
-				case FMT_TYPE:
-					printf("%c ", member_type);
-					break;
-				case FMT_ADDR:
-					for (k = 0; k < numaddrs; k++) {
-						print_address(addrs[k].cna_address);
-						if (k != (numaddrs - 1)) {
-							printf(",");
-						}
-					}
-					printf(" ");
-					break;
-				default:
-					break;
-				}
-			}
-			printf("\n");
-		}
+	/* Print 'real' nodes */
+	for (i = 0; i < numnodes; i++) {
+		print_node(comline, h, format, &nodes[i]);
 	}
 
 	free(nodes);
@@ -833,6 +848,9 @@
 			cont = FALSE;
 			break;
 
+		case 'X':
+			comline->noccs_opt = TRUE;
+			break;
 		default:
 			die("unknown option: %c", optchar);
 			break;
--- cluster/cman/daemon/ais.c	2007/11/01 14:06:01	1.54
+++ cluster/cman/daemon/ais.c	2007/11/29 11:19:12	1.55
@@ -300,11 +300,17 @@
 
 	P_AIS("Adding local address %s\n", ifaddr);
 
-	/* This will already exist as early config creates it */
 	global_objdb->object_find_reset(OBJECT_PARENT_HANDLE);
 	if (global_objdb->object_find(OBJECT_PARENT_HANDLE,
-				      "totem", strlen("totem"),&totem_object_handle) == 0) {
+				       "totem", strlen("totem"), &totem_object_handle)) {
 
+		global_objdb->object_create(OBJECT_PARENT_HANDLE, &totem_object_handle,
+					    "totem", strlen("totem"));
+	}
+
+	global_objdb->object_find_reset(OBJECT_PARENT_HANDLE);
+	if (global_objdb->object_find(OBJECT_PARENT_HANDLE,
+				      "totem", strlen("totem"), &totem_object_handle) == 0) {
 		if (global_objdb->object_create(totem_object_handle, &interface_object_handle,
 						"interface", strlen("interface")) == 0) {
 
@@ -551,6 +557,13 @@
 	}
 
 	/* Make sure mainconfig doesn't stomp on our logging options */
+	if (global_objdb->object_find(OBJECT_PARENT_HANDLE,
+				      "logging", strlen("logging"), &object_handle)) {
+
+		global_objdb->object_create(OBJECT_PARENT_HANDLE, &object_handle,
+					    "logging", strlen("logging"));
+	}
+
 	objdb->object_find_reset(OBJECT_PARENT_HANDLE);
 	if (objdb->object_find(OBJECT_PARENT_HANDLE,
 			       "logging", strlen("logging"),
--- cluster/cman/daemon/cmanccs.c	2007/11/05 16:03:58	1.37
+++ cluster/cman/daemon/cmanccs.c	2007/11/29 11:19:12	1.38
@@ -34,6 +34,8 @@
 
 
 #define DEFAULT_PORT            5405
+#define DEFAULT_CLUSTER_NAME    "RHCluster"
+#define NOCCS_KEY_FILENAME      "/etc/cluster/cman_authkey"
 
 #define CONFIG_VERSION_PATH	"/cluster/@config_version"
 #define CLUSTER_NAME_PATH	"/cluster/@name"
@@ -61,6 +63,7 @@
 static char *nodenames[MAX_NODENAMES];
 static int  portnums[MAX_NODENAMES];
 static char *mcast[MAX_NODENAMES];
+static char *nodename_env;
 static int num_nodenames;
        int two_node;
        char *key_filename;
@@ -100,6 +103,11 @@
     int expected = 0;
     unsigned int config;
 
+    if (getenv("CMAN_NOCCS")) {
+	    *config_version = 1;
+	    return 0;
+    }
+
     /* Open the config file */
     ctree = ccs_force_connect(NULL, 1);
     if (ctree < 0) {
@@ -425,22 +433,73 @@
 	return error;
 }
 
+/* get any environment variable overrides */
+static int get_overrides()
+{
+	if (getenv("CMAN_CLUSTER_NAME")) {
+		strcpy(cluster_name, getenv("CMAN_CLUSTER_NAME"));
+		log_printf(LOG_INFO, "Using override cluster name %s\n", cluster_name);
+	}
+
+	nodename_env = getenv("CMAN_NODENAME");
+	if (nodename_env) {
+		log_printf(LOG_INFO, "Using override node name %s\n", nodename_env);
+	}
+
+	expected_votes = 0;
+	if (getenv("CMAN_EXPECTEDVOTES")) {
+		expected_votes = atoi(getenv("CMAN_EXPECTEDVOTES"));
+		if (expected_votes < 1) {
+			log_printf(LOG_ERR, "CMAN_EXPECTEDVOTES environment variable is invalid, ignoring");
+			expected_votes = 0;
+		}
+		else {
+			log_printf(LOG_INFO, "Using override expected votes %d\n", expected_votes);
+		}
+	}
+
+	/* optional port */
+	if (getenv("CMAN_IP_PORT")) {
+		portnums[0] = atoi(getenv("CMAN_IP_PORT"));
+		log_printf(LOG_INFO, "Using override IP port %d\n", portnums[0]);
+	}
+
+	/* optional security key filename */
+	if (getenv("CMAN_KEYFILE")) {
+		key_filename = strdup(getenv("CMAN_KEYFILE"));
+		if (key_filename == NULL)
+			return -ENOMEM;
+	}
+
+	/* find our own number of votes */
+	if (getenv("CMAN_VOTES")) {
+		votes = atoi(getenv("CMAN_VOTES"));
+		log_printf(LOG_INFO, "Using override votes %d\n", votes);
+	}
+
+	/* nodeid */
+	if (getenv("CMAN_NODEID")) {
+		nodeid = atoi(getenv("CMAN_NODEID"));
+		log_printf(LOG_INFO, "Using override nodeid %d\n", nodeid);
+	}
+
+	if (getenv("CMAN_MCAST_ADDR")) {
+		mcast_name = getenv("CMAN_MCAST_ADDR");
+		log_printf(LOG_INFO, "Using override multicast address %s\n", mcast_name);
+	}
+	return 0;
+}
 
 static int get_ccs_join_info(void)
 {
 	char path[MAX_PATH_LEN];
 	char nodename[MAX_CLUSTER_MEMBER_NAME_LEN+1];
-	char *str, *name, *cname = NULL, *nodename_env;
+	char *str, *name;
 	int cd, error, i, vote_sum = 0, node_count = 0;
 	unsigned short port = 0;
 
 	/* Connect to ccsd */
-	if (getenv("CMAN_CLUSTER_NAME")) {
-		cname = getenv("CMAN_CLUSTER_NAME");
-		log_printf(LOG_INFO, "Using override cluster name %s\n", cname);
-	}
-
-	cd = ccs_force_connect(cname, 1);
+	cd = ccs_force_connect(cluster_name[0]?cluster_name:NULL, 1);
 	if (cd < 0) {
 		log_printf(LOG_ERR, "Error connecting to CCS");
 		write_cman_pipe("Can't connect to CCSD");
@@ -456,9 +515,9 @@
 		goto out;
 	}
 
-	if (cname) {
-		if (strcmp(cname, str)) {
-			log_printf(LOG_ERR, "cluster names not equal %s %s", cname, str);
+	if (cluster_name[0]) {
+		if (strcmp(cluster_name, str)) {
+			log_printf(LOG_ERR, "cluster names not equal %s %s", cluster_name, str);
 			write_cman_pipe("Cluster name in CCS does not match that passed to cman_tool");
 			error = -ENOENT;
 			goto out;
@@ -485,20 +544,8 @@
 	}
 
 	/* our nodename */
-	nodename_env = getenv("CMAN_NODENAME");
-	if (nodename_env != NULL) {
+	if (nodename_env) {
 		int ret;
-
-		if (strlen(nodename_env) >= sizeof(nodename)) {
-			log_printf(LOG_ERR, "Overridden node name %s is too long", nodename);
-			write_cman_pipe("Overridden node name is too long");
-			error = -E2BIG;
-			goto out;
-		}
-
-		strcpy(nodename, nodename_env);
-		log_printf(LOG_INFO, "Using override node name %s\n", nodename);
-
 		ret = snprintf(path, sizeof(path), NODE_NAME_PATH_BYNAME, nodename);
 		if (ret < 0 || (size_t) ret >= sizeof(path)) {
 			log_printf(LOG_ERR, "Overridden node name %s is too long", nodename);
@@ -554,18 +601,6 @@
 		goto out;
 	}
 
-	expected_votes = 0;
-	if (getenv("CMAN_EXPECTEDVOTES")) {
-		expected_votes = atoi(getenv("CMAN_EXPECTEDVOTES"));
-		if (expected_votes < 1) {
-			log_printf(LOG_ERR, "CMAN_EXPECTEDVOTES environment variable is invalid, ignoring");
-			expected_votes = 0;
-		}
-		else {
-			log_printf(LOG_INFO, "Using override expected votes %d\n", expected_votes);
-		}
-	}
-
 	/* Sum node votes for expected */
 	if (expected_votes == 0) {
 		for (i = 1; ; i++) {
@@ -617,13 +652,7 @@
 			expected_votes = vote_sum;
 	}
 
-	/* optional port */
-	if (getenv("CMAN_IP_PORT")) {
-		port = atoi(getenv("CMAN_IP_PORT"));
-		log_printf(LOG_INFO, "Using override IP port %d\n", port);
-	}
-
-	if (!port) {
+	if (!portnums[0]) {
 		error = ccs_get(cd, PORT_PATH, &str);
 		if (!error) {
 			port = atoi(str);
@@ -631,28 +660,16 @@
 		}
 		else
 			port = DEFAULT_PORT;
+		portnums[0] = port;
 	}
-	portnums[0] = port;
 
-	/* optional security key filename */
-	if (getenv("CMAN_KEYFILE")) {
-		key_filename = strdup(getenv("CMAN_KEYFILE"));
-		if (key_filename == NULL)
-			return -ENOMEM;
-	}
-	else {
+	if (!key_filename) {
 		error = ccs_get(cd, KEY_PATH, &str);
 		if (!error) {
 			key_filename = str;
 		}
 	}
 
-	/* find our own number of votes */
-	if (getenv("CMAN_VOTES")) {
-		votes = atoi(getenv("CMAN_VOTES"));
-		log_printf(LOG_INFO, "Using override votes %d\n", votes);
-	}
-
 	if (!votes) {
 		int ret = snprintf(path, sizeof(path), NODE_VOTES_PATH, nodename);
 		if (ret < 0 || (size_t) ret >= sizeof(path)) {
@@ -677,13 +694,6 @@
 		}
 	}
 
-
-	/* nodeid */
-	if (getenv("CMAN_NODEID")) {
-		nodeid = atoi(getenv("CMAN_NODEID"));
-		log_printf(LOG_INFO, "Using override nodeid %d\n", nodeid);
-	}
-
 	if (!nodeid) {
 		int ret = snprintf(path, sizeof(path), NODE_NODEID_PATH, nodename);
 
@@ -702,11 +712,6 @@
 		return -EINVAL;
 	}
 
-	if (getenv("CMAN_MCAST_ADDR")) {
-		mcast_name = getenv("CMAN_MCAST_ADDR");
-		log_printf(LOG_INFO, "Using override multicast address %s\n", mcast_name);
-	}
-
 	/* Optional multicast name */
 	if (!mcast_name) {
 		error = ccs_get(cd, MCAST_ADDR_PATH, &str);
@@ -805,6 +810,78 @@
 }
 
 
+/* If ccs is not available then use some defaults */
+static int noccs_defaults()
+{
+	/* Enforce key */
+	key_filename = NOCCS_KEY_FILENAME;
+
+	if (cluster_name[0] == '\0')
+		strcpy(cluster_name, DEFAULT_CLUSTER_NAME);
+
+	if (!cluster_id)
+		cluster_id = generate_cluster_id(cluster_name);
+
+	if (!nodename_env) {
+		int error;
+		struct utsname utsname;
+
+		error = uname(&utsname);
+		if (error) {
+			log_printf(LOG_ERR, "cannot get node name, uname failed");
+			write_cman_pipe("Can't determine local node name");
+			return -ENOENT;
+		}
+
+		nodename_env = utsname.nodename;
+	}
+	nodenames[0] = strdup(nodename_env);
+	num_nodenames = 1;
+
+	if (!mcast_name) {
+		mcast_name = default_mcast(cluster_id);
+		log_printf(LOG_INFO, "Using default multicast address of %s\n", mcast_name);
+	}
+	mcast[0] = mcast_name;
+
+	/* This will increase as nodes join the cluster */
+	if (!expected_votes)
+		expected_votes = 1;
+	if (!votes)
+		votes = 1;
+
+	if (!portnums[0])
+		portnums[0] = DEFAULT_PORT;
+
+	/* Invent a node ID */
+	if (!nodeid) {
+		struct addrinfo *ainfo;
+		struct addrinfo ahints;
+		int ret;
+
+		memset(&ahints, 0, sizeof(ahints));
+		ret = getaddrinfo(nodenames[0], NULL, &ahints, &ainfo);
+		if (ret) {
+			log_printf(LOG_ERR, "Can't determine address family of nodename %s\n", nodenames[0]);
+			write_cman_pipe("Can't determine address family of nodename");
+			return -EINVAL;
+		}
+
+		if (ainfo->ai_family == AF_INET) {
+			struct sockaddr_in *addr = (struct sockaddr_in *)ainfo->ai_addr;
+			memcpy(&nodeid, &addr->sin_addr, sizeof(int));
+		}
+		if (ainfo->ai_family == AF_INET6) {
+			struct sockaddr_in6 *addr = (struct sockaddr_in6 *)ainfo->ai_addr;
+			memcpy(&nodeid, &addr->sin6_addr.in6_u.u6_addr32[3], sizeof(int));
+		}
+		log_printf(LOG_INFO, "Our Node ID is %d\n", nodeid);
+		freeaddrinfo(ainfo);
+	}
+
+	return 0;
+}
+
 
 /* Read just the stuff we need to get started.
    This does what 'cman_tool join' used to to */
@@ -812,9 +889,13 @@
 {
 	int error;
 
-	error = get_ccs_join_info();
+	get_overrides();
+	if (getenv("CMAN_NOCCS"))
+		error = noccs_defaults();
+	else
+		error = get_ccs_join_info();
 	if (error) {
-		log_printf(LOG_ERR, "Error reading CCS info, cannot start");
+		log_printf(LOG_ERR, "Error reading configuration info, cannot start");
 		return error;
 	}
 
@@ -822,3 +903,4 @@
 
 	return error;
 }
+
--- cluster/cman/daemon/commands.c	2007/11/20 09:02:10	1.75
+++ cluster/cman/daemon/commands.c	2007/11/29 11:19:12	1.76
@@ -382,9 +382,6 @@
 	if (ais_running)
 		return -EALREADY;
 
-	if (nodeid < 0 || nodeid > 4096)
-		return -EINVAL;
-
 	wanted_nodeid = nodeid;
 	return 0;
 }
@@ -417,8 +414,8 @@
 	}
 
 	time(&join_time);
-	us = add_new_node(nodename, wanted_nodeid, -1, expected_votes,
-			  NODESTATE_MEMBER);
+	us = add_new_node(nodename, wanted_nodeid, 1, expected_votes,
+			  NODESTATE_DEAD);
 	set_port_bit(us, 0);
 	us->us = 1;
 
@@ -1728,6 +1725,10 @@
 	msg->flags &= ~NODE_FLAGS_SEESDISALLOWED;
 
 	node = find_node_by_nodeid(nodeid);
+	if (!node) {
+		add_ais_node(nodeid, incarnation, num_ais_nodes);
+		node = find_node_by_nodeid(nodeid);
+	}
 	assert(node);
 
 	/* Newer nodes 6.1.0 onwards, set the DIRTY flag if they have state. If the new node has been down
@@ -1969,22 +1970,11 @@
  	/* This really should exist!! */
 	if (!node) {
 		char tempname[256];
-		node = malloc(sizeof(struct cluster_node));
-		if (!node) {
-			log_printf(LOG_ERR, "error allocating node struct for id %d, but CCS doesn't know about it anyway\n",
-				nodeid);
-			return;
-		}
 		log_printf(LOG_ERR, "Got node from AIS id %d with no CCS entry\n", nodeid);
 
-		memset(node, 0, sizeof(struct cluster_node));
-		node_add_ordered(node);
-		node->state = NODESTATE_DEAD;
-		node->votes = 1;
-
 		/* Emergency nodename */
-		sprintf(tempname, "Node%d\n", nodeid);
-		node->name = strdup(tempname);
+		sprintf(tempname, "Node%d", nodeid);
+		node = add_new_node(tempname, nodeid, 1, total_members, NODESTATE_DEAD);
 	}
 
 	if (node->state == NODESTATE_DEAD) {
@@ -2003,7 +1993,8 @@
 	P_MEMB("del_ais_node %d\n", nodeid);
 
 	node = find_node_by_nodeid(nodeid);
-	assert(node);
+	if (!node)
+		return;
 
 	/* If the node was fenced while up (ie independantly of fenced) then
 	 * don't clear the fenced flag. There is a timeout associated with
--- cluster/cman/man/cman_tool.8	2007/11/08 09:36:49	1.14
+++ cluster/cman/man/cman_tool.8	2007/11/29 11:19:12	1.15
@@ -232,6 +232,29 @@
 is prepared to wait. If the operation times out then a status of 2 is returned.
 Note that just because cman_tool has given up, does not mean that cman itself
 has stopped trying to join a cluster.
+.TP
+.I -X
+Tells cman not to use CCS to get cluster information. If you use this option then cman will
+apply several defaults to the cluster to get it going. The cluster name will be 
+"RHCluster", node IDs will default to the IP address of the node and remote node 
+names will show up as Node<nodeid>. All of these, apart from the node names can
+be overridded on the cman_tool command-line if required.
+.br
+If you have to set up fence devices, services or anything else in cluster.conf then
+this option is probably not worthwhile to you - the extra readability of sensible node
+names and numbers will make it worth using CCS for the cluster too. But for a simple
+failover cluster this might save you some effort.
+.br
+On each node using this configuration you will need to have the same authorisation key
+installed. To create this key run
+.br
+mkdir /etc/ais
+.br
+ais-keygen
+.br
+mv /etc/ais/authkey /etc/cluster/cman_authkey
+.br
+then copy that file to all nodes you want to join the cluster.
 .br
 .SH "NODES" OPTIONS
 .TP


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]