File rsync_object_replication.patch of Package openstack-swift

diff -urN swift-git-2012.1.1332408124.master.4a6fead//swift/common/db_replicator.py swift-nou//swift/common/db_replicator.py
--- swift-git-2012.1.1332408124.master.4a6fead//swift/common/db_replicator.py	2012-04-05 17:42:00.000000000 +0200
+++ swift-nou//swift/common/db_replicator.py	2012-06-26 14:27:31.000000000 +0200
@@ -30,7 +30,7 @@
     HTTPInsufficientStorage, HTTPBadRequest
 
 from swift.common.utils import get_logger, whataremyips, storage_directory, \
-    renamer, mkdirs, lock_parent_directory, unlink_older_than
+    renamer, mkdirs, lock_parent_directory, unlink_older_than, rsync_ip
 from swift.common import ring
 from swift.common.bufferedhttp import BufferedHTTPConnection
 from swift.common.exceptions import DriveNotMounted, ConnectionTimeout
@@ -181,12 +181,13 @@
         :param replicate_method: remote operation to perform after rsync
         :param replicate_timeout: timeout to wait in seconds
         """
+        device_ip = rsync_ip(device['ip'])
         if self.vm_test_mode:
-            remote_file = '[%s]::%s%s/%s/tmp/%s' % (device['ip'],
+            remote_file = '%s::%s%s/%s/tmp/%s' % (device_ip,
                     self.server_type, device['port'], device['device'],
                     local_id)
         else:
-            remote_file = '[%s]::%s/%s/tmp/%s' % (device['ip'],
+            remote_file = '%s::%s/%s/tmp/%s' % (device_ip,
                     self.server_type, device['device'], local_id)
         mtime = os.path.getmtime(broker.db_file)
         if not self._rsync_file(broker.db_file, remote_file):
diff -urN swift-git-2012.1.1332408124.master.4a6fead//swift/common/utils.py swift-nou//swift/common/utils.py
--- swift-git-2012.1.1332408124.master.4a6fead//swift/common/utils.py	2012-04-05 17:42:00.000000000 +0200
+++ swift-nou//swift/common/utils.py	2012-06-26 14:26:44.000000000 +0200
@@ -1138,3 +1138,22 @@
     for (a, b) in zip(s1, s2):
         result |= ord(a) ^ ord(b)
     return result == 0
+
+
+def rsync_ip(ip):
+    """
+    Transform ip string to an rsync-compatible form
+
+    Will return ipv4 addresses unchanged, but will nest ipv6 addresses
+    inside square brackets.
+
+    :param ip: an ip string (ipv4 or ipv6)
+
+    :returns: a string ip address
+    """
+    try:
+        socket.inet_pton(socket.AF_INET6, ip)
+    except socket.error:  # it's IPv4
+        return ip
+    else:
+        return '[%s]' % ip
diff -urN swift-git-2012.1.1332408124.master.4a6fead//swift/obj/replicator.py swift-nou//swift/obj/replicator.py
--- swift-git-2012.1.1332408124.master.4a6fead//swift/obj/replicator.py	2012-04-05 17:42:00.000000000 +0200
+++ swift-nou//swift/obj/replicator.py	2012-06-26 14:26:10.000000000 +0200
@@ -33,7 +33,7 @@
 from swift.common.ring import Ring
 from swift.common.utils import whataremyips, unlink_older_than, lock_path, \
         compute_eta, get_logger, write_pickle, renamer, dump_recon_cache, \
-        TRUE_VALUES
+        TRUE_VALUES, rsync_ip
 from swift.common.bufferedhttp import http_connect
 from swift.common.daemon import Daemon
 
@@ -317,10 +317,11 @@
             '--timeout=%s' % self.rsync_io_timeout,
             '--contimeout=%s' % self.rsync_io_timeout,
         ]
+        node_ip = rsync_ip(node['ip'])
         if self.vm_test_mode:
-            rsync_module = '[%s]::object%s' % (node['ip'], node['port'])
+            rsync_module = '%s::object%s' % (node_ip, node['port'])
         else:
-            rsync_module = '[%s]::object' % node['ip']
+            rsync_module = '%s::object' % node_ip
         had_any = False
         for suffix in suffixes:
             spath = join(job['path'], suffix)
diff -urN swift-git-2012.1.1332408124.master.4a6fead//test/unit/common/test_utils.py swift-nou//test/unit/common/test_utils.py
--- swift-git-2012.1.1332408124.master.4a6fead//test/unit/common/test_utils.py	2012-04-05 17:42:00.000000000 +0200
+++ swift-nou//test/unit/common/test_utils.py	2012-06-26 14:23:36.000000000 +0200
@@ -855,6 +855,18 @@
         self.assertFalse(utils.streq_const_time('a', 'aaaaa'))
         self.assertFalse(utils.streq_const_time('ABC123', 'abc123'))
 
+    def test_rsync_ip_ipv4_localhost(self):
+        self.assertEqual(utils.rsync_ip('127.0.0.1'), '127.0.0.1')
 
+    def test_rsync_ip_ipv6_random_ip(self):
+        self.assertEqual(
+            utils.rsync_ip('fe80:0000:0000:0000:0202:b3ff:fe1e:8329'),
+            '[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]')
+
+    def test_rsync_ip_ipv6_ipv4_compatible(self):
+        self.assertEqual(
+            utils.rsync_ip('::ffff:192.0.2.128'), '[::ffff:192.0.2.128]')
+
+        
 if __name__ == '__main__':
     unittest.main()
diff -urN swift-git-2012.1.1332408124.master.4a6fead//test/unit/obj/test_replicator.py swift-nou//test/unit/obj/test_replicator.py
--- swift-git-2012.1.1332408124.master.4a6fead//test/unit/obj/test_replicator.py	2012-04-05 17:42:00.000000000 +0200
+++ swift-nou//test/unit/obj/test_replicator.py	2012-06-26 14:25:17.000000000 +0200
@@ -118,8 +118,10 @@
         {'id': 2, 'device': 'sda', 'zone': 2, 'ip': '127.0.0.2', 'port': 6000},
         {'id': 3, 'device': 'sda', 'zone': 4, 'ip': '127.0.0.3', 'port': 6000},
         {'id': 4, 'device': 'sda', 'zone': 5, 'ip': '127.0.0.4', 'port': 6000},
-        {'id': 5, 'device': 'sda', 'zone': 6, 'ip': '127.0.0.5', 'port': 6000},
-        {'id': 6, 'device': 'sda', 'zone': 7, 'ip': '127.0.0.6', 'port': 6000},
+        {'id': 5, 'device': 'sda', 'zone': 6,
+         'ip': 'fe80::202:b3ff:fe1e:8329', 'port': 6000},
+        {'id': 6, 'device': 'sda', 'zone': 7,
+         'ip': '2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'port': 6000},
         ]
     intended_part_shift = 30
     intended_reload_time = 15
@@ -180,7 +182,7 @@
                  self.ring.get_part_nodes(int(cur_part)) \
                      if node['ip'] not in _ips()]
         for node in nodes:
-            rsync_mod = '[%s]::object/sda/objects/%s' % (node['ip'], cur_part)
+            rsync_mod = '%s::object/sda/objects/%s' % (node['ip'], cur_part)
             process_arg_checker.append(
                 (0, '', ['rsync', whole_path_from, rsync_mod]))
         with _mock_process(process_arg_checker):
@@ -387,7 +389,7 @@
                      self.ring.get_part_nodes(int(cur_part)) \
                          if node['ip'] not in _ips()]
             for node in nodes:
-                rsync_mod = '[%s]::object/sda/objects/%s' % (node['ip'],
+                rsync_mod = '%s::object/sda/objects/%s' % (node['ip'],
                                                              cur_part)
                 process_arg_checker.append(
                     (0, '', ['rsync', whole_path_from, rsync_mod]))
@@ -451,7 +453,7 @@
                      self.ring.get_part_nodes(int(cur_part)) \
                          if node['ip'] not in _ips()]
             for node in nodes:
-                rsync_mod = '[%s]::object/sda/objects/%s' % (node['ip'],
+                rsync_mod = '%s::object/sda/objects/%s' % (node['ip'],
                                                              cur_part)
                 process_arg_checker.append(
                     (0, '', ['rsync', whole_path_from, rsync_mod]))
openSUSE Build Service is sponsored by