From: Casey Bodley Date: Tue, 13 Dec 2016 18:41:27 +0000 (-0500) Subject: test/rgw: add test for versioned object sync X-Git-Tag: v12.0.0~367^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=178d5bbeb8912f78de0e10bb727877beb6840029;p=ceph.git test/rgw: add test for versioned object sync Signed-off-by: Casey Bodley --- diff --git a/src/test/rgw/test_multi.py b/src/test/rgw/test_multi.py index e1585abcc09f..4dc2a287d1f3 100644 --- a/src/test/rgw/test_multi.py +++ b/src/test/rgw/test_multi.py @@ -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