[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