<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hello,<br>
    <br>
    Is this the right place to report this issue? (please redirect me if
    not)<br>
    <br>
    As we were experiencing/demonstrating our new cluster yesterday, we
    stumbled on a caveat in our LibvirtQemu resource agent (derived from
    VirtualDomain). Since the caveat is the same in the VirtualDomain
    resource agent; I thought I better report it. Please see the patch
    below (for LibvirtQemu), which comments should allow you to
    understand where the problem lies.<br>
    <br>
    --- LibvirtQemu.orig&nbsp;&nbsp;&nbsp; 2014-08-22 09:39:21.997201000 +0200<br>
    +++ LibvirtQemu&nbsp;&nbsp;&nbsp; 2014-08-22 09:50:32.440969000 +0200<br>
    @@ -154,11 +154,10 @@<br>
    &nbsp;&nbsp; local virsh_output<br>
    &nbsp;&nbsp; local domain_name<br>
    &nbsp;<br>
    -&nbsp; # Note: passing in the domain name from outside the script is<br>
    -&nbsp; # intended for testing and debugging purposes only. Don't do this<br>
    -&nbsp; # in production, instead let the script figure out the domain
    name<br>
    -&nbsp; # from the config file. You have been warned.<br>
    -&nbsp; if [ -z "${DOMAIN_NAME}" ]; then<br>
    +&nbsp; # NOTE: Re-defining an already defined domain is dangerous! It
    shall be done only<br>
    +&nbsp; # if we can reasonably assume the configuration file hasn't
    changed since the last<br>
    +&nbsp; # time the domain has been defined.<br>
    +&nbsp; if [ -z "${DOMAIN_NAME}" ] || [ "${OCF_RESKEY_config}" -ot
    "${STATEFILE}" ]; then<br>
    &nbsp;&nbsp;&nbsp;&nbsp; # Spin until we have a domain name<br>
    &nbsp;&nbsp;&nbsp;&nbsp; while true; do<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virsh_output="$(virsh ${VIRSH_OPTIONS} define
    ${OCF_RESKEY_config})"<br>
    @@ -170,7 +169,7 @@<br>
    &nbsp;&nbsp;&nbsp;&nbsp; echo "${domain_name}" &gt; "${STATEFILE}"<br>
    &nbsp;&nbsp;&nbsp;&nbsp; ocf_log info "Domain name '${domain_name}' saved to state file
    '${STATEFILE}'."<br>
    &nbsp;&nbsp; else<br>
    -&nbsp;&nbsp;&nbsp; ocf_log warn "Domain name '${DOMAIN_NAME}' already defined;
    overriding configuration file '${OCF_RESKEY_config}' (this should
    NOT ne done in production!)."<br>
    +&nbsp;&nbsp;&nbsp; ocf_log warn "Domain name '${DOMAIN_NAME}' already defined;
    overriding by newer configuration file will NOT be done!"<br>
    &nbsp;&nbsp; fi<br>
    &nbsp;}<br>
    &nbsp;<br>
    @@ -205,12 +204,12 @@<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''|'no state')<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Empty string may be returned when virsh does not<br>
    -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # receive a reply from libvirtd.<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # receive a reply from libvirtd or after the domain has<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # been undefined.<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # "no state" may occur when the domain is currently<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # being migrated (on the migration target only), or<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # whenever virsh can't reliably obtain the domain<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # state.<br>
    -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status='no state'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ "${__OCF_ACTION}" == 'stop' ] &amp;&amp; [ ${try} -ge
    3 ]; then<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # During the stop operation, we want to bail out<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # quickly, so as to be able to force-stop (destroy)<br>
    @@ -224,6 +223,17 @@<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocf_log info "Domain '${DOMAIN_NAME}' currently has no
    state; retrying."<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 1<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ "${status}" == '' ] &amp;&amp; [ $(( ${try} % 10 ))
    -eq 0 ]; then<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Could it be that libvirtd is running healthily but the
    domain<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # has been undefined? In that case, let's attempt to
    re-define it.<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If libvirtd IS running, it can not hurt (given the
    safeguards in<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # LibvirtQemu_Define). If libvirtd is NOT running, then
    something is<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # definitely wrong (and the monitor operation will
    time-out in<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # LibvirtQemu_Define the same way as it would here).<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocf_log warn "Has domain '${DOMAIN_NAME}' been undefined?
    attempting to re-define it."<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LibvirtQemu_Define<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br>
    +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status='no state'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # any other output is unexpected.<br>
    @@ -487,6 +497,11 @@<br>
    &nbsp;<br>
    &nbsp;# Define the domain on startup, and re-define whenever someone
    deleted<br>
    &nbsp;# the state file, or touched the config.<br>
    +# WARNING: There is a caveat here! When the resource is stopped,
    the state file<br>
    +# is deleted ONLY on the node where it was running. In case the
    domain is then<br>
    +# undefined (from libvirtd), on all nodes, we will end-up with a
    state file but no<br>
    +# domain definition on those nodes that were not running the
    resource. The monitor<br>
    +# operation MUST handle that situation, should the resource be
    restarted.<br>
    &nbsp;if [ ! -e "${STATEFILE}" ] || [ "${OCF_RESKEY_config}" -nt
    "${STATEFILE}" ]; then<br>
    &nbsp;&nbsp; LibvirtQemu_Define<br>
    &nbsp;fi<br>
    <br>
    One could ask "why undefine a libvirt domain and then restart it?".
    The answer is two-fold: 1. experience showed us that we shall
    undefine a decommissioned domain from libvirt to prevent potential
    UUID conflict when defining a new domain (which is likely in our
    setup, since UUID are build from the domain IP address); 2. the
    "demo-effect" (or potential legitimate reasons), where one would
    "decommission" a domain and restart it right afterwards ( :-/ ).<br>
    <br>
    PS: we now also make sure to delete the VirtualDomain/LibvirtQemu
    state file when undefining the domain. But best have multiple safe
    guards as far as this caveat is concerned (thus the patch above).<br>
    <br>
    Hope it helps,<br>
    <br>
    C&eacute;dric<br>
    <br>
    <div class="moz-signature">-- <br>
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <style type="text/css">
DIV.signature {FONT:normal 11px sans-serif;COLOR:#000000;}
DIV.signature P {MARGIN:5px 0px;FONT:bold 13px sans-serif;COLOR:#000050;}
</style>
      <div class="signature">
        <p>C&eacute;dric Dufour @ Idiap Research Institute</p>
      </div>
    </div>
  </body>
</html>