@@ -393,6 +393,61 @@ describe('test versioning concurrency', () => {
393
393
expect ( num_of_latest_versions ) . toBe ( initial_num_of_objects ) ;
394
394
} , TEST_TIMEOUT ) ;
395
395
396
+ it ( 'concurrent delete object version & list object versions' , async ( ) => {
397
+ const bucket = 'bucket1' ;
398
+ const delete_res_arr = [ ] ;
399
+ const delete_err_arr = [ ] ;
400
+ const initial_num_of_versions = 3 ;
401
+ const initial_num_of_objects = 5 ;
402
+ const version_by_key_2_dimension = [ ] ;
403
+ const list_res_arr_by_key_2_dimension = [ ] ;
404
+ const list_err_arr_by_key_2_dimension = [ ] ;
405
+ const object_prefix_name = 'key_put_' ;
406
+
407
+ // upload the object versions
408
+ for ( let i = 0 ; i < initial_num_of_objects ; i ++ ) {
409
+ const key = object_prefix_name + i ;
410
+ const version_arr_by_key = await _upload_versions ( bucket , key , initial_num_of_versions ) ;
411
+ version_by_key_2_dimension [ i ] = version_arr_by_key ;
412
+ }
413
+
414
+ // delete object version during list object versions
415
+ const num_of_concurrency = 3 ;
416
+ for ( let i = 0 ; i < num_of_concurrency ; i ++ ) {
417
+ const key = object_prefix_name + i ;
418
+ const version_id = version_by_key_2_dimension [ i ] [ 0 ] . version_id ; // always delete the first version
419
+ nsfs . delete_object ( { bucket : bucket , key : key , version_id : version_id } , DUMMY_OBJECT_SDK )
420
+ . then ( res => delete_res_arr . push ( res ) )
421
+ . catch ( err => delete_err_arr . push ( err ) ) ;
422
+ nsfs . list_object_versions ( { bucket : bucket } , DUMMY_OBJECT_SDK )
423
+ . then ( res => {
424
+ list_res_arr_by_key_2_dimension [ i ] = res . objects ;
425
+ } )
426
+ . catch ( err => {
427
+ list_err_arr_by_key_2_dimension [ i ] = err ;
428
+ } ) ;
429
+ }
430
+ await P . delay ( 10000 ) ;
431
+
432
+ // check for no errors
433
+ expect ( delete_err_arr ) . toHaveLength ( 0 ) ;
434
+ expect ( list_err_arr_by_key_2_dimension ) . toHaveLength ( 0 ) ;
435
+
436
+ // check for the right number of versions in the end
437
+ expect ( delete_res_arr ) . toHaveLength ( num_of_concurrency ) ;
438
+ const versions = await nsfs . list_object_versions ( { bucket : bucket } , DUMMY_OBJECT_SDK ) ;
439
+ const expected_total_number_of_versions = initial_num_of_versions * initial_num_of_objects - num_of_concurrency ;
440
+ expect ( versions . objects ) . toHaveLength ( expected_total_number_of_versions ) ;
441
+
442
+ // no delete markers are expected
443
+ const num_of_delete_markers = ( versions . objects . filter ( version => version . delete_marker === true ) ) . length ;
444
+ expect ( num_of_delete_markers ) . toBe ( 0 ) ;
445
+
446
+ // latest version for every key is expected
447
+ const num_of_latest_versions = ( versions . objects . filter ( version => version . is_latest === true ) ) . length ;
448
+ expect ( num_of_latest_versions ) . toBe ( initial_num_of_objects ) ;
449
+ } , TEST_TIMEOUT ) ;
450
+
396
451
it ( 'concurrent puts & list versions - version id paging' , async ( ) => {
397
452
const bucket = 'bucket1' ;
398
453
const upload_res_arr = [ ] ;
0 commit comments