in controllers/solrbackup_controller.go [65:167]
func (r *SolrBackupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
// Fetch the SolrBackup instance
backup := &solrv1beta1.SolrBackup{}
err := r.Get(ctx, req.NamespacedName, backup)
if err != nil {
if errors.IsNotFound(err) {
// Object not found, return. Created objects are automatically garbage collected.
// For additional cleanup logic use finalizers.
return reconcile.Result{}, nil
}
// Error reading the object - requeue the req.
return reconcile.Result{}, err
}
changed := backup.WithDefaults()
if changed {
logger.Info("Setting default settings for solr-backup")
if err = r.Update(ctx, backup); err != nil {
return reconcile.Result{}, err
}
return reconcile.Result{Requeue: true}, nil
}
unmodifiedBackupResource := backup.DeepCopy()
requeueOrNot := reconcile.Result{}
// Backup work needs to be done by default if the current backup is not finished
doBackupWork := !backup.Status.IndividualSolrBackupStatus.Finished
// Check if we should start the next backup
// Do not check if already doing a backup
if !doBackupWork && backup.Status.NextScheduledTime != nil {
if !backup.Spec.Recurrence.IsEnabled() {
backup.Status.NextScheduledTime = nil
doBackupWork = false
} else if backup.Status.NextScheduledTime.UTC().Before(time.Now().UTC()) {
// We have hit the next scheduled restart time.
doBackupWork = true
backup.Status.NextScheduledTime = nil
// Add the current backup to the front of the history.
// If there is no max
backup.Status.History = append([]solrv1beta1.IndividualSolrBackupStatus{backup.Status.IndividualSolrBackupStatus}, backup.Status.History...)
// Remove history if we have too much saved
if len(backup.Status.History) > backup.Spec.Recurrence.MaxSaved {
backup.Status.History = backup.Status.History[:backup.Spec.Recurrence.MaxSaved]
}
// Reset Current, which is fine since it is now in the history.
backup.Status.IndividualSolrBackupStatus = solrv1beta1.IndividualSolrBackupStatus{}
} else {
// If we have not hit the next scheduled restart, wait to requeue until that is true.
updateRequeueAfter(&requeueOrNot, backup.Status.NextScheduledTime.UTC().Sub(time.Now().UTC()))
doBackupWork = false
}
}
// Do backup work if a backup is in-progress or needs to be started
if doBackupWork {
solrCloud, _, err1 := r.reconcileSolrCloudBackup(ctx, backup, &backup.Status.IndividualSolrBackupStatus, logger)
if err1 != nil {
// TODO Should we be failing the backup for some sub-set of errors here?
logger.Error(err1, "Error while taking SolrCloud backup")
// Requeue after 10 seconds for errors.
updateRequeueAfter(&requeueOrNot, time.Second*10)
} else if backup.Status.IndividualSolrBackupStatus.Finished {
// Set finish time
now := metav1.Now()
backup.Status.IndividualSolrBackupStatus.FinishTime = &now
} else if solrCloud != nil {
// When working with the collection backups, auto-requeue after 5 seconds
// to check on the status of the async solr backup calls
updateRequeueAfter(&requeueOrNot, time.Second*5)
}
}
// Schedule the next backupTime, if it doesn't have a next scheduled time, it has recurrence and the current backup is finished
if backup.Status.IndividualSolrBackupStatus.Finished && backup.Spec.Recurrence.IsEnabled() {
if nextBackupTime, err1 := util.ScheduleNextBackup(backup.Spec.Recurrence.Schedule, backup.Status.IndividualSolrBackupStatus.StartTime.Time); err1 != nil {
logger.Error(err1, "Could not update backup scheduling due to bad cron schedule", "cron", backup.Spec.Recurrence.Schedule)
} else {
convTime := metav1.NewTime(nextBackupTime)
if backup.Status.NextScheduledTime == nil || convTime != *backup.Status.NextScheduledTime {
// Only log out the message if there is a change in NextScheduled
logger.Info("(Re)scheduling Next Backup", "time", nextBackupTime)
backup.Status.NextScheduledTime = &convTime
updateRequeueAfter(&requeueOrNot, backup.Status.NextScheduledTime.Sub(time.Now()))
}
}
}
if !reflect.DeepEqual(unmodifiedBackupResource.Status, backup.Status) {
logger.Info("Updating status for solr-backup", "newStatus", backup.Status, "oldStatus", unmodifiedBackupResource.Status)
err = r.Status().Patch(ctx, backup, client.MergeFrom(unmodifiedBackupResource))
}
return requeueOrNot, err
}