diff --git a/VERSION b/VERSION index 6088c2c..3802e7d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.0.13-dev \ No newline at end of file +v0.0.14 diff --git a/internal/usage/tracking.go b/internal/usage/tracking.go index 6237223..913ceae 100644 --- a/internal/usage/tracking.go +++ b/internal/usage/tracking.go @@ -168,21 +168,27 @@ func (u *UsageTracker) DeletionEvent(ctx context.Context, project string, worksp return fmt.Errorf("error getting object key: %w", err) } - var mcpUsage = v1.MCPUsage{ - ObjectMeta: metav1.ObjectMeta{ - Name: objectKey.Name, - Namespace: objectKey.Namespace, - }, - Spec: v1.MCPUsageSpec{ - MCPDeletedAt: metav1.NewTime(time.Now().UTC()), - }, - } - err = u.client.Patch(ctx, &mcpUsage, client.Merge) - if k8serrors.IsNotFound(err) { + deletedAt := metav1.NewTime(time.Now().UTC()) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + var mcpUsage v1.MCPUsage + // Re-fetch the latest version to avoid update conflicts + err := u.client.Get(ctx, objectKey, &mcpUsage) + if err != nil { + return fmt.Errorf("error getting MCPUsage resource during retry: %w", err) + } + mcpUsage.Spec.MCPDeletedAt = deletedAt + err = u.client.Update(ctx, &mcpUsage) + if err != nil { + if k8serrors.IsConflict(err) { + return err // trigger retry + } + return fmt.Errorf("error when setting deletion timestamp on MCPUsage element: %w", err) + } return nil - } + }) + if err != nil { - return fmt.Errorf("error when setting deletion timestamp on MCPUsage element: %w", err) + return err } return nil