@@ -590,7 +590,7 @@ func fromFlattenName(flatten string) (name string, namespace string) {
590590// then validate and return the parent backup.
591591// If parentBackupName is not specified, find the latest valid parent backup.
592592func GetParentBackup (ctx context.Context , cli client.Client , backup * dpv1alpha1.Backup ,
593- backupMethod * dpv1alpha1.BackupMethod , backupRepoName string ) (* dpv1alpha1.Backup , error ) {
593+ backupMethod * dpv1alpha1.BackupMethod , backupPolicy * dpv1alpha1. BackupPolicy , backupRepoName string ) (* dpv1alpha1.Backup , error ) {
594594 if backup == nil || backupMethod == nil {
595595 return nil , fmt .Errorf ("backup or backupMethod is nil" )
596596 }
@@ -616,16 +616,23 @@ func GetParentBackup(ctx context.Context, cli client.Client, backup *dpv1alpha1.
616616 }, parentBackup ); err != nil {
617617 return nil , err
618618 }
619- if err := ValidateParentBackup (ctx , cli , backup , parentBackup , backupMethod , backupRepoName ); err != nil {
619+ if err := ValidateParentBackup (ctx , cli , backup , parentBackup , backupMethod , backupPolicy , backupRepoName ); err != nil {
620620 return nil , fmt .Errorf ("failed to validate parent backup %s: %w" , parentBackupName , err )
621621 }
622622 return parentBackup , nil
623623 }
624- parentBackup , err := FindParentBackupIfNotSet (ctx , cli , backup , backupMethod , backupRepoName )
624+ parentBackup , err := FindParentBackupIfNotSet (ctx , cli , backup , backupMethod , backupPolicy , backupRepoName )
625625 if err != nil {
626626 return nil , fmt .Errorf ("failed to find parent backup: %w" , err )
627627 }
628628 if parentBackup == nil {
629+ // output sharding message
630+ expectedTargets := dputils .GetBackupTargets (backupPolicy , backupMethod )
631+ if len (expectedTargets ) > 0 {
632+ return nil , fmt .Errorf ("failed to find a valid parent backup for backup %s/%s: " +
633+ "current backup expects %d shards, this may be due to shard count mismatch with existing backups" ,
634+ backup .Namespace , backup .Name , len (expectedTargets ))
635+ }
629636 return nil , fmt .Errorf ("failed to find a valid parent backup for backup %s/%s" , backup .Namespace , backup .Name )
630637 }
631638 return parentBackup , nil
@@ -637,7 +644,7 @@ func GetParentBackup(ctx context.Context, cli client.Client, backup *dpv1alpha1.
637644// b. return the latest incremental backup.
638645// c. return the latest full backup if incremental backups are not found.
639646func FindParentBackupIfNotSet (ctx context.Context , cli client.Client , backup * dpv1alpha1.Backup ,
640- backupMethod * dpv1alpha1.BackupMethod , backupRepoName string ) (* dpv1alpha1.Backup , error ) {
647+ backupMethod * dpv1alpha1.BackupMethod , backupPolicy * dpv1alpha1. BackupPolicy , backupRepoName string ) (* dpv1alpha1.Backup , error ) {
641648 getLatestBackup := func (backupList []* dpv1alpha1.Backup ) * dpv1alpha1.Backup {
642649 if len (backupList ) == 0 {
643650 return nil
@@ -655,7 +662,7 @@ func FindParentBackupIfNotSet(ctx context.Context, cli client.Client, backup *dp
655662 client .MatchingLabels (labels )); err != nil && ! apierrors .IsNotFound (err ) {
656663 return nil , err
657664 }
658- filteredbackupList := FilterParentBackups (ctx , cli , backupList , backup , backupMethod , incremental , backupRepoName )
665+ filteredbackupList := FilterParentBackups (ctx , cli , backupList , backup , backupMethod , backupPolicy , incremental , backupRepoName )
659666 return getLatestBackup (filteredbackupList ), nil
660667 }
661668
@@ -701,13 +708,13 @@ func FindParentBackupIfNotSet(ctx context.Context, cli client.Client, backup *dp
701708
702709// FilterParentBackups filters the parent backups by backup phase, backup method and end time.
703710func FilterParentBackups (ctx context.Context , cli client.Client , backupList * dpv1alpha1.BackupList , targetBackup * dpv1alpha1.Backup ,
704- backupMethod * dpv1alpha1.BackupMethod , incremental bool , backupRepoName string ) []* dpv1alpha1.Backup {
711+ backupMethod * dpv1alpha1.BackupMethod , backupPolicy * dpv1alpha1. BackupPolicy , incremental bool , backupRepoName string ) []* dpv1alpha1.Backup {
705712 var res []* dpv1alpha1.Backup
706713 if backupList == nil || len (backupList .Items ) == 0 {
707714 return res
708715 }
709716 for i , backup := range backupList .Items {
710- if err := ValidateParentBackup (ctx , cli , targetBackup , & backup , backupMethod , backupRepoName ); err != nil {
717+ if err := ValidateParentBackup (ctx , cli , targetBackup , & backup , backupMethod , backupPolicy , backupRepoName ); err != nil {
711718 continue
712719 }
713720 // backups are listed by backup type label, validate if the backup method matches
@@ -728,7 +735,7 @@ func FilterParentBackups(ctx context.Context, cli client.Client, backupList *dpv
728735
729736// ValidateParentBackup validates the parent backup.
730737func ValidateParentBackup (ctx context.Context , cli client.Client , backup * dpv1alpha1.Backup , parentBackup * dpv1alpha1.Backup ,
731- backupMethod * dpv1alpha1.BackupMethod , backupRepoName string ) error {
738+ backupMethod * dpv1alpha1.BackupMethod , backupPolicy * dpv1alpha1. BackupPolicy , backupRepoName string ) error {
732739 // validate parent backup is completed
733740 if parentBackup .Status .Phase != dpv1alpha1 .BackupPhaseCompleted {
734741 return fmt .Errorf ("parent backup %s/%s is not completed" , parentBackup .Namespace , parentBackup .Name )
@@ -759,6 +766,13 @@ func ValidateParentBackup(ctx context.Context, cli client.Client, backup *dpv1al
759766 parentBackup .Namespace , parentBackup .Name , err )
760767 }
761768 }
769+ // validate shard count consistency for incremental backup
770+ expectedTargets := dputils .GetBackupTargets (backupPolicy , backupMethod )
771+ if len (expectedTargets ) > 0 && len (parentBackup .Status .Targets ) != len (expectedTargets ) {
772+ return fmt .Errorf ("parent backup %s/%s has %d shards, but current backup expects %d shards; " +
773+ "incremental backup requires consistent shard count" ,
774+ parentBackup .Namespace , parentBackup .Name , len (parentBackup .Status .Targets ), len (expectedTargets ))
775+ }
762776 return nil
763777}
764778
0 commit comments