@@ -369,7 +369,12 @@ class NCLifecycle {
369
369
candidates . delete_candidates = await this . get_candidates_by_expiration_rule ( lifecycle_rule , bucket_json ,
370
370
object_sdk ) ;
371
371
if ( lifecycle_rule . expiration . days || lifecycle_rule . expiration . expired_object_delete_marker ) {
372
- const dm_candidates = await this . get_candidates_by_expiration_delete_marker_rule ( lifecycle_rule , bucket_json ) ;
372
+ const dm_candidates = await this . get_candidates_by_expiration_delete_marker_rule (
373
+ lifecycle_rule ,
374
+ bucket_json ,
375
+ object_sdk ,
376
+ { versions_list}
377
+ ) ;
373
378
candidates . delete_candidates = candidates . delete_candidates . concat ( dm_candidates ) ;
374
379
}
375
380
}
@@ -439,21 +444,21 @@ class NCLifecycle {
439
444
* @param {Object } object_sdk
440
445
* @param {Object } lifecycle_rule
441
446
* @param {Object } bucket_json
442
- * @param {Object } rule_state
447
+ * @param {Object } expire_state
443
448
* @returns
444
449
*/
445
- async load_objects_list ( object_sdk , lifecycle_rule , bucket_json , rule_state ) {
450
+ async load_objects_list ( object_sdk , lifecycle_rule , bucket_json , expire_state ) {
446
451
const objects_list = await object_sdk . list_objects ( {
447
452
bucket : bucket_json . name ,
448
453
prefix : lifecycle_rule . filter ?. prefix ,
449
- key_marker : rule_state . key_marker ,
454
+ key_marker : expire_state . key_marker ,
450
455
limit : config . NC_LIFECYCLE_LIST_BATCH_SIZE
451
456
} ) ;
452
457
if ( objects_list . is_truncated ) {
453
- rule_state . key_marker = objects_list . next_marker ;
454
- rule_state . is_finished = false ;
458
+ expire_state . key_marker = objects_list . next_marker ;
459
+ expire_state . is_finished = false ;
455
460
} else {
456
- rule_state . is_finished = true ;
461
+ expire_state . is_finished = true ;
457
462
}
458
463
const bucket_state = this . lifecycle_run_status . buckets_statuses [ bucket_json . name ] . state ;
459
464
bucket_state . num_processed_objects += objects_list . objects . length ;
@@ -503,15 +508,51 @@ class NCLifecycle {
503
508
return parsed_candidates ;
504
509
}
505
510
511
+ /**
512
+ * check if delete candidate based on expired delete marker rule
513
+ * @param {Object } object
514
+ * @param {Object } next_object
515
+ * @param {Function } filter_func
516
+ * @returns
517
+ */
518
+ filter_expired_delete_marker ( object , next_object , filter_func ) {
519
+ const lifecycle_info = this . _get_lifecycle_object_info_from_list_object_entry ( object ) ;
520
+ if ( ! filter_func ( lifecycle_info ) ) return false ;
521
+ return object . is_latest && object . delete_marker && object . key !== next_object . key ;
522
+ }
523
+
506
524
/**
507
525
* get_candidates_by_expiration_delete_marker_rule processes the expiration delete marker rule
508
526
* @param {* } lifecycle_rule
509
527
* @param {Object } bucket_json
510
528
* @returns {Promise<Object[]> }
511
529
*/
512
- async get_candidates_by_expiration_delete_marker_rule ( lifecycle_rule , bucket_json ) {
513
- // TODO - implement
514
- return [ ] ;
530
+ async get_candidates_by_expiration_delete_marker_rule ( lifecycle_rule , bucket_json , object_sdk , { versions_list} ) {
531
+ const rule_state = this . lifecycle_run_status . buckets_statuses [ bucket_json . name ] . rules_statuses [ lifecycle_rule . id ] . state . noncurrent ;
532
+ if ( rule_state . is_finished ) return [ ] ;
533
+ if ( ! versions_list ) {
534
+ versions_list = await this . load_versions_list ( object_sdk , lifecycle_rule , bucket_json , rule_state ) ;
535
+ }
536
+ const candidates = [ ] ;
537
+ const expiration = lifecycle_rule . expiration ?. days ? this . _get_expiration_time ( lifecycle_rule . expiration ) : 0 ;
538
+ const filter_func = this . _build_lifecycle_filter ( { filter : lifecycle_rule . filter , expiration} ) ;
539
+ for ( let i = 0 ; i < versions_list . objects . length - 1 ; i ++ ) {
540
+ if ( this . filter_expired_delete_marker ( versions_list . objects [ i ] , versions_list . objects [ i + 1 ] , filter_func ) ) {
541
+ candidates . push ( versions_list . objects [ i ] ) ;
542
+ }
543
+ }
544
+ const last_item = versions_list . objects . length > 0 && versions_list . objects [ versions_list . objects . length - 1 ] ;
545
+ const lifecycle_info = this . _get_lifecycle_object_info_from_list_object_entry ( last_item ) ;
546
+ if ( last_item . is_latest && last_item . delete_marker && filter_func ( lifecycle_info ) ) {
547
+ if ( rule_state . is_finished ) {
548
+ candidates . push ( last_item ) ;
549
+ } else {
550
+ //need the next item to decide if we need to delete. start the next cycle from this key latest
551
+ rule_state . key_marker_versioned = last_item . key ;
552
+ rule_state . version_id_marker = undefined ;
553
+ }
554
+ }
555
+ return candidates ;
515
556
}
516
557
517
558
/////////////////////////////////////////////
@@ -522,23 +563,23 @@ class NCLifecycle {
522
563
* @param {Object } object_sdk
523
564
* @param {Object } lifecycle_rule
524
565
* @param {Object } bucket_json
525
- * @param {Object } rule_state
566
+ * @param {Object } noncurrent_state
526
567
* @returns
527
568
*/
528
- async load_versions_list ( object_sdk , lifecycle_rule , bucket_json , rule_state ) {
569
+ async load_versions_list ( object_sdk , lifecycle_rule , bucket_json , noncurrent_state ) {
529
570
const list_versions = await object_sdk . list_object_versions ( {
530
571
bucket : bucket_json . name ,
531
572
prefix : lifecycle_rule . filter ?. prefix ,
532
573
limit : config . NC_LIFECYCLE_LIST_BATCH_SIZE ,
533
- key_marker : rule_state . key_marker_versioned ,
534
- version_id_marker : rule_state . version_id_marker
574
+ key_marker : noncurrent_state . key_marker_versioned ,
575
+ version_id_marker : noncurrent_state . version_id_marker
535
576
} ) ;
536
577
if ( list_versions . is_truncated ) {
537
- rule_state . is_finished = false ;
538
- rule_state . key_marker_versioned = list_versions . next_marker ;
539
- rule_state . version_id_marker = list_versions . next_version_id_marker ;
578
+ noncurrent_state . is_finished = false ;
579
+ noncurrent_state . key_marker_versioned = list_versions . next_marker ;
580
+ noncurrent_state . version_id_marker = list_versions . next_version_id_marker ;
540
581
} else {
541
- rule_state . is_finished = true ;
582
+ noncurrent_state . is_finished = true ;
542
583
}
543
584
const bucket_state = this . lifecycle_run_status . buckets_statuses [ bucket_json . name ] . state ;
544
585
bucket_state . num_processed_objects += list_versions . objects . length ;
0 commit comments