@@ -376,62 +376,191 @@ func TestMakeBackupCodec(t *testing.T) {
376376 }
377377}
378378
379- func TestElideSkippedLayers (t * testing.T ) {
379+ func TestValidateEndTimeAndTruncate (t * testing.T ) {
380380 defer leaktest .AfterTest (t )()
381+ defer log .Scope (t ).Close (t )
382+
383+ m := func (start , end int , compacted bool , revision bool ) backuppb.BackupManifest {
384+ b := backuppb.BackupManifest {
385+ StartTime : hlc.Timestamp {WallTime : int64 (start )},
386+ EndTime : hlc.Timestamp {WallTime : int64 (end )},
387+ IsCompacted : compacted ,
388+ }
389+ if revision {
390+ b .MVCCFilter = backuppb .MVCCFilter_All
391+ b .RevisionStartTime = hlc.Timestamp {WallTime : int64 (start )}
392+ }
393+ return b
394+ }
395+ mNorm := func (start , end int ) backuppb.BackupManifest {
396+ return m (start , end , false /* compacted */ , false /* revision */ )
397+ }
398+ mComp := func (start , end int ) backuppb.BackupManifest {
399+ return m (start , end , true /* compacted */ , false /* revision */ )
400+ }
401+ mRev := func (start , end int ) backuppb.BackupManifest {
402+ return m (start , end , false /* compacted */ , true /* revision */ )
403+ }
381404
382- // Note: The tests here work under the assumption that the input lists are
405+ // Note: The tests here work under the assumption that the input manifests are
383406 // always sorted in ascending order by end time, and then sorted in ascending
384407 // order by start time.
385408 for _ , tc := range []struct {
386- name string
387- times [][]int // len 2 slices of start and end time.
388- expected [][]int // expected start and end times
409+ name string
410+ manifests []backuppb.BackupManifest
411+ endTime int
412+ includeCompacted bool
413+ err string
414+ expected [][]int // expected timestamps of returned backups
389415 }{
390- {"single" , [][]int {{0 , 1 }}, [][]int {{0 , 1 }}},
391- {"double" , [][]int {{0 , 1 }, {1 , 2 }}, [][]int {{0 , 1 }, {1 , 2 }}},
392416 {
393- "simple chain, no skips" ,
394- [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 5 }, {5 , 8 }},
395- [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 5 }, {5 , 8 }},
417+ name : "single backup" ,
418+ manifests : []backuppb.BackupManifest {
419+ mNorm (0 , 1 ),
420+ },
421+ endTime : 1 ,
422+ expected : [][]int {{0 , 1 }},
423+ },
424+ {
425+ name : "double backup" ,
426+ manifests : []backuppb.BackupManifest {
427+ mNorm (0 , 1 ), mNorm (1 , 2 ),
428+ },
429+ endTime : 2 ,
430+ expected : [][]int {{0 , 1 }, {1 , 2 }},
431+ },
432+ {
433+ name : "out of bounds end time" ,
434+ manifests : []backuppb.BackupManifest {
435+ mNorm (0 , 1 ), mNorm (1 , 2 ),
436+ },
437+ endTime : 3 ,
438+ err : "supplied backups do not cover requested time" ,
396439 },
397440 {
398- "compaction of two backups" ,
399- [][]int {{0 , 1 }, {1 , 2 }, {1 , 3 }, {2 , 3 }, {3 , 5 }, {5 , 8 }},
400- [][]int {{0 , 1 }, {1 , 3 }, {3 , 5 }, {5 , 8 }},
441+ name : "revision history restore should fail on non-revision history backups" ,
442+ manifests : []backuppb.BackupManifest {
443+ mNorm (0 , 2 ), mNorm (2 , 4 ),
444+ },
445+ endTime : 3 ,
446+ err : "restoring to arbitrary time" ,
401447 },
402448 {
403- "compaction of entire chain" ,
404- [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 5 }, {0 , 8 }, {5 , 8 }},
405- [][]int {{0 , 8 }},
449+ name : "revision history restore should succeed on revision history backups" ,
450+ manifests : []backuppb.BackupManifest {
451+ mRev (0 , 2 ), mRev (2 , 4 ),
452+ },
453+ endTime : 3 ,
454+ expected : [][]int {{0 , 2 }, {2 , 4 }},
406455 },
407456 {
408- "two compactions of two backups" ,
409- [][]int {{0 , 1 }, {1 , 2 }, {1 , 3 }, {2 , 3 }, {3 , 5 }, {3 , 8 }, {5 , 8 }},
410- [][]int {{0 , 1 }, {1 , 3 }, {3 , 8 }},
457+ name : "end time in middle of chain should truncate" ,
458+ manifests : []backuppb.BackupManifest {
459+ mNorm (0 , 1 ), mNorm (1 , 2 ), mNorm (2 , 3 ),
460+ mNorm (3 , 5 ), mNorm (5 , 8 ),
461+ },
462+ endTime : 3 ,
463+ expected : [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }},
411464 },
412465 {
413- "compaction includes a compacted backup in the middle" ,
414- [][]int {{0 , 1 }, {1 , 2 }, {1 , 3 }, {2 , 3 }, {3 , 5 }, {1 , 8 }, {5 , 8 }},
415- [][]int {{0 , 1 }, {1 , 8 }},
466+ name : "non-continuous backup chain should fail" ,
467+ manifests : []backuppb.BackupManifest {
468+ mNorm (0 , 1 ), mNorm (2 , 3 ),
469+ },
470+ endTime : 3 ,
471+ err : "backups are not continuous" ,
416472 },
417473 {
418- "two compactions with the same end time" ,
419- [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }, {3 , 5 }, {1 , 8 }, {3 , 8 }, {5 , 8 }},
420- [][]int {{0 , 1 }, {1 , 8 }},
474+ name : "ignore compacted backups if includeCompacted is false" ,
475+ manifests : []backuppb.BackupManifest {
476+ mNorm (0 , 1 ), mNorm (1 , 2 ), mComp (1 , 3 ), mNorm (2 , 3 ),
477+ },
478+ endTime : 3 ,
479+ expected : [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }},
480+ },
481+ {
482+ name : "compaction of two backups" ,
483+ manifests : []backuppb.BackupManifest {
484+ mNorm (0 , 1 ), mNorm (1 , 2 ), mComp (1 , 3 ), mNorm (2 , 3 ),
485+ mNorm (3 , 5 ), mNorm (5 , 8 ),
486+ },
487+ endTime : 8 ,
488+ includeCompacted : true ,
489+ expected : [][]int {{0 , 1 }, {1 , 3 }, {3 , 5 }, {5 , 8 }},
490+ },
491+ {
492+ name : "compaction of entire incremental chain" ,
493+ manifests : []backuppb.BackupManifest {
494+ mNorm (0 , 1 ), mNorm (1 , 2 ), mNorm (2 , 3 ), mNorm (3 , 5 ),
495+ mComp (1 , 8 ), mNorm (5 , 8 ),
496+ },
497+ endTime : 8 ,
498+ includeCompacted : true ,
499+ expected : [][]int {{0 , 1 }, {1 , 8 }},
500+ },
501+ {
502+ name : "two separate compactions of two backups" ,
503+ manifests : []backuppb.BackupManifest {
504+ mNorm (0 , 1 ), mNorm (1 , 2 ), mComp (1 , 3 ), mNorm (2 , 3 ),
505+ mNorm (3 , 5 ), mComp (3 , 8 ), mNorm (5 , 8 ),
506+ },
507+ endTime : 8 ,
508+ includeCompacted : true ,
509+ expected : [][]int {{0 , 1 }, {1 , 3 }, {3 , 8 }},
510+ },
511+ {
512+ name : "compaction includes a compacted backup in the middle" ,
513+ manifests : []backuppb.BackupManifest {
514+ mNorm (0 , 1 ), mNorm (1 , 2 ), mComp (1 , 3 ), mNorm (2 , 3 ),
515+ mNorm (3 , 5 ), mComp (1 , 8 ), mNorm (5 , 8 ),
516+ },
517+ endTime : 8 ,
518+ includeCompacted : true ,
519+ expected : [][]int {{0 , 1 }, {1 , 8 }},
520+ },
521+ {
522+ name : "two compactions with the same end time" ,
523+ manifests : []backuppb.BackupManifest {
524+ mNorm (0 , 1 ), mNorm (1 , 2 ), mNorm (2 , 3 ), mNorm (3 , 5 ),
525+ mComp (1 , 8 ), mComp (3 , 8 ), mNorm (5 , 8 ),
526+ },
527+ endTime : 8 ,
528+ includeCompacted : true ,
529+ expected : [][]int {{0 , 1 }, {1 , 8 }},
530+ },
531+ {
532+ name : "end time in middle of compacted chain should pick base incremental" ,
533+ manifests : []backuppb.BackupManifest {
534+ mNorm (0 , 1 ), mNorm (1 , 2 ), mNorm (2 , 3 ),
535+ mComp (1 , 5 ), mNorm (3 , 5 ),
536+ },
537+ endTime : 3 ,
538+ includeCompacted : true ,
539+ expected : [][]int {{0 , 1 }, {1 , 2 }, {2 , 3 }},
540+ },
541+ {
542+ name : "overlapping compacted backups" ,
543+ manifests : []backuppb.BackupManifest {
544+ mNorm (0 , 1 ), mNorm (1 , 2 ), mComp (1 , 3 ), mNorm (2 , 3 ), mComp (2 , 4 ), mNorm (3 , 4 ),
545+ },
546+ endTime : 4 ,
547+ includeCompacted : true ,
548+ expected : [][]int {{0 , 1 }, {1 , 2 }, {2 , 4 }},
421549 },
422550 } {
423551 t .Run (tc .name , func (t * testing.T ) {
424- chain := make ([]backuppb.BackupManifest , len (tc .times ))
425- for i , ts := range tc .times {
426- chain [i ].StartTime = hlc.Timestamp {WallTime : int64 (ts [0 ])}
427- chain [i ].EndTime = hlc.Timestamp {WallTime : int64 (ts [1 ])}
428- }
429- uris , res , locs , err := backupinfo .ElideSkippedLayers (
430- make ([]string , len (tc .times )),
431- chain ,
432- make ([]jobspb.RestoreDetails_BackupLocalityInfo , len (tc .times )),
552+ uris , res , locs , err := backupinfo .ValidateEndTimeAndTruncate (
553+ make ([]string , len (tc .manifests )),
554+ tc .manifests ,
555+ make ([]jobspb.RestoreDetails_BackupLocalityInfo , len (tc .manifests )),
556+ hlc.Timestamp {WallTime : int64 (tc .endTime )},
557+ false , /* includeSkipped */
558+ tc .includeCompacted ,
433559 )
434- require .NoError (t , err )
560+ if tc .err != "" {
561+ require .ErrorContains (t , err , tc .err )
562+ return
563+ }
435564 require .Equal (t , len (tc .expected ), len (uris ))
436565 require .Equal (t , len (tc .expected ), len (locs ))
437566 require .Equal (t , len (tc .expected ), len (res ))
0 commit comments