WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] remus: support DRBD disk backends

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] remus: support DRBD disk backends
From: Shriram Rajagopalan <rshriram@xxxxxxxxx>
Date: Mon, 16 May 2011 20:54:00 -0700
Cc: ian.jackson@xxxxxxxxxxxxx
Delivery-date: Mon, 16 May 2011 20:55:59 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.4.3
# HG changeset patch
# User Shriram Rajagopalan <rshriram@xxxxxxxxx>
# Date 1305604364 25200
# Node ID 666dd2576bc41ccb9f4cb74c54bd16a6425e7b14
# Parent  5fe52d24d88f3beea273d48c18d9e5ac8858ccac
remus: support DRBD disk backends

DRBD disk backends can be used instead of tapdisk backends for Remus.
This requires a Remus style disk replication protocol (asynchronous
replication with output buffering at backup), that is not available in
standard DRBD code. A modified version that supports this new replication
protocol is available from git://aramis.nss.cs.ubc.ca/drbd-8.3-remus

Use of DRBD disk backends provides a means for efficient resynchronization
of data after the crashed machine comes back online. Since DRBD allows for
online resynchronization, a DRBD backed Remus VM does not have to be stopped
or shutdown while the disks are resynchronizing. Once resynchronization is 
complete,
Remus can be started at will.

Signed-off-by: Shriram Rajagopalan <rshriram@xxxxxxxxx>

diff -r 5fe52d24d88f -r 666dd2576bc4 tools/python/xen/remus/device.py
--- a/tools/python/xen/remus/device.py  Mon May 16 20:47:04 2011 -0700
+++ b/tools/python/xen/remus/device.py  Mon May 16 20:52:44 2011 -0700
@@ -2,7 +2,7 @@
 #
 # Coordinates with devices at suspend, resume, and commit hooks
 
-import os, re
+import os, re, fcntl
 
 import netlink, qdisc, util
 
@@ -30,22 +30,51 @@
     is paused between epochs.
     """
     FIFODIR = '/var/run/tap'
+    SEND_CHECKPOINT = 20
+    WAIT_CHECKPOINT_ACK = 30
 
     def __init__(self, disk):
         # look up disk, make sure it is tap:buffer, and set up socket
         # to request commits.
         self.ctlfd = None
+        self.msgfd = None
+        self.is_drbd = False
+        self.ackwait = False
 
-        if not disk.uname.startswith('tap:remus:') and not 
disk.uname.startswith('tap:tapdisk:remus:'):
+        if disk.uname.startswith('tap:remus:') or 
disk.uname.startswith('tap:tapdisk:remus:'):
+            fifo = re.match("tap:.*(remus.*)\|", 
disk.uname).group(1).replace(':', '_')
+            absfifo = os.path.join(self.FIFODIR, fifo)
+            absmsgfifo = absfifo + '.msg'
+
+            self.installed = False
+            self.ctlfd = open(absfifo, 'w+b')
+            self.msgfd = open(absmsgfifo, 'r+b')
+        elif disk.uname.startswith('drbd:'):
+            #get the drbd device associated with this resource
+            drbdres = re.match("drbd:(.*)", disk.uname).group(1)
+            drbddev = util.runcmd("drbdadm sh-dev %s" % drbdres).rstrip()
+
+            #check for remus supported drbd installation
+            rconf = util.runcmd("drbdsetup %s show" % drbddev)
+            if rconf.find('protocol D;') == -1:
+                raise ReplicatedDiskException('Remus support for DRBD disks 
requires the '
+                                              'resources to operate in 
protocol D. Please make '
+                                              'sure that you have installed 
the remus supported DRBD '
+                                              'version from 
git://aramis.nss.cs.ubc.ca/drbd-8.3-remus '
+                                              'and enabled protocol D in the 
resource config')
+
+            #check if resource is in connected state
+            cstate = util.runcmd("drbdadm cstate %s" % drbdres).rstrip()
+            if cstate != 'Connected':
+                raise ReplicatedDiskException('DRBD resource %s is not in 
connected state!'
+                                              % drbdres)
+
+            #open a handle to the resource so that we could issue chkpt ioctls
+            self.ctlfd = open(drbddev, 'r')
+            self.is_drbd = True
+        else:
             raise ReplicatedDiskException('Disk is not replicated: %s' %
                                         str(disk))
-        fifo = re.match("tap:.*(remus.*)\|", disk.uname).group(1).replace(':', 
'_')
-        absfifo = os.path.join(self.FIFODIR, fifo)
-        absmsgfifo = absfifo + '.msg'
-
-        self.installed = False
-        self.ctlfd = open(absfifo, 'w+b')
-        self.msgfd = open(absmsgfifo, 'r+b')
 
     def __del__(self):
         self.uninstall()
@@ -56,12 +85,24 @@
             self.ctlfd = None
 
     def postsuspend(self):
-        os.write(self.ctlfd.fileno(), 'flush')
+        if not self.is_drbd:
+            os.write(self.ctlfd.fileno(), 'flush')
+        elif not self.ackwait:
+            if (fcntl.ioctl(self.ctlfd.fileno(), self.SEND_CHECKPOINT, 0) > 0):
+                self.ackwait = False
+            else:
+                self.ackwait = True
+
+    def preresume(self):
+        if self.is_drbd and self.ackwait:
+            fcntl.ioctl(self.ctlfd.fileno(), self.WAIT_CHECKPOINT_ACK, 0)
+            self.ackwait = False
 
     def commit(self):
-        msg = os.read(self.msgfd.fileno(), 4)
-        if msg != 'done':
-            print 'Unknown message: %s' % msg
+        if not self.is_drbd:
+            msg = os.read(self.msgfd.fileno(), 4)
+            if msg != 'done':
+                print 'Unknown message: %s' % msg
 
 ### Network
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>