<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    I missed some bits where drbdsetup xxx secondary and drbdsetup xxx
    secondary are called. My attempt at decoding the call tree is at the
    end of the message, but in summary:<br>
    <br>
    * Check /proc/drbd on target, require network is Connected and local
    disk is UpToDate. [No check on source?]<br>
    * on target: drbdsetup &lt;dev&gt; secondary (just to be sure?). No
    wait or status check?<br>
    * on both nodes: drbdsetup &lt;dev&gt; disconnect. No wait or status
    check?<br>
    * on both nodes: drbdsetup &lt;dev&gt; connect. Poll /proc/drbd
    until connected or syncing<br>
    * wait until sync complete<br>
    ... rest not relevant as it doesn't get this far when it fails<br>
    <br>
    Regards,<br>
    <br>
    Brian.<br>
    <br>
    _ExecMigration(...) [cmdlib.py]<br>
    &nbsp; on target node:<br>
    &nbsp; _CheckDiskConsistency(...) [cmdlib.py]<br>
    &nbsp;&nbsp;&nbsp; _CheckDiskConsistencyInner(...) [cmdlib.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AFAICS it seems to call down through to GetSyncStatus
    [bdev.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which calls GetProcStatus which reads <b>/proc/drbd</b>.
    Then it returns<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is_degraded=True if (not is_connected or not
    is_disk_uptodate)<br>
    &nbsp; _EnsureSecondary(target_node) [cmdlib.py]<br>
    &nbsp;&nbsp;&nbsp; for target node only:<br>
    &nbsp;&nbsp;&nbsp; call_blockdev_close<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perspective_blockdev_close [server/noded.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlockdevClose [backend.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Close [bdev.py]<br>
    <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drbdsetup &lt;dev&gt; secondary</b><br>
    &nbsp; _GoStandalone() [cmdlib.py]<br>
    &nbsp;&nbsp;&nbsp; for both nodes:<br>
    &nbsp;&nbsp;&nbsp; call_drbd_disconnect_net<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perspective_drbd_disconnect_net [server/noded.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrbdDisconnectNet [backend.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DisconnectNet [bdev.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ShutdownNet [bdev.py]<br>
    <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drbdsetup &lt;dev&gt; disconnect</b><br>
    &nbsp; _GoReconnect(True) [cmdlib.py]<br>
    &nbsp;&nbsp;&nbsp; for both nodes:<br>
    &nbsp;&nbsp;&nbsp; call_drbd_attach_net<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perspective_drbd_attach_net [server/noded.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrbdAttachNet [backend.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AttachNet [bdev.py]<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetProcStatus [bdev.py] - repeat until is_connected or
    is_in_resync<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _GetProcData - reads <b>/proc/drbd</b><br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _MassageProcData - groups by device<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _DRBD8Status(..) - parses one device line<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Open [bdev.py]<br>
    <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>drbdsetup &lt;dev&gt; primary</b><br>
    &nbsp; _WaitUntilSync()<br>
    &nbsp;&nbsp;&nbsp; for all nodes: repeat until all_done, display progress message<br>
    &nbsp;&nbsp;&nbsp; call_drbd_wait_sync<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perspective_drbd_wait_sync<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrbdWaitSync<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetProcStatus<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _GetProcData - reads <b>/proc/drbd</b><br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _MassageProcData - groups by device<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _DRBD8Status(..) - parses one device line<br>
    ... do the migration [but when there's a problem it doesn't get this
    far]<br>
    &nbsp; _EnsureSecondary(source_node)<br>
    &nbsp; _WaitUntilSync()<br>
    &nbsp; _GoStandalone()<br>
    &nbsp; _GoReconnect(False)<br>
    &nbsp; _WaitUntilSync()<br>
    <br>
  </body>
</html>