cluster: RHEL56 - rgmanager: Pass timeouts to resource agents

Lon Hohberger lon at fedoraproject.org
Wed Oct 27 20:02:45 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c157c955a35639769ee5f1a99bdad6b8c4ef11a3
Commit:        c157c955a35639769ee5f1a99bdad6b8c4ef11a3
Parent:        0e6f0601b3369d2915f8fb5ef35346ea19a49573
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Mon Jun 21 12:21:31 2010 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Wed Oct 27 15:55:42 2010 -0400

rgmanager: Pass timeouts to resource agents

This increases user control of resource agent
handling and allows users and developers to control
resource agent behavior more accurately.

Note that timeouts are not passed to the resource
agent if __enforce_timeouts is set.

Resolves: bz583788

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/include/res-ocf.h     |    1 +
 rgmanager/src/daemons/restree.c |   29 ++++++++++++++++++++++-------
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/rgmanager/include/res-ocf.h b/rgmanager/include/res-ocf.h
index 67b41cd..fbce665 100644
--- a/rgmanager/include/res-ocf.h
+++ b/rgmanager/include/res-ocf.h
@@ -32,6 +32,7 @@
 #define OCF_CHECK_LEVEL_STR "OCF_CHECK_LEVEL"
 #define OCF_RESOURCE_TYPE_STR "OCF_RESOURCE_TYPE"
 #define OCF_REFCNT_STR "OCF_RESKEY_RGMANAGER_meta_refcnt"
+#define OCF_TIMEOUT_STR "OCF_RESKEY_RGMANAGER_meta_timeout"
 
 /*
    LSB return codes 
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index 951dbda..a1358f7 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -130,7 +130,7 @@ kill_env(char **env)
    @see			build_env
  */
 static void
-add_ocf_stuff(resource_t *res, char **env, int depth, int refcnt)
+add_ocf_stuff(resource_t *res, char **env, int depth, int refcnt, int timeout)
 {
 	char ver[10];
 	char *minor, *val;
@@ -225,6 +225,17 @@ add_ocf_stuff(resource_t *res, char **env, int depth, int refcnt)
 		return;
 	snprintf(val, n, "%s=%s", OCF_REFCNT_STR, ver);
 	*env = val; env++;
+
+	/*
+	   Store the resource action timeout
+	 */
+	snprintf(ver, sizeof(ver), "%d", timeout);
+	n = strlen(OCF_TIMEOUT_STR) + strlen(ver) + 2;
+	val = malloc(n);
+	if (!val)
+		return;
+	snprintf(val, n, "%s=%s", OCF_TIMEOUT_STR, ver);
+	*env = val; env++;
 }
 
 
@@ -238,7 +249,7 @@ add_ocf_stuff(resource_t *res, char **env, int depth, int refcnt)
    @see			kill_env res_exec add_ocf_stuff
  */
 static char **
-build_env(resource_node_t *node, int depth, int refcnt)
+build_env(resource_node_t *node, int depth, int refcnt, int timeout)
 {
 	resource_t *res = node->rn_resource;
 	char **env;
@@ -246,7 +257,7 @@ build_env(resource_node_t *node, int depth, int refcnt)
 	int x, attrs, n;
 
 	for (attrs = 0; res->r_attrs && res->r_attrs[attrs].ra_name; attrs++);
-	attrs += 8; /*
+	attrs += 9; /*
 		   Leave space for:
 		   OCF_RA_VERSION_MAJOR
 		   OCF_RA_VERSION_MINOR
@@ -255,6 +266,7 @@ build_env(resource_node_t *node, int depth, int refcnt)
 		   OCF_RESOURCE_TYPE
 		   OCF_CHECK_LEVEL
 		   OCF_RESKEY_RGMANAGER_meta_refcnt
+		   OCF_RESKEY_RGMANAGER_meta_timeout
 		   (null terminator)
 		 */
 
@@ -294,7 +306,7 @@ build_env(resource_node_t *node, int depth, int refcnt)
 		++attrs;
 	}
 
-	add_ocf_stuff(res, &env[attrs], depth, refcnt);
+	add_ocf_stuff(res, &env[attrs], depth, refcnt, timeout);
 
 	return env;
 }
@@ -369,7 +381,7 @@ res_exec(resource_node_t *node, int op, const char *arg, int depth)
 	int childpid, pid;
 	int ret = 0;
 	int act_index;
-	time_t sleeptime = 0;
+	time_t sleeptime = 0, timeout = 0;
 	char **env = NULL;
 	resource_t *res = node->rn_resource;
 	const char *op_str = agent_op_str(op);
@@ -389,8 +401,11 @@ res_exec(resource_node_t *node, int op, const char *arg, int depth)
 	if (act_index < 0)
 		return 0;
 
+	if (!(node->rn_flags & RF_ENFORCE_TIMEOUTS))
+		timeout = node->rn_actions[act_index].ra_timeout;
+
 #ifdef DEBUG
-	env = build_env(node, depth, node->rn_resource->r_incarnations);
+	env = build_env(node, depth, node->rn_resource->r_incarnations, (int)timeout);
 	if (!env)
 		return -errno;
 #endif
@@ -419,7 +434,7 @@ res_exec(resource_node_t *node, int op, const char *arg, int depth)
 #endif
 
 #ifndef DEBUG
-		env = build_env(node, depth, node->rn_resource->r_incarnations);
+		env = build_env(node, depth, node->rn_resource->r_incarnations, (int)timeout);
 #endif
 
 		if (!env)


More information about the cluster-commits mailing list