[Cluster-devel] cluster/group/dlm_controld action.c

teigland at sourceware.org teigland at sourceware.org
Wed Jun 6 21:10:04 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL5
Changes by:	teigland at sourceware.org	2007-06-06 21:10:03

Modified files:
	group/dlm_controld: action.c 

Log message:
	Split the new get_weight() function into two pieces so it's easier to
	understand (still does exactly the same steps).

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/action.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8.2.4&r2=1.8.2.5

--- cluster/group/dlm_controld/action.c	2007/06/05 20:12:43	1.8.2.4
+++ cluster/group/dlm_controld/action.c	2007/06/06 21:10:03	1.8.2.5
@@ -211,60 +211,94 @@
 #define MASTER_NAME   MASTER_PATH "/@name"
 #define MASTER_WEIGHT MASTER_PATH "[@name=\"%s\"]/@weight"
 
-static int get_weight(int cd, int nodeid, char *lockspace)
-{
-	char path[PATH_MAX], *str, *name;
-	int error, weight, flag = 0, count = 0;
+/* look for node's weight in the dlm/lockspace section */
 
-	name = nodeid2name(nodeid);
-	if (!name) {
-		log_error("no name for nodeid %d", nodeid);
-		return 1;
-	}
+static int get_weight_lockspace(int cd, char *node, char *lockspace)
+{
+	char path[PATH_MAX], *str;
+	int error, weight;
+	int master_count = 0, node_is_master = 0;
 
 	memset(path, 0, PATH_MAX);
 	sprintf(path, MASTER_NAME, lockspace);
 
-	while (1)
-	{
+	while (1) {
 		error = ccs_get_list(cd, path, &str);
-		if (error || !str) {
+		if (error || !str)
 			break;
-		}
-		count++;
-		if (strcmp(str, name) == 0) {
-			flag = 1;
-		}
+		master_count++;
+		if (strcmp(str, node) == 0)
+			node_is_master = 1;
 		free(str);
 	}
 
-	if (count > 0) {
-		if (flag) {
-			memset(path, 0, PATH_MAX);
-			sprintf(path, MASTER_WEIGHT, lockspace, name);
-
-			error = ccs_get(cd, path, &str);
-			if (error || !str)
-				return 1;
-
-			weight = atoi(str);
-			free(str);
-			return weight;
-		} else {
-			return 0;
-		}
-	} else {
-		memset(path, 0, PATH_MAX);
-		sprintf(path, WEIGHT_PATH, name);
+	/* if there are no masters, next check for a clusternode weight */
 
-		error = ccs_get(cd, path, &str);
-		if (error || !str)
-			return 1;
+	if (!master_count)
+		return -1;
 
-		weight = atoi(str);
-		free(str);
-		return weight;
+	/* if there's a master and this node isn't it, it gets weight 0 */
+
+	if (!node_is_master)
+		return 0;
+
+	/* master gets its specified weight or 1 if none is given */
+
+	memset(path, 0, PATH_MAX);
+	sprintf(path, MASTER_WEIGHT, lockspace, node);
+
+	error = ccs_get(cd, path, &str);
+	if (error || !str)
+		return 1;
+
+	weight = atoi(str);
+	free(str);
+	return weight;
+}
+
+/* look for node's weight on its clusternode line */
+
+static int get_weight_clusternode(int cd, char *node, char *lockspace)
+{
+	char path[PATH_MAX], *str;
+	int error, weight;
+
+	memset(path, 0, PATH_MAX);
+	sprintf(path, WEIGHT_PATH, node);
+
+	error = ccs_get(cd, path, &str);
+	if (error || !str)
+		return -1;
+
+	weight = atoi(str);
+	free(str);
+	return weight;
+}
+
+static int get_weight(int cd, int nodeid, char *lockspace)
+{
+	char *node;
+	int w;
+
+	node = nodeid2name(nodeid);
+	if (!node) {
+		log_error("no name for nodeid %d", nodeid);
+		w = 1;
+		goto out;
 	}
+
+	w = get_weight_lockspace(cd, node, lockspace);
+	if (w >= 0)
+		goto out;
+
+	w = get_weight_clusternode(cd, node, lockspace);
+	if (w >= 0)
+		goto out;
+
+	/* default weight is 1 */
+	w = 1;
+ out:
+	return w;
 }
 
 int set_members(char *name, int new_count, int *new_members)




More information about the Cluster-devel mailing list