in internal/flowcontrol/writebuffer.go [145:180]
func (w *ResourceSliceWriteBuffer) updateSlice(ctx context.Context, insertionTime time.Time, sliceNSN types.NamespacedName, updates []*resourceSliceStatusUpdate) (success bool) {
logger := logr.FromContextOrDiscard(ctx)
slice := &apiv1.ResourceSlice{}
slice.Name = sliceNSN.Name
slice.Namespace = sliceNSN.Namespace
err := w.client.Get(ctx, client.ObjectKeyFromObject(slice), slice)
if client.IgnoreNotFound(err) != nil {
logger.Error(err, "unable to get resource slice")
return false
}
patches := w.buildPatch(slice, updates)
if len(patches) == 0 {
return true // nothing to do!
}
patchJson, err := json.Marshal(&patches)
if err != nil {
logger.Error(err, "unable to encode patch")
return false
}
err = w.client.Status().Patch(ctx, slice, client.RawPatch(types.JSONPatchType, patchJson))
if errors.IsNotFound(err) {
logger.V(1).Info("resource slice deleted - dropping buffered status updates")
return true
}
if err != nil {
logger.Error(err, "unable to update resource slice")
return false
}
logger.V(0).Info(fmt.Sprintf("updated the status of %d resources in slice", len(updates)), "latency", time.Since(insertionTime).Abs().Milliseconds())
sliceStatusUpdates.Inc()
return true
}