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