Alan Robertson wrote:
> Lars Marowsky-Bree wrote:
>> On 2007-04-04T11:41:44, Doug Knight <[EMAIL PROTECTED]> wrote:
>>
>>> The key word in my question was "thinks". It would be useful to the RA
>>> if it could know what state the CRM thought it was in, so in case the RA
>>> determines on its own that its already in that state, it doesn't have to
>>> do anything. But, if the RA finds that the CRM thinks its in a different
>>> state, then the RA could set the CRM straight by calling the crm_master
>>> with the appropriate value. Make sense?
>> No. The state the resource is in is not set via crm_master, but using
>> the exit code of the monitor operation.
>>
>> You should only call crm_master when you wish to change the _preference_
>> for master-state.
>
> But, I think you can use crm_master to retrieve your current preference,
> and thereby eliminate unnecessary CIB updates.
>
> Or maybe crm_master should do that filtering on its own??
Attached is a straightforward patch to crm_attribute.c which I believe
does this...
It also eliminates certain other "do-nothing" attribute changes -
because this code is shared by a few different commands.
I recognize that this is slightly less efficient for those cases where
the attribute is actually going to be changed, but it is _vastly_ more
efficient for those cases where the current value is correct - because
it eliminates triggering a computation cycle of the policy engine.
--
Alan Robertson <[EMAIL PROTECTED]>
"Openness is the foundation and preservative of friendship... Let me
claim from you at all times your undisguised opinions." - William
Wilberforce
diff -r b19bcdc3efa8 crm/admin/crm_attribute.c
--- a/crm/admin/crm_attribute.c Thu Apr 05 08:29:57 2007 -0600
+++ b/crm/admin/crm_attribute.c Thu Apr 05 08:41:07 2007 -0600
@@ -245,9 +245,9 @@ main(int argc, char **argv)
rsc_id = getenv("OCF_RESOURCE_INSTANCE");
if(rsc_id == NULL && dest_node == NULL) {
- fprintf(stderr, "This program should only ever be "
+ fprintf(stderr, "This program should normally be "
"invoked from inside an OCF resource agent.\n");
- fprintf(stderr, "DO NOT INVOKE MANUALLY FROM THE
COMMAND LINE.\n");
+ fprintf(stderr, "It is normally an error to invoke it
from the command line\n");
return 1;
} else if(dest_node == NULL) {
@@ -350,20 +350,6 @@ main(int argc, char **argv)
XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL,
"last-lrm-refresh", now_s);
crm_free(now_s);
}
-
- } else if(DO_WRITE) {
- int cib_opts = cib_sync_call;
- CRM_DEV_ASSERT(type != NULL);
- CRM_DEV_ASSERT(attr_name != NULL);
- CRM_DEV_ASSERT(attr_value != NULL);
-
- if(inhibit_pe) {
- crm_warn("Inhibiting notifications for this update");
- cib_opts |= cib_inhibit_notify;
- }
- rc = update_attr(the_cib, cib_opts, type, dest_node, set_name,
- attr_id, attr_name, attr_value);
-
} else {
char *read_value = NULL;
rc = read_attr(the_cib, type, dest_node, set_name,
@@ -385,9 +371,28 @@ main(int argc, char **argv)
attr_name?"name=":"", attr_name?attr_name:"",
read_value?read_value:"(null)");
- } else if(read_value != NULL) {
+ } else if(read_value != NULL && ! DO_WRITE) {
fprintf(stdout, "%s\n", read_value);
}
+ if (DO_WRITE) {
+ if (read_value != NULL && strcmp(read_value,
attr_value) == 0 ){
+ crm_info("%s: Attribute %s=%s is unchanged",
+ __FUNCTION__, attr_name, attr_value);
+ }else{
+ int cib_opts = cib_sync_call;
+ CRM_DEV_ASSERT(type != NULL);
+ CRM_DEV_ASSERT(attr_name != NULL);
+ CRM_DEV_ASSERT(attr_value != NULL);
+
+ if(inhibit_pe) {
+ crm_warn("Inhibiting notifications for
this update");
+ cib_opts |= cib_inhibit_notify;
+ }
+ rc = update_attr(the_cib, cib_opts, type,
dest_node, set_name,
+ attr_id, attr_name, attr_value);
+ }
+ }
+
}
the_cib->cmds->signoff(the_cib);
if(rc != cib_ok) {
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/