]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/rgw: add test for versioned object sync 12474/head
authorCasey Bodley <cbodley@redhat.com>
Tue, 13 Dec 2016 18:41:27 +0000 (13:41 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 15 Dec 2016 17:43:44 +0000 (12:43 -0500)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/test/rgw/test_multi.py

index e1585abcc09fe5a5647206ef7f659d6e9f4121f1..4dc2a287d1f3cfd08a076e4d6e5c8d5e4bfe9b7c 100644 (file)
@@ -747,6 +747,63 @@ def test_object_delete():
 
             check_bucket_eq(source_zone, target_zone, bucket)
 
+def get_latest_object_version(key):
+    for k in key.bucket.list_versions(key.name):
+        if k.is_latest:
+            return k
+    return None
+
+def test_versioned_object_incremental_sync():
+    buckets, zone_bucket = create_bucket_per_zone()
+
+    # enable versioning
+    all_zones = []
+    for zone, bucket in zone_bucket.items():
+        bucket.configure_versioning(True)
+        all_zones.append(zone)
+
+    realm.meta_checkpoint()
+
+    # upload a dummy object to each bucket and wait for sync. this forces each
+    # bucket to finish a full sync and switch to incremental
+    for source_zone, bucket in zone_bucket.items():
+        new_key(source_zone, bucket, 'dummy').set_contents_from_string('')
+        for target_zone in all_zones:
+            if source_zone.zone_name == target_zone.zone_name:
+                continue
+            realm.zone_bucket_checkpoint(target_zone, source_zone, bucket.name)
+
+    for _, bucket in zone_bucket.items():
+        # create and delete multiple versions of an object from each zone
+        for zone in all_zones:
+            obj = 'obj-' + zone.zone_name
+            k = new_key(zone, bucket, obj)
+
+            k.set_contents_from_string('version1')
+            v = get_latest_object_version(k)
+            log(10, 'version1 id=', v.version_id)
+            # don't delete version1 - this tests that the initial version
+            # doesn't get squashed into later versions
+
+            # create and delete the following object versions to test that
+            # the operations don't race with each other during sync
+            k.set_contents_from_string('version2')
+            v = get_latest_object_version(k)
+            log(10, 'version2 id=', v.version_id)
+            k.bucket.delete_key(obj, version_id=v.version_id)
+
+            k.set_contents_from_string('version3')
+            v = get_latest_object_version(k)
+            log(10, 'version3 id=', v.version_id)
+            k.bucket.delete_key(obj, version_id=v.version_id)
+
+    for source_zone, bucket in zone_bucket.items():
+        for target_zone in all_zones:
+            if source_zone.zone_name == target_zone.zone_name:
+                continue
+            realm.zone_bucket_checkpoint(target_zone, source_zone, bucket.name)
+            check_bucket_eq(source_zone, target_zone, bucket)
+
 def test_multi_period_incremental_sync():
     if len(realm.clusters) < 3:
         from nose.plugins.skip import SkipTest