All of lore.kernel.org
 help / color / mirror / Atom feed
From: lhh@sourceware.org <lhh@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/rgmanager include/reslist.h init.d/rgm ...
Date: 26 Jan 2007 21:42:59 -0000	[thread overview]
Message-ID: <20070126214259.30283.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	lhh at sourceware.org	2007-01-26 21:42:32

Modified files:
	rgmanager/include: reslist.h 
	rgmanager/init.d: rgmanager 
	rgmanager/src/daemons: fo_domain.c reslist.c resrules.c 
	                       restree.c 

Log message:
	Add override for action timings

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/reslist.h.diff?cvsroot=cluster&r1=1.15&r2=1.16
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/init.d/rgmanager.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/fo_domain.c.diff?cvsroot=cluster&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/reslist.c.diff?cvsroot=cluster&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/resrules.c.diff?cvsroot=cluster&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/restree.c.diff?cvsroot=cluster&r1=1.23&r2=1.24

--- cluster/rgmanager/include/reslist.h	2006/09/27 16:28:41	1.15
+++ cluster/rgmanager/include/reslist.h	2007/01/26 21:42:24	1.16
@@ -75,18 +75,19 @@
 
 
 typedef struct _resource_attribute {
-	int	ra_flags;
-	/* XXX possible alignment problem on ia64 */
 	char	*ra_name;
 	char	*ra_value;
+	int	ra_flags;
+	int	_pad_;
 } resource_attr_t;
 
 
 typedef struct _resource_child {
-	char    rc_forbid;
+	char	*rc_name;
 	int	rc_startlevel;
 	int	rc_stoplevel;
-	char	*rc_name;
+	int	rc_forbid;
+	int	_pad_;
 } resource_child_t;
 
 
@@ -96,6 +97,7 @@
 	time_t	ra_last;
 	time_t	ra_interval;
 	int	ra_depth;
+	int	ra_flags;
 } resource_act_t;
 
 
@@ -139,7 +141,7 @@
 	list_head();
 	char	*fdn_name;
 	int	fdn_prio;
-	int	_pad_; /* align */
+	int	fdn_nodeid;
 } fod_node_t;
 
 typedef struct _fod {
--- cluster/rgmanager/init.d/rgmanager	2006/06/02 17:37:10	1.5
+++ cluster/rgmanager/init.d/rgmanager	2007/01/26 21:42:30	1.6
@@ -95,10 +95,14 @@
 	start)
 		echo -n $"Starting $ID: "
 		daemon $RGMGRD $RGMGR_OPTS
+		ret=$?
 		echo
 
 		# To be consistent...
-		touch /var/lock/subsys/rgmanager
+		if [ $ret -eq 0 ]; then
+			touch /var/lock/subsys/rgmanager
+		fi
+		exit $ret
 		;;
 
 	restart)
--- cluster/rgmanager/src/daemons/fo_domain.c	2006/09/27 16:28:41	1.11
+++ cluster/rgmanager/src/daemons/fo_domain.c	2007/01/26 21:42:30	1.12
@@ -65,11 +65,12 @@
 int group_property(char *, char *, char *, size_t);
 
 fod_node_t *
-get_node(int ccsfd, char *base, int idx, fod_t *domain)
+fod_get_node(int ccsfd, char *base, int idx, fod_t *domain)
 {
 	fod_node_t *fodn;
 	char xpath[256];
-	char *ret;
+	char *ret, *nid;
+	int nodeid;
 
 	snprintf(xpath, sizeof(xpath), "%s/failoverdomainnode[%d]/@name",
 		 base, idx);
@@ -86,6 +87,20 @@
 		return NULL;
 	} while (!list_done(&domain->fd_nodes, fodn));
 
+	snprintf(xpath, sizeof(xpath),
+		 "/cluster/clusternodes/clusternode[@name=\"%s\"]/@nodeid",
+		 ret);
+	if ((ccs_get(ccsfd, xpath, &nid) == 0) && nid) {
+		nodeid = atoi(nid);
+		free(nid);
+	} else {
+		clulog(LOG_ERR, "#XX: Node %s in domain %s is not in "
+				"the configuration\n", ret, domain->fd_name);
+		/* No nodeid == bad failover domain */
+		free(ret);
+		return NULL;
+	}
+
 	fodn = malloc(sizeof(*fodn));
 	if (!fodn)
 		return NULL;
