cluster: STABLE3 - rgmanager: Add per-resource status check tolerances
Lon Hohberger
lon at fedoraproject.org
Wed May 5 15:27:26 UTC 2010
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=a72b410fb79436e46b67a60eb610f797fbadb538
Commit: a72b410fb79436e46b67a60eb610f797fbadb538
Parent: 2c9f4e1360ee8ce4190e22f20c8b15cc7e33470d
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Tue May 4 17:51:45 2010 -0400
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Wed May 5 11:23:15 2010 -0400
rgmanager: Add per-resource status check tolerances
Resolves: bz583789
Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
rgmanager/include/reslist.h | 1 +
rgmanager/src/daemons/restree.c | 47 +++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h
index 6f0724b..79cbbb4 100644
--- a/rgmanager/include/reslist.h
+++ b/rgmanager/include/reslist.h
@@ -110,6 +110,7 @@ typedef struct _rg_node {
resource_t *rn_resource;
resource_act_t *rn_actions;
restart_counter_t rn_restart_counter;
+ restart_counter_t rn_failure_counter;
int rn_state; /* State of this instance of rn_resource */
int rn_flags;
int rn_last_status;
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index 56f54c7..85f9ec1 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -510,6 +510,8 @@ do_load_resource(int ccsfd, char *base,
char *ref;
resource_node_t *node;
resource_t *curres;
+ time_t failure_expire = 0;
+ int max_failures = 0;
snprintf(tok, sizeof(tok), "%s/@ref", base);
@@ -604,6 +606,36 @@ do_load_resource(int ccsfd, char *base,
free(ref);
}
+ /* per-resource-node failures / expire times */
+ snprintf(tok, sizeof(tok), "%s/@__max_failures", base);
+#ifndef NO_CCS
+ if (ccs_get(ccsfd, tok, &ref) == 0) {
+#else
+ if (conf_get(tok, &ref) == 0) {
+#endif
+ max_failures = atoi(ref);
+ if (max_failures < 0)
+ max_failures = 0;
+ free(ref);
+ }
+
+ snprintf(tok, sizeof(tok), "%s/@__failure_expire_time", base);
+#ifndef NO_CCS
+ if (ccs_get(ccsfd, tok, &ref) == 0) {
+#else
+ if (conf_get(tok, &ref) == 0) {
+#endif
+ failure_expire = (time_t)expand_time(ref);
+ if ((int64_t)failure_expire < 0)
+ failure_expire = 0;
+ free(ref);
+ }
+
+ if (max_failures && failure_expire) {
+ node->rn_failure_counter = restart_init(failure_expire,
+ max_failures);
+ }
+
curres->r_refs++;
*newnode = node;
@@ -851,6 +883,10 @@ destroy_resource_tree(resource_node_t **tree)
restart_cleanup(node->rn_restart_counter);
}
+ if (node->rn_failure_counter) {
+ restart_cleanup(node->rn_failure_counter);
+ }
+
if(node->rn_actions){
free(node->rn_actions);
}
@@ -1149,6 +1185,15 @@ do_status(resource_node_t *node)
* completed. */
node->rn_actions[idx].ra_last = time(NULL);
+ /* If we have not exceeded our failure count threshold, then fudge
+ * the status check this round */
+ if (x && node->rn_failure_counter) {
+ if (!restart_threshold_exceeded(node->rn_failure_counter)) {
+ x = 0;
+ restart_add(node->rn_failure_counter);
+ }
+ }
+
node->rn_last_status = x;
node->rn_last_depth = node->rn_actions[idx].ra_depth;
node->rn_checked = 1;
@@ -1222,6 +1267,8 @@ clear_checks(resource_node_t *node)
node->rn_actions[x].ra_last = now;
}
+ restart_clear(node->rn_failure_counter);
+
node->rn_checked = 0;
node->rn_last_status = 0;
node->rn_last_depth = 0;
More information about the cluster-commits
mailing list