in internal/controllers/resourceslice/slice.go [104:143]
func (s *sliceController) handleMissingSlice(ctx context.Context, comp *apiv1.Composition, sliceName string) (ctrl.Result, error) {
logger := logr.FromContextOrDiscard(ctx)
// We can't do anything about missing resource slices if synthesis is already in-flight or it isn't safe to resynthesize
if comp.ShouldIgnoreSideEffects() || comp.Status.InFlightSynthesis != nil || comp.ShouldForceResynthesis() {
return ctrl.Result{}, nil
}
// It's possible that newly created slices haven't hit the informer cache yet
if synthd := comp.Status.CurrentSynthesis.Synthesized; synthd != nil {
delta := time.Since(synthd.Time)
if delta < time.Second*5 {
return ctrl.Result{RequeueAfter: delta}, nil
}
}
// Be absolutely sure the slice is missing
meta := &metav1.PartialObjectMetadata{}
meta.Kind = "ResourceSlice"
meta.APIVersion = apiv1.SchemeGroupVersion.String()
meta.Name = sliceName
meta.Namespace = comp.Namespace
err := s.client.Get(ctx, client.ObjectKeyFromObject(meta), meta)
if err == nil {
logger.V(1).Info("resource slice is not missing!", "resourceSliceName", sliceName)
return ctrl.Result{}, nil
}
if !errors.IsNotFound(err) {
return ctrl.Result{}, fmt.Errorf("getting resource slice metadata: %w", err)
}
// Resynthesis is required
logger.Info("resource slice is missing - resynthesizing", "resourceSliceName", sliceName)
comp.ForceResynthesis()
err = s.client.Update(ctx, comp)
if err != nil {
return ctrl.Result{}, fmt.Errorf("updating composition pending resynthesis: %w", err)
}
return ctrl.Result{}, nil
}