@@ -94,7 +109,8 @@
 	/* Already malloc'd; simply store */
 	fodn->fdn_name = ret;
 	fodn->fdn_prio = 0;
-
+	fodn->fdn_nodeid = nodeid;
+	
 	snprintf(xpath, sizeof(xpath), "%s/failoverdomainnode[%d]/@priority",
 		 base, idx);
 	if (ccs_get(ccsfd, xpath, &ret) != 0)
@@ -110,10 +126,10 @@
 
 
 fod_t *
-get_domain(int ccsfd, char *base, int idx, fod_t **domains)
+fod_get_domain(int ccsfd, char *base, int idx, fod_t **domains)
 {
 	fod_t *fod;
-	fod_node_t *fodn;
+	fod_node_t *fodn, *curr;
 	char xpath[256];
 	char *ret;
 	int x = 1;
@@ -169,12 +185,22 @@
 		 base, idx);
 
 	do {
-		fodn = get_node(ccsfd, xpath, x++, fod);
+		fodn = fod_get_node(ccsfd, xpath, x++, fod);
 		if (fodn) {
+			/*
+			list_do(&fod->fd_nodes, curr) {
+				// insert sorted 
+				if (fodn->fdn_prio < curr->fdn_prio) {
+					list_insert(&fod->fd_nodes, fodn);
+					if (curr == fod->fd_nodes)
+						fod->fd_nodes = fodn;
+				}
+			} while (!list_done(&fod->fd_nodes, curr));
+			*/
 			list_insert(&fod->fd_nodes, fodn);
 		}
 	} while (fodn);
-
+	
 	return fod;
 }
 
@@ -190,7 +216,7 @@
 		 RESOURCE_TREE_ROOT "/failoverdomains");
 
 	do {
-		fod = get_domain(ccsfd, xpath, x++, domains);
+		fod = fod_get_domain(ccsfd, xpath, x++, domains);
 		if (fod) {
 			list_insert(domains, fod);
 		}
@@ -200,6 +226,22 @@
 }
 
 
+fod_t *
+fod_find_domain(fod_t **domains, char *name)
+{
+	fod_t *dom;
+	
+	list_do(domains, dom) {
+		
+		if (!strcasecmp(dom->fd_name, name))
+			return dom;
+	
+	} while (!list_done(domains,dom));
+	
+	return NULL;
+}
+
+
 void
 deconstruct_domains(fod_t **domains)
 {
@@ -244,8 +286,12 @@
 		}
 
 		list_do(&fod->fd_nodes, fodn) {
-			printf("  Node %s (priority %d)\n",
+			printf("  Node %s priority %d",
 			       fodn->fdn_name, fodn->fdn_prio);
+			if (fodn->fdn_nodeid) {
+				printf(" nodeid %d", fodn->fdn_nodeid);
+			}
+			printf("\n");
 		} while (!list_done(&fod->fd_nodes, fodn));
 	} while (!list_done(domains, fod));
 }
--- cluster/rgmanager/src/daemons/reslist.c	2006/07/11 23:52:41	1.14
+++ cluster/rgmanager/src/daemons/reslist.c	2007/01/26 21:42:30	1.15
@@ -261,8 +261,6 @@
 
 /**
    Find a root resource by ref (service, usually).  No name is required.
-   Only one type of root resource may exist because of the primary
-   attribute flag
 
    @param reslist	List of resources to traverse.
    @param ref		Reference
@@ -286,6 +284,7 @@
 	} else {
 		/* Default type */
 		type = "service";
+		name = ref;
 	}
 
 	list_do(reslist, curr) {
@@ -542,6 +541,83 @@
 }
 
 
+/* Copied from resrules.c -- _get_actions */
+void
+_get_actions_ccs(int ccsfd, char *base, resource_t *res)
+{
+	char xpath[256];
+	int idx = 0;
+	char *act, *ret;
+	int interval, timeout, depth;
+
+	do {
+		/* setting these to -1 prevents overwriting with 0 */
+		interval = -1;
+		depth = -1;
+		act = NULL;
+		timeout = -1;
+
+		snprintf(xpath, sizeof(xpath),
+			 "%s/action[%d]/@name", base, ++idx);
+
+#ifndef NO_CCS
+		if (ccs_get(ccsfd, xpath, &act) != 0)
+#else
+		if (conf_get(xpath, &act) != 0)
+#endif
+			break;
+
+		snprintf(xpath, sizeof(xpath),
+			 "%s/action[%d]/@timeout", base, idx);
+#ifndef NO_CCS
+		if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) {
+#else
+		if (conf_get(xpath, &ret) == 0 && ret) {
+#endif
+			timeout = expand_time(ret);
+			if (timeout < 0)
+				timeout = 0;
+			free(ret);
+		}
+
+		snprintf(xpath, sizeof(xpath),
+			 "%s/action[%d]/@interval", base, idx);
+#ifndef NO_CCS
+		if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) {
+#else
+		if (conf_get(xpath, &ret) == 0 && ret) {
+#endif
+			interval = expand_time(ret);
+			if (interval < 0)
+				interval = 0;
+			free(ret);
+		}
+
+		if (!strcmp(act, "status") || !strcmp(act, "monitor")) {
+			snprintf(xpath, sizeof(xpath),
+				 "%s/action[%d]/@depth", base, idx);
+#ifndef NO_CCS
+			if (ccs_get(ccsfd, xpath, &ret) == 0 && ret) {
+#else
+			if (conf_get(xpath, &ret) == 0 && ret) {
+#endif
+				depth = atoi(ret);
+				if (depth < 0)
+					depth = 0;
+				
+				/* */
+				if (ret[0] == '*')
+					depth = -1;
+				free(ret);
+			}
+		}
+
+		if (store_action(&res->r_actions, act, depth, timeout,
+				 interval) != 0)
+			free(act);
+	} while (1);
+}
+
 
 /**
    Try to load all the attributes in our rule set.  If none are found,
@@ -653,6 +729,7 @@
 	}
 
 	res->r_actions = act_dup(rule->rr_actions);
+	_get_actions_ccs(ccsfd, base, res);
 
 	return res;
 }
--- cluster/rgmanager/src/daemons/resrules.c	2006/10/20 20:59:49	1.16
+++ cluster/rgmanager/src/daemons/resrules.c	2007/01/26 21:42:30	1.17
@@ -46,16 +46,28 @@
 store_rule(resource_rule_t **rulelist, resource_rule_t *newrule)
 {
 	resource_rule_t *curr;
-
+	
 	list_do(rulelist, curr) {
-		if (!strcmp(newrule->rr_type, curr->rr_type)) {
+		if (!strcasecmp(newrule->rr_type, curr->rr_type)) {
 			fprintf(stderr, "Error storing %s: Duplicate\n",
 				newrule->rr_type);
 			return -1;
 		}
 
 	} while (!list_done(rulelist, curr));
-			
+	
+	/* insert sorted in alphabetical order so rg_test produces
+	 * reproducible output all the time */
+	list_do(rulelist, curr) {
+		if (strcasecmp(newrule->rr_type, curr->rr_type) < 0) {
+			list_insert(&curr, newrule);
+			/* reset list if we have a new low */
+			if (curr == *rulelist)
+				*rulelist = newrule;
+			return 0;
+		}
+	} while (!list_done(rulelist, curr));
+		
 	list_insert(rulelist, newrule);
 	return 0;
 }
@@ -218,17 +230,36 @@
 }
 
 
+/**
+ * Store a resource action
+ * @param actsp		Action array; may be modified and returned!
+ * @param name		Name of the action
+ * @param depth		Resource depth (status/monitor; -1 means *ALL LEVELS*
+ * 			... this means that only the highest-level check depth
+ * 			will ever be performed!)
+ * @param timeout	Timeout (not used)
+ * @param interval	Time interval for status/monitor
+ * @return		0 on success, -1 on failure
+ * 
+ */
 int
 store_action(resource_act_t **actsp, char *name, int depth,
 	     int timeout, int interval)
 {
-	int x = 0;
+	int x = 0, replace = 0;
 	resource_act_t *acts = *actsp;
 
 	if (!name)
 		return -1;
+	
+	if (depth < 0 && timeout < 0 && interval < 0)
+		return -1;
 
 	if (!acts) {
+		/* Can't create with anything < 0 */
+		if (depth < 0 || timeout < 0 || interval < 0)
+			return -1;
+		
 		acts = malloc(sizeof(resource_act_t) * 2);
 		if (!acts)
 			return -1;
@@ -244,17 +275,38 @@
 
 	for (x = 0; acts[x].ra_name; x++) {
 		if (!strcmp(acts[x].ra_name, name) &&
-		    depth == acts[x].ra_depth) {
-			printf("Skipping duplicate action/depth %s/%d\n",
-			       name, depth);
-			return -1;
+		    (depth == acts[x].ra_depth || depth == -1)) {
+			printf("Replacing action '%s' depth %d: ",
+			       name, acts[x].ra_depth);
+			if (timeout >= 0) {
+				printf("timeout: %d->%d ",
+				       (int)acts[x].ra_timeout,
+				       (int)timeout);
+				acts[x].ra_timeout = timeout;
+			}
+			if (interval >= 0) {
+				printf("interval: %d->%d",
+				       (int)acts[x].ra_interval,
+				       (int)interval);
+				acts[x].ra_interval = interval;
+			}
+			printf("\n");
+			replace = 1;
 		}
 	}
+	
+	if (replace)
+		/* If we replaced something, we're done */
+		return 1;
+	
+	/* Can't create with anything < 0 */
+	if (depth < 0 || timeout < 0 || interval < 0)
+		return -1;
 
 	acts = realloc(acts, sizeof(resource_act_t) * (x+2));
 	if (!acts)
 		return -1;
-
+	
 	acts[x].ra_name = name;
 	acts[x].ra_depth = depth;
 	acts[x].ra_timeout = timeout;
@@ -267,6 +319,7 @@
 }
 
 
+
 void
 _get_actions(xmlDocPtr doc, xmlXPathContextPtr ctx, char *base,
 		 resource_rule_t *rr)
@@ -294,8 +347,8 @@
 		ret = xpath_get_one(doc, ctx, xpath);
 		if (ret) {
 			timeout = expand_time(ret);
-			if (interval < 0)
-				interval = 0;
+			if (timeout < 0)
+				timeout = 0;
 			free(ret);
 		}
 
@@ -322,9 +375,8 @@
 		}
 
 		if (store_action(&rr->rr_actions, act, depth, timeout,
-				 interval) < 0)
+				 interval) != 0)
 			free(act);
-		
 	} while (1);
 }
 
@@ -866,6 +918,14 @@
 		type = xpath_get_one(doc, ctx, base);
 		if (!type)
 			break;
+		
+		if (!strcasecmp(type, "action")) {
+			fprintf(stderr,
+				"Error: Resource type '%s' is reserved",
+				type);
+			free(type);
+			break;
+		}
 
 		rr = malloc(sizeof(*rr));
 		if (!rr)
@@ -944,6 +1004,7 @@
 	struct dirent *de;
 	char *fn;//, *dot;
 	char path[2048];
+	struct stat st_buf;
 
 	dir = opendir(rpath);
 	if (!dir)
@@ -962,8 +1023,15 @@
 
 		snprintf(path, sizeof(path), "%s/%s",
 			 rpath, de->d_name);
-
-		load_resource_rulefile(path, rules);
+		
+		if (stat(path, &st_buf))
+			continue;
+		
+		if (S_ISDIR(st_buf.st_mode))
+			continue;
+		
+		if (st_buf.st_mode & (S_IXUSR|S_IXOTH|S_IXGRP))
+			load_resource_rulefile(path, rules);
 	}
 	xmlCleanupParser();
 
--- cluster/rgmanager/src/daemons/restree.c	2006/09/21 18:04:04	1.23
+++ cluster/rgmanager/src/daemons/restree.c	2007/01/26 21:42:30	1.24
@@ -632,6 +632,7 @@
 {
 	resource_node_t *node;
 	int x, y;
+	char *val;
 
 	list_do(tree, node) {
 		for (x = 0; x < level; x++)
@@ -654,11 +655,14 @@
 		     node->rn_resource->r_attrs[x].ra_value; x++) {
 			for (y = 0; y < level+1; y++)
 				printf("  ");
+
+			val = attr_value(node,
+					 node->rn_resource->r_attrs[x].ra_name);
+			if (!val &&
+			    node->rn_resource->r_attrs[x].ra_flags&RA_INHERIT)
+				continue;
 			printf("%s = \"%s\";\n",
-			       node->rn_resource->r_attrs[x].ra_name,
-			       attr_value(node,
-					  node->rn_resource->r_attrs[x].ra_name)
-			      );
+			       node->rn_resource->r_attrs[x].ra_name, val);
 		}
 
 		_print_resource_tree(&node->rn_child, level + 1);



                 reply	other threads:[~2007-01-26 21:42 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070126214259.30283.qmail@sourceware.org \
    --to=lhh@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.