@@ -1038,6 +1038,8 @@ def test_delete_marker_full_sync():
10381038 # create a delete marker
10391039 key2 = new_key (zone , bucket , 'obj' )
10401040 key2 .delete ()
1041+ key2 .delete ()
1042+ key2 .delete ()
10411043
10421044 # wait for full sync
10431045 for _ , bucket in zone_bucket :
@@ -1062,11 +1064,40 @@ def test_suspended_delete_marker_full_sync():
10621064 # create a delete marker
10631065 key2 = new_key (zone , bucket , 'obj' )
10641066 key2 .delete ()
1067+ key2 .delete ()
1068+ key2 .delete ()
10651069
10661070 # wait for full sync
10671071 for _ , bucket in zone_bucket :
10681072 zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
10691073
1074+ def test_concurrent_delete_markers_incremental_sync ():
1075+ zonegroup = realm .master_zonegroup ()
1076+ zonegroup_conns = ZonegroupConns (zonegroup )
1077+ zone = zonegroup_conns .rw_zones [0 ]
1078+
1079+ # create a versioned bucket
1080+ bucket = zone .create_bucket (gen_bucket_name ())
1081+ log .debug ('created bucket=%s' , bucket .name )
1082+ bucket .configure_versioning (True )
1083+
1084+ zonegroup_meta_checkpoint (zonegroup )
1085+
1086+ obj = 'obj'
1087+
1088+ # upload a dummy object and wait for sync. this forces each zone to finish
1089+ # a full sync and switch to incremental
1090+ new_key (zone , bucket , obj ).set_contents_from_string ('' )
1091+ zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
1092+
1093+ # create several concurrent delete markers on each zone and let them race to sync
1094+ for i in range (2 ):
1095+ for zone_conn in zonegroup_conns .rw_zones :
1096+ key = new_key (zone_conn , bucket , obj )
1097+ key .delete ()
1098+
1099+ zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
1100+
10701101def test_bucket_versioning ():
10711102 buckets , zone_bucket = create_bucket_per_zone_in_realm ()
10721103 for _ , bucket in zone_bucket :
0 commit comments