From: lhh@sourceware.org <lhh@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/rgmanager ChangeLog include/res-ocf.h ...
Date: 31 Jul 2007 17:54:56 -0000 [thread overview]
Message-ID: <20070731175456.10308.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: lhh at sourceware.org 2007-07-31 17:54:55
Modified files:
rgmanager : ChangeLog
rgmanager/include: res-ocf.h reslist.h
rgmanager/src/clulib: rg_strings.c
rgmanager/src/daemons: groups.c reslist.c resrules.c restree.c
test.c
rgmanager/src/resources: ra-api-1-modified.dtd service.sh vm.sh
Log message:
Fix bug #248727
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.31.2.22&r2=1.31.2.23
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/res-ocf.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.16.1&r2=1.1.16.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/reslist.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.15.2.4&r2=1.15.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/clulib/rg_strings.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.4&r2=1.5.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/groups.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.25.2.10&r2=1.25.2.11
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/reslist.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.14.2.3&r2=1.14.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/resrules.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.16.2.6&r2=1.16.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/restree.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.23.2.8&r2=1.23.2.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/test.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.6.2.4&r2=1.6.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/ra-api-1-modified.dtd.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4&r2=1.4.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/service.sh.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.7.2.4&r2=1.7.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/vm.sh.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.5&r2=1.1.2.6
--- cluster/rgmanager/ChangeLog 2007/07/24 13:53:07 1.31.2.22
+++ cluster/rgmanager/ChangeLog 2007/07/31 17:54:54 1.31.2.23
@@ -1,3 +1,23 @@
+2007-07-31 Lon Hohberger <lhh@redhat.com>
+ * general: Make VMs not change state when added/removed from the
+ cluster config or bounce services/VMs when minor config changes
+ are made. (#248727)
+ * include/res-ocf.h: Add reconfigure operation
+ * include/reslist.h: Add flags allowing reconfigurable options in
+ resource agent metadata, and per-agent flags which allow resources
+ to be added w/o initialization / removed w/o kill.
+ * src/clulib/rg_strings.c: Add string definition for reconfigure op
+ * src/daemons/groups.c: Allow no-init-on-add and no-kill-on-delete
+ flags to work
+ * src/daemons/reslist.c: Allow resource comparison to take into
+ account reconfig flags and return a new value if the resource is
+ reconfigurable
+ * src/daemons/resrules.c: Code to support new flags
+ * src/daemons/restree.c: Code to support reconfiguration operation
+ * src/daemons/test.c: Code to support testing new reconfig ops and
+ behaviors
+ * src/resources/*: Add new flags to service and VM resource agents.
+
2007-07-24 Lon Hohberger <lhh@redhat.com>
* general: make threads exit with pthread_exit() so we can wrap/track them.
Add internal statedump (SIGUSR1) support.
--- cluster/rgmanager/include/res-ocf.h 2007/03/20 17:09:11 1.1.16.1
+++ cluster/rgmanager/include/res-ocf.h 2007/07/31 17:54:54 1.1.16.2
@@ -62,5 +62,6 @@
#define RS_META_DATA (11)
#define RS_VALIDATE (12)
#define RS_MIGRATE (13)
+#define RS_RECONFIG (14)
#endif
--- cluster/rgmanager/include/reslist.h 2007/06/26 21:55:45 1.15.2.4
+++ cluster/rgmanager/include/reslist.h 2007/07/31 17:54:54 1.15.2.5
@@ -25,10 +25,11 @@
#include <libxml/xpath.h>
-#define RA_PRIMARY (1<<0)
-#define RA_UNIQUE (1<<1)
-#define RA_REQUIRED (1<<2)
-#define RA_INHERIT (1<<3)
+#define RA_PRIMARY (1<<0) /** Primary key */
+#define RA_UNIQUE (1<<1) /** Unique for given type */
+#define RA_REQUIRED (1<<2) /** Required (or an error if not present */
+#define RA_INHERIT (1<<3) /** Inherit a parent resource's attr */
+#define RA_RECONFIG (1<<4) /** Allow inline reconfiguration */
#define RF_INLINE (1<<0)
#define RF_DEFINED (1<<1)
@@ -37,6 +38,15 @@
#define RF_COMMON (1<<4) /** " */
#define RF_INDEPENDENT (1<<5) /** Define this for a resource if it is
otherwise an independent subtree */
+#define RF_RECONFIG (1<<6)
+
+#define RF_INIT (1<<7) /** Resource rule: Initialize this resource
+ class on startup */
+#define RF_DESTROY (1<<8) /** Resource rule flag: Destroy this
+ resource class if you delete it from
+ the configuration */
+
+
#define RES_STOPPED (0)
#define RES_STARTED (1)
--- cluster/rgmanager/src/clulib/rg_strings.c 2007/07/06 18:50:22 1.5.2.4
+++ cluster/rgmanager/src/clulib/rg_strings.c 2007/07/31 17:54:54 1.5.2.5
@@ -106,6 +106,7 @@
{RS_META_DATA, "meta-data"}, /* printenv */
{RS_VALIDATE, "validate-all"},
{RS_MIGRATE, "migrate"},
+ {RS_RECONFIG, "reconfig"},
{0 , NULL}
};
--- cluster/rgmanager/src/daemons/groups.c 2007/07/24 13:53:08 1.25.2.10
+++ cluster/rgmanager/src/daemons/groups.c 2007/07/31 17:54:54 1.25.2.11
@@ -1222,6 +1222,7 @@
do_condstops(void)
{
resource_node_t *curr;
+ struct dlm_lksb lockp;
rg_state_t svcblk;
int need_kill;
char rg[64];
@@ -1249,6 +1250,24 @@
clulog(LOG_DEBUG, "Removing %s\n", rg);
}
+ if (!curr->rn_child && ((curr->rn_resource->r_rule->rr_flags &
+ RF_DESTROY) == 0) && group_migratory(rg, 0) &&
+ need_kill == 1) {
+ /* Do something smart here: flip state? */
+ clulog(LOG_NOTICE,
+ "%s removed from the config, but I am not stopping it.\n",
+ rg);
+ if (rg_lock(rg, &lockp) != 0)
+ continue;
+ if (get_rg_state(rg, &svcblk) < 0)
+ goto cont;
+ svcblk.rs_state = RG_STATE_DISABLED;
+ set_rg_state(rg, &svcblk);
+cont:
+ rg_unlock(&lockp);
+ continue;
+ }
+
rt_enqueue_request(rg, need_kill ? RG_DISABLE : RG_CONDSTOP,
NULL, 0, 0, 0, 0);
@@ -1282,7 +1301,8 @@
/* New RG. We'll need to initialize it. */
need_init = 0;
- if (curr->rn_resource->r_flags & RF_NEEDSTART)
+ if (!(curr->rn_resource->r_flags & RF_RECONFIG) &&
+ (curr->rn_resource->r_flags & RF_NEEDSTART))
need_init = 1;
if (!need_init) {
@@ -1305,7 +1325,17 @@
if (need_init) {
++new_groups;
- clulog(LOG_DEBUG, "Initializing %s\n", rg);
+ clulog(LOG_NOTICE, "Initializing %s\n", rg);
+ }
+
+ if (!curr->rn_child && ((curr->rn_resource->r_rule->rr_flags &
+ RF_INIT) == 0) && group_migratory(rg, 0) &&
+ need_init == 1) {
+ /* Do something smart here? */
+ clulog(LOG_NOTICE,
+ "%s was added to the config, but I am not initializing it.\n",
+ rg);
+ continue;
}
rt_enqueue_request(rg, need_init ? RG_INIT : RG_CONDSTART,
--- cluster/rgmanager/src/daemons/reslist.c 2007/04/26 20:40:28 1.14.2.3
+++ cluster/rgmanager/src/daemons/reslist.c 2007/07/31 17:54:54 1.14.2.4
@@ -176,18 +176,29 @@
/**
Compare two resources.
+ @param left Left resource
+ @param right Right resource
+ @return -1 on different resource, 0 if the same, 1 if different,
+ 2 if different, but only safe resources are different
+
*/
int
rescmp(resource_t *left, resource_t *right)
{
- int x, y = 0, found;
+ int x, y = 0, found = 0, ret = 0;
+
/* Completely different resource class... */
if (strcmp(left->r_rule->rr_type, right->r_rule->rr_type)) {
- //printf("Er, wildly different resource type! ");
return -1;
}
+ /*
+ printf("Comparing %s:%s to %s:%s\n",
+ left->r_rule->rr_type, left->r_attrs[0].ra_value,
+ right->r_rule->rr_type, right->r_attrs[0].ra_value)
+ */
+
for (x = 0; left->r_attrs && left->r_attrs[x].ra_name; x++) {
found = 0;
@@ -203,35 +214,52 @@
left->r_attrs[x].ra_flags) {
/* Flags are different. Change in
resource agents? */
- //printf("flags differ ");
+ /*
+ printf("* flags differ %08x vs %08x\n",
+ left->r_attrs[x].ra_flags,
+ right->r_attrs[y].ra_flags);
+ */
return 1;
}
if (strcmp(right->r_attrs[y].ra_value,
left->r_attrs[x].ra_value)) {
/* Different attribute value. */
- //printf("different value for attr '%s' ",
- //right->r_attrs[y].ra_name);
- return 1;
+ /*
+ printf("* different value for attr '%s':"
+ " '%s' vs '%s'",
+ right->r_attrs[y].ra_name,
+ left->r_attrs[x].ra_value,
+ right->r_attrs[y].ra_value);
+ */
+ if (left->r_attrs[x].ra_flags & RA_RECONFIG) {
+ /* printf(" [SAFE]\n"); */
+ ret = 2;
+ } else {
+ /* printf("\n"); */
+ return 1;
+ }
}
}
/* Attribute missing -> different attribute value. */
if (!found) {
- //printf("Attribute %s deleted ",
- //left->r_attrs[x].ra_name);
+ /*
+ printf("* Attribute '%s' deleted\n",
+ left->r_attrs[x].ra_name);
+ */
return 1;
}
}
/* Different attribute count */
if (x != y) {
- //printf("Attribute count differ (attributes added!) ");
+ /* printf("* Attribute count differ (attributes added!) "); */
return 1;
}
/* All the same */
- return 0;
+ return ret;
}
@@ -288,7 +316,7 @@
resource_t *curr;
char ref_buf[128];
char *type;
- char *name;
+ char *name = ref;
int x;
snprintf(ref_buf, sizeof(ref_buf), "%s", ref);
@@ -300,6 +328,7 @@
} else {
/* Default type */
type = "service";
+ name = ref;
}
list_do(reslist, curr) {
@@ -543,6 +572,8 @@
printf(" [NEEDSTOP]");
if (res->r_flags & RF_COMMON)
printf(" [COMMON]");
+ if (res->r_flags & RF_RECONFIG)
+ printf(" [RECONFIG]");
printf("\n");
if (res->r_rule->rr_maxrefs)
@@ -578,6 +609,8 @@
printf(" unique");
if (res->r_attrs[x].ra_flags & RA_REQUIRED)
printf(" required");
+ if (res->r_attrs[x].ra_flags & RA_RECONFIG)
+ printf(" reconfig");
if (res->r_attrs[x].ra_flags & RA_INHERIT)
printf(" inherit(\"%s\")", res->r_attrs[x].ra_value);
printf(" ]\n");
--- cluster/rgmanager/src/daemons/resrules.c 2007/06/26 21:55:46 1.16.2.6
+++ cluster/rgmanager/src/daemons/resrules.c 2007/07/31 17:54:54 1.16.2.7
@@ -163,6 +163,36 @@
/**
+ Get and store a bit field.
+
+ @param doc Pre-parsed XML document pointer.
+ @param ctx Pre-allocated XML XPath context pointer.
+ @param base XPath prefix to search
+ @param rr Resource rule to store new information in.
+ */
+void
+_get_rule_flag(xmlDocPtr doc, xmlXPathContextPtr ctx, char *base,
+ resource_rule_t *rr, char *flag, int bit)
+{
+ char xpath[256];
+ char *ret = NULL;
+
+ snprintf(xpath, sizeof(xpath),
+ "%s/attributes/@%s",
+ base, flag);
+ ret = xpath_get_one(doc, ctx, xpath);
+ if (ret) {
+ if (atoi(ret)) {
+ rr->rr_flags |= bit;
+ } else {
+ rr->rr_flags &= ~bit;
+ }
+ free(ret);
+ }
+}
+
+
+/**
Get and store the version
@param doc Pre-parsed XML document pointer.
@@ -516,6 +546,17 @@
printf("Max instances: %d\n", rr->rr_maxrefs);
if (rr->rr_agent)
printf("Agent: %s\n", basename(rr->rr_agent));
+
+ printf("Flags: ");
+ if (rr->rr_flags) {
+ if (rr->rr_flags & RF_INIT)
+ printf("init_on_add ");
+ if (rr->rr_flags & RF_DESTROY)
+ printf("destroy_on_delete ");
+ } else {
+ printf("(none)");
+ }
+ printf("\n");
printf("Attributes:\n");
if (!rr->rr_attrs) {
@@ -531,18 +572,25 @@
continue;
}
- printf(" [");
- if (rr->rr_attrs[x].ra_flags & RA_PRIMARY)
- printf(" primary");
- if (rr->rr_attrs[x].ra_flags & RA_UNIQUE)
- printf(" unique");
- if (rr->rr_attrs[x].ra_flags & RA_REQUIRED)
- printf(" required");
- if (rr->rr_attrs[x].ra_flags & RA_INHERIT)
- printf(" inherit");
- else if (rr->rr_attrs[x].ra_value)
- printf(" default=\"%s\"", rr->rr_attrs[x].ra_value);
- printf(" ]\n");
+ if (rr->rr_attrs[x].ra_flags) {
+ printf(" [");
+ if (rr->rr_attrs[x].ra_flags & RA_PRIMARY)
+ printf(" primary");
+ if (rr->rr_attrs[x].ra_flags & RA_UNIQUE)
+ printf(" unique");
+ if (rr->rr_attrs[x].ra_flags & RA_REQUIRED)
+ printf(" required");
+ if (rr->rr_attrs[x].ra_flags & RA_INHERIT)
+ printf(" inherit");
+ if (rr->rr_attrs[x].ra_flags & RA_RECONFIG)
+ printf(" reconfig");
+ printf(" ]");
+ }
+
+ if (rr->rr_attrs[x].ra_value)
+ printf(" default=\"%s\"\n", rr->rr_attrs[x].ra_value);
+ else
+ printf("\n");
}
actions:
@@ -678,6 +726,18 @@
}
/*
+ See if this can be reconfigured on the fly without a
+ stop/start
+ */
+ snprintf(xpath, sizeof(xpath), "%s/parameter[%d]/@reconfig",
+ base, x);
+ if ((ret = xpath_get_one(doc,ctx,xpath))) {
+ if ((atoi(ret) != 0) || (ret[0] == 'y'))
+ flags |= RA_RECONFIG;
+ free(ret);
+ }
+
+ /*
See if this is supposed to be inherited
*/
snprintf(xpath, sizeof(xpath), "%s/parameter[%d]/@inherit",
@@ -942,6 +1002,7 @@
break;
memset(rr,0,sizeof(*rr));
+ rr->rr_flags = RF_INIT | RF_DESTROY;
rr->rr_type = type;
snprintf(base, sizeof(base), "/resource-agent[%d]", ruleid);
@@ -954,6 +1015,8 @@
"/resource-agent[%d]/special[@tag=\"rgmanager\"]",
ruleid);
_get_maxparents(doc, ctx, base, rr);
+ _get_rule_flag(doc, ctx, base, rr, "init_on_add", RF_INIT);
+ _get_rule_flag(doc, ctx, base, rr, "destroy_on_delete", RF_DESTROY);
rr->rr_agent = strdup(filename);
/*
--- cluster/rgmanager/src/daemons/restree.c 2007/06/26 21:55:46 1.23.2.8
+++ cluster/rgmanager/src/daemons/restree.c 2007/07/31 17:54:54 1.23.2.9
@@ -1186,9 +1186,15 @@
/* Start starts before children */
if (me && (op == RS_START)) {
- node->rn_flags &= ~RF_NEEDSTART;
- rv = res_exec(node, op, NULL, 0);
+ if (node->rn_flags & RF_RECONFIG &&
+ realop == RS_CONDSTART) {
+ rv = res_exec(node, RS_RECONFIG, NULL, 0);
+ op = realop; /* reset to CONDSTART */
+ } else {
+ rv = res_exec(node, op, NULL, 0);
+ }
+ node->rn_flags &= ~(RF_NEEDSTART | RF_RECONFIG);
if (rv != 0) {
node->rn_state = RES_FAILED;
return SFL_FAILURE;
@@ -1408,6 +1414,7 @@
resource_delta(resource_t **leftres, resource_t **rightres)
{
resource_t *lc, *rc;
+ int ret;
list_do(leftres, lc) {
rc = find_resource_by_ref(rightres, lc->r_rule->rr_type,
@@ -1420,10 +1427,25 @@
}
/* Ok, see if the resource is the same */
- if (rescmp(lc, rc) == 0) {
+ ret = rescmp(lc, rc);
+ if (ret == 0) {
rc->r_flags |= RF_COMMON;
continue;
}
+
+ if (ret == 2) {
+ /* return of 2 from rescmp means
+ the two resources differ only
+ by reconfigurable bits */
+ /* Do nothing on condstop phase;
+ do a "reconfig" instead of
+ "start" on conststart phase */
+ rc->r_flags |= RF_COMMON;
+ rc->r_flags |= RF_NEEDSTART;
+ rc->r_flags |= RF_RECONFIG;
+ continue;
+ }
+
rc->r_flags |= RF_COMMON;
/* Resource has changed. Flag it. */
@@ -1485,12 +1507,17 @@
or is new), then we don't really care about its
children.
*/
+
if (rn->rn_resource->r_flags & RF_NEEDSTART) {
rn->rn_flags |= RF_NEEDSTART;
- continue;
+ if ((rn->rn_resource->r_flags & RF_RECONFIG) == 0)
+ continue;
}
- if (rc == 0) {
+ if (rc == 0 || rc == 2) {
+ if (rc == 2)
+ rn->rn_flags |= RF_NEEDSTART | RF_RECONFIG;
+
/* Ok, same resource. Recurse. */
ln->rn_flags |= RF_COMMON;
rn->rn_flags |= RF_COMMON;
--- cluster/rgmanager/src/daemons/test.c 2007/06/27 14:03:20 1.6.2.4
+++ cluster/rgmanager/src/daemons/test.c 2007/07/31 17:54:54 1.6.2.5
@@ -32,6 +32,50 @@
#error "Can not be built with CCS support."
#endif
+/**
+ Tells us if a resource group can be migrated.
+ */
+int
+group_migratory(resource_t **resources, resource_node_t **tree, char *groupname)
+{
+ resource_node_t *rn;
+ resource_t *res;
+ int migrate = 0, x, ret = 0;
+
+ res = find_root_by_ref(resources, groupname);
+ if (!res) {
+ /* Nonexistent or non-TL RG cannot be migrated */
+ return 0;
+ }
+
+ for (x = 0; res->r_rule->rr_actions[x].ra_name; x++) {
+ if (!strcmp(res->r_rule->rr_actions[x].ra_name,
+ "migrate")) {
+ migrate = 1;
+ break;
+ }
+ }
+
+ if (!migrate)
+ goto out_unlock;
+
+ list_do(tree, rn) {
+ if (rn->rn_resource == res && rn->rn_child) {
+ /* TL service w/ children cannot be migrated */
+ goto out_unlock;
+ }
+ } while (!list_done(tree, rn));
+
+
+ /* Ok, we have a migrate option to the resource group,
+ the resource group has no children, and the resource
+ group exists. We're all good */
+ ret = 1;
+
+out_unlock:
+ return ret;
+}
+
#define shift() {++argv; --argc;}
#define USAGE_TEST \
@@ -217,7 +261,9 @@
resource_rule_t *rulelist = NULL, *currule, *rulelist2 = NULL;
resource_t *reslist = NULL, *curres, *reslist2 = NULL;
resource_node_t *tree = NULL, *tree2 = NULL;
- int ccsfd, ret = 0;
+ resource_node_t *tn;
+ int ccsfd, ret = 0, need_init, need_kill;
+ char rg[64];
if (argc < 2) {
printf("Operation requires two arguments\n");
@@ -276,6 +322,57 @@
print_resource_tree(&tree);
printf("=== New Resource Tree ===\n");
print_resource_tree(&tree2);
+ printf("=== Operations (down-phase) ===\n");
+ list_do(&tree, tn) {
+ res_build_name(rg, sizeof(rg), tn->rn_resource);
+ /* Set state to uninitialized if we're killing a RG */
+ need_init = 0;
+
+ /* Set state to uninitialized if we're killing a RG */
+ need_kill = 0;
+ if (tn->rn_resource->r_flags & RF_NEEDSTOP) {
+ need_kill = 1;
+ printf("[kill] ");
+ }
+
+ if (!tn->rn_child && ((tn->rn_resource->r_rule->rr_flags &
+ RF_DESTROY) == 0) && group_migratory(&reslist, &tree, rg) &&
+ need_kill == 1) {
+ /* Do something smart here: flip state? */
+ printf("[no-op] %s was removed from the config, but I am not stopping it.\n",
+ rg);
+ continue;
+ }
+
+ res_condstop(&tn, tn->rn_resource, NULL);
+ } while (!list_done(&tree, tn));
+ printf("=== Operations (up-phase) ===\n");
+ list_do(&tree2, tn) {
+ res_build_name(rg, sizeof(rg), tn->rn_resource);
+ /* New RG. We'll need to initialize it. */
+ need_init = 0;
+ if (!(tn->rn_resource->r_flags & RF_RECONFIG) &&
+ (tn->rn_resource->r_flags & RF_NEEDSTART))
+ need_init = 1;
+
+ if (need_init) {
+ printf("[init] ");
+ }
+
+ if (!tn->rn_child && ((tn->rn_resource->r_rule->rr_flags &
+ RF_INIT) == 0) && group_migratory(&reslist2, &tree2, rg) &&
+ need_init == 1) {
+ /* Do something smart here? */
+ printf("[noop] %s was added, but I am not initializing it\n", rg);
+ continue;
+ }
+
+ if (need_init) {
+ res_stop(&tn, tn->rn_resource, NULL);
+ } else {
+ res_condstart(&tn, tn->rn_resource, NULL);
+ }
+ } while (!list_done(&tree2, tn));
out:
destroy_resource_tree(&tree2);
@@ -331,6 +428,7 @@
goto out;
} else if (!strcmp(argv[1], "delta")) {
shift();
+ _no_op_mode(1);
ret = tree_delta_test(argc, argv);
goto out;
} else {
--- cluster/rgmanager/src/resources/ra-api-1-modified.dtd 2006/08/18 15:26:22 1.4
+++ cluster/rgmanager/src/resources/ra-api-1-modified.dtd 2007/07/31 17:54:55 1.4.2.1
@@ -24,6 +24,7 @@
name CDATA #REQUIRED
primary (1|0) "0"
required (1|0) "0"
+ reconfig (1|0) "0"
inherit CDATA ""
unique (1|0) "0"
reconfig (1|0) "0">
@@ -43,7 +44,7 @@
<!ELEMENT action EMPTY>
<!ATTLIST action
- name (start|stop|recover|status|reconfig|monitor|reload|meta-data|verify-all|migrate) #REQUIRED
+ name (start|stop|recover|status|reconfig|monitor|reload|meta-data|verify-all|migrate|reconfig) #REQUIRED
timeout CDATA #REQUIRED
interval CDATA #IMPLIED
start-delay CDATA #IMPLIED
@@ -56,7 +57,6 @@
<!ELEMENT attributes EMPTY>
<!ATTLIST attributes
- root (1|0) "0"
maxinstances CDATA "0">
<!ELEMENT child EMPTY>
--- cluster/rgmanager/src/resources/service.sh 2007/05/02 18:28:52 1.7.2.4
+++ cluster/rgmanager/src/resources/service.sh 2007/07/31 17:54:55 1.7.2.5
@@ -56,7 +56,7 @@
<content type="string"/>
</parameter>
- <parameter name="domain">
+ <parameter name="domain" reconfig="1">
<longdesc lang="en">
Fail over domains define lists of cluster members
to try in the event that a resource group fails.
@@ -67,7 +67,7 @@
<content type="string"/>
</parameter>
- <parameter name="autostart">
+ <parameter name="autostart" reconfig="1">
<longdesc lang="en">
If set to yes, this resource group will automatically be started
after the cluster forms a quorum. If set to no, this resource
@@ -80,7 +80,7 @@
<content type="boolean"/>
</parameter>
- <parameter name="hardrecovery">
+ <parameter name="hardrecovery" reconfig="1">
<longdesc lang="en">
If set to yes, the last owner will reboot if this resource
group fails to stop cleanly, thus allowing the resource
@@ -128,7 +128,7 @@
<content type="boolean"/>
</parameter>
- <parameter name="recovery">
+ <parameter name="recovery" reconfig="1">
<longdesc lang="en">
This currently has three possible options: "restart" tries
to restart failed parts of this resource group locally before
@@ -164,10 +164,11 @@
<action name="status" timeout="5" interval="1h"/>
<action name="monitor" timeout="5" interval="1h"/>
+ <action name="reconfig" timeout="5"/>
<action name="recover" timeout="5"/>
<action name="reload" timeout="5"/>
<action name="meta-data" timeout="5"/>
- <action name="verify-all" timeout="5"/>
+ <action name="validate-all" timeout="5"/>
</actions>
<special tag="rgmanager">
@@ -224,7 +225,10 @@
meta_data
exit 0
;;
- verify-all)
+ validate-all)
+ exit 0
+ ;;
+ reconfig)
exit 0
;;
*)
--- cluster/rgmanager/src/resources/vm.sh 2007/07/11 19:35:06 1.1.2.5
+++ cluster/rgmanager/src/resources/vm.sh 2007/07/31 17:54:55 1.1.2.6
@@ -51,7 +51,7 @@
<content type="string"/>
</parameter>
- <parameter name="domain">
+ <parameter name="domain" reconfig="1">
<longdesc lang="en">
Fail over domains define lists of cluster members
to try in the event that the host of the virtual machine
@@ -63,7 +63,7 @@
<content type="string"/>
</parameter>
- <parameter name="autostart">
+ <parameter name="autostart" reconfig="1">
<longdesc lang="en">
If set to yes, this resource group will automatically be started
after the cluster forms a quorum. If set to no, this virtual
@@ -193,12 +193,16 @@
<action name="migrate" timeout="10m"/>
<action name="meta-data" timeout="5"/>
- <action name="verify-all" timeout="5"/>
+ <action name="validate-all" timeout="5"/>
</actions>
<special tag="rgmanager">
- <attributes maxinstances="1"/>
+ <!-- Destroy_on_delete / init_on_add are currently only
+ supported for migratory resources (no children
+ and the 'migrate' action; see above. Do not try this
+ with normal services -->
+ <attributes maxinstances="1" destroy_on_delete="0" init_on_add="0"/>
</special>
</resource-agent>
EOT
@@ -417,12 +421,12 @@
meta_data
exit 0
;;
- verify-all)
+ validate-all)
verify_all
exit $?
;;
*)
- echo "usage: $0 {start|stop|restart|status|reload|reconfig|meta-data|verify-all}"
+ echo "usage: $0 {start|stop|restart|status|reload|reconfig|meta-data|validate-all}"
exit 1
;;
esac
next reply other threads:[~2007-07-31 17:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-31 17:54 lhh [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-07-31 17:56 [Cluster-devel] cluster/rgmanager ChangeLog include/res-ocf.h lhh
2007-07-31 18:00 lhh
2007-12-19 21:04 lhh
2007-12-19 21:07 lhh
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=20070731175456.10308.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.