Relax even more the identification of DRBD8 devices
authorIustin Pop <iustin@google.com>
Mon, 26 Nov 2007 08:38:32 +0000 (08:38 +0000)
committerIustin Pop <iustin@google.com>
Mon, 26 Nov 2007 08:38:32 +0000 (08:38 +0000)
This patch adds a new success condition for identifying DRBD8 devices:
if the local device is correct, but the network peer is not, we shutdown
the network and attach to the correct one (this also handles going to
standalone mode).

This new check (and its actions) is based on the fact that we don't pass
incorrect data from the master to the node (otherwise we could start
syncing with an incorrect peer.

Reviewed-by: imsnah

lib/bdev.py

index 61b58fd..e76d6f5 100644 (file)
@@ -2099,6 +2099,24 @@ class DRBD8(BaseDRBD):
       # even though we were passed some children at init time
       if match_r and "local_dev" not in info:
         break
+      if match_l and not match_r and "local_addr" in info:
+        # strange case - the device network part points to somewhere
+        # else, even though its local storage is ours; as we own the
+        # drbd space, we try to disconnect from the remote peer and
+        # reconnect to our correct one
+        if not self._ShutdownNet(minor):
+          raise errors.BlockDeviceError("Device has correct local storage,"
+                                        " wrong remote peer and is unable to"
+                                        " disconnect in order to attach to"
+                                        " the correct peer")
+        # note: _AssembleNet also handles the case when we don't want
+        # local storage (i.e. one or more of the _[lr](host|port) is
+        # None)
+        if (self._AssembleNet(minor, (self._lhost, self._lport,
+                                      self._rhost, self._rport), "C") and
+            self._MatchesNet(self._GetDevInfo(minor))):
+          break
+
     else:
       minor = None