So, it seems that res-a is actually being promoted to Master _before_ res-b or 
res-c actually finish starting. The start operation is issued for both of them, 
but the promotion should not occur until they actually finish starting.

Also, this is accepted by the validation system:

      <rsc_colocation id="res-a-not-master-on-node1-if-res-b-stopped" 
score="-INFINITY">
        <resource_set id="res-a-not-master-on-node1-set-1" role="Master">
          <resource_ref id="res-a"/>
        </resource_set>
        <resource_set id="res-a-not-master-on-node1-set-2" role="Stopped">
          <resource_ref id="res-b"/>
        </resource_set>
      </rsc_colocation>

However, it does not actually work the way I would expect. It simply prevents 
res-a from starting on node1 at all. Coupled with the previous discovery, this 
seems to indicate that the role="Started" and role="Stopped" are both 
completely ignored. I cannot find anything in the documentation that says it is 
supported, but it parses properly.

It would be really nice to support this.

Eliot Gable
Senior Engineer
1228 Euclid Ave, Suite 390
Cleveland, OH 44115

Direct: 216-373-4808
Fax: 216-373-4657
ega...@broadvox.net<mailto:ega...@broadvox.net>

[cid:image001.gif@01C9C9C3.1154B6E0]
CONFIDENTIAL COMMUNICATION.  This e-mail and any files transmitted with it are 
confidential and are intended solely for the use of the individual or entity to 
whom it is addressed. If you are not the intended recipient, please call me 
immediately.  BROADVOX is a registered trademark of Broadvox, LLC.

From: Eliot Gable [mailto:ega...@broadvox.net]
Sent: Thursday, April 30, 2009 5:58 PM
To: pacema...@clusterlabs.org
Subject: [Pacemaker] Force a Master resource off a node if another resource 
fails

Let's say I have these requirements:


-          a master/slave resource called res-a

-          a normal resource called res-b that runs on node1 only

-          a normal resource called res-c that runs on node2 only

-          res-b and res-c both do the same thing, but they are configured as 
separate resources so I can refer to each individually

-          res-a must be started before res-b or res-c start

-          res-a can only be promoted to Master on node1 if res-b is running

-          res-a can only be promoted to Master on node2 if res-c is running

-          res-a prefers node1 to be Master

-          If res-a is Master on node1 and res-b fails, res-a should move to 
node2 if res-c is running

-          If res-a is Master on node2 and res-c fails, res-a should move to 
node1 if res-b is running

How would I set up the constraints?

This should make res-a prefer node1 over node2, but allow res-a to fail over to 
node2:

      <rsc_location id="res-a-location" rsc="res-a">
        <rule id="res-a-location-rule-1" score="500">
          <expression id="res-a-location-rule-1-exp" attribute="#uname" 
operation="eq" value="node1"/>
        </rule>
        <rule id="res-a-location-rule-2" score="0">
          <expression id="res-a-location-rule-2-exp" attribute="#uname" 
operation="eq" value="node2"/>
        </rule>
      </rsc_location>

This should make res-b run only on node1:

      <rsc_location id="res-b-location" rsc="res-b">
        <rule id="res-b-location-rule-1" score="INFINITY">
          <expression id="res-b-location-rule-1-exp" attribute="#uname" 
operation="eq" value="node1"/>
        </rule>
        <rule id="res-b-location-rule-2" score="-INFINITY">
          <expression id="res-b-location-rule-2-exp" attribute="#uname" 
operation="eq" value="node2"/>
        </rule>
      </rsc_location>

This should make res-c run only on node2:

      <rsc_location id="res-c-location" rsc="res-c">
        <rule id="res-c-location-rule-1" score="-INFINITY">
          <expression id="res-c-location-rule-1-exp" attribute="#uname" 
operation="eq" value="node1"/>
        </rule>
        <rule id="res-c-location-rule-2" score="INFINITY">
          <expression id="res-c-location-rule-2-exp" attribute="#uname" 
operation="eq" value="node2"/>
        </rule>
      </rsc_location>

This should make res-a start before res-b starts:

      <rsc_order id="order-res-a-first-then-b">
        <resource_set id="res-a-set-1" sequential="true">
          <resource_ref id="res-a"/>
        </resource_set>
        <resource_set id="res-b-set" sequential="false">
          <resource_ref id="res-b"/>
        </resource_set>
      </rsc_order>

This should make res-a start before res-c starts:

      <rsc_order id="order-res-a-first-then-c">
        <resource_set id="res-a-set-2" sequential="true">
          <resource_ref id="res-a"/>
        </resource_set>
        <resource_set id="res-c-set" sequential="false">
          <resource_ref id="res-c"/>
        </resource_set>
      </rsc_order>

This should make res-a only run as Master on node1 if res-b is started and make 
it prefer node1:

      <rsc_colocation id="res-a-prefers-node1" score="500">
        <resource_set id="res-a-prefers-node1-set-1" role="Master">
          <resource_ref id="res-a"/>
        </resource_set>
        <resource_set id="res-a-prefers-node1-set-2" role="Started">
          <resource_ref id="res-b"/>
        </resource_set>
      </rsc_colocation>

This should make res-a only run as Master on node1 if res-c is started and make 
it not prefer node2:

      <rsc_colocation id="res-a-not-prefer-node2" score="250">
        <resource_set id="res-a-not-prefer-node2-set-1" role="Master">
          <resource_ref id="res-a"/>
        </resource_set>
        <resource_set id="res-a-not-prefer-node2-set-2" role="Started">
          <resource_ref id="res-c"/>
        </resource_set>
      </rsc_colocation>

I do see res-a starting before b and c, and I do see it being promoted to 
master on node1. I also see res-b starting on node1 only and res-c on node2 
only.

However, based on these constraints, I would expect that if I forced res-b to 
fail when res-a is Master on node1, then res-a should switch to Master on 
node2. Once that is done, then I would expect res-b to restart on node1 and 
res-a to stay Master on node2 (because of stickiness).

Instead, if I cause res-b to fail, it simply restarts res-b. Is there something 
I am missing in this logic? Do I need another constraint to force it over to 
node2 if res-b fails? Do I need another constraint to force it to node1 if 
res-c fails on node2?

Thanks for any assistance you can provide.

Eliot Gable
Senior Engineer
1228 Euclid Ave, Suite 390
Cleveland, OH 44115

Direct: 216-373-4808
Fax: 216-373-4657
ega...@broadvox.net<mailto:ega...@broadvox.net>

[cid:image001.gif@01C9C9C3.1154B6E0]
CONFIDENTIAL COMMUNICATION.  This e-mail and any files transmitted with it are 
confidential and are intended solely for the use of the individual or entity to 
whom it is addressed. If you are not the intended recipient, please call me 
immediately.  BROADVOX is a registered trademark of Broadvox, LLC.


________________________________
CONFIDENTIAL. This e-mail and any attached files are confidential and should be 
destroyed and/or returned if you are not the intended and proper recipient.

________________________________
CONFIDENTIAL. This e-mail and any attached files are confidential and should be 
destroyed and/or returned if you are not the intended and proper recipient.

<<inline: image001.gif>>

_______________________________________________
Pacemaker mailing list
Pacemaker@oss.clusterlabs.org
http://oss.clusterlabs.org/mailman/listinfo/pacemaker

Reply via email to