diff --git a/examples/image.yaml b/examples/image.yaml index 030d1a4..4398346 100644 --- a/examples/image.yaml +++ b/examples/image.yaml @@ -1,11 +1,8 @@ apiVersion: storage.sbombastic.rancher.io/v1alpha1 kind: Image metadata: - creationTimestamp: "2024-11-15T16:02:47Z" name: 82df15a51db0bb0182ee86c6d084c43d1c2731e36c68900ee59c88747dd4af10 namespace: default - resourceVersion: "1" - uid: be4efbf7-feb9-4952-8a7f-04ec03c89c9b spec: imageMetadata: digest: sha256:6169c4bcc1982095067d85edf58fdcc3bd8505aef728610c5b728f3cf1cec46b diff --git a/examples/sbom.yaml b/examples/sbom.yaml index 1c77ce8..e0bac6b 100644 --- a/examples/sbom.yaml +++ b/examples/sbom.yaml @@ -1,11 +1,8 @@ apiVersion: storage.sbombastic.rancher.io/v1alpha1 kind: SBOM metadata: - creationTimestamp: "2024-11-15T16:02:50Z" name: 82df15a51db0bb0182ee86c6d084c43d1c2731e36c68900ee59c88747dd4af10 namespace: default - resourceVersion: "1" - uid: 81f04e99-82ed-4d7b-95ef-434dc0757e25 spec: imageMetadata: digest: sha256:6169c4bcc1982095067d85edf58fdcc3bd8505aef728610c5b728f3cf1cec46b diff --git a/examples/vulnerabilityreport.yaml b/examples/vulnerabilityreport.yaml index 7cbe102..d6bdbfc 100644 --- a/examples/vulnerabilityreport.yaml +++ b/examples/vulnerabilityreport.yaml @@ -1,11 +1,8 @@ apiVersion: storage.sbombastic.rancher.io/v1alpha1 kind: VulnerabilityReport metadata: - creationTimestamp: "2024-11-15T16:02:54Z" name: 82df15a51db0bb0182ee86c6d084c43d1c2731e36c68900ee59c88747dd4af10 namespace: default - resourceVersion: "1" - uid: 946d1a07-7775-4824-a656-a74e5255225f spec: imageMetadata: digest: sha256:6169c4bcc1982095067d85edf58fdcc3bd8505aef728610c5b728f3cf1cec46b diff --git a/internal/storage/store.go b/internal/storage/store.go index f9ae764..fc9eb6b 100644 --- a/internal/storage/store.go +++ b/internal/storage/store.go @@ -10,10 +10,12 @@ import ( "reflect" "strings" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" + "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/storage" sq "github.com/Masterminds/squirrel" @@ -338,18 +340,18 @@ func (s *store) GuaranteedUpdate( return storage.NewInternalErrorf("invalid key: %s", key) } - for { - tx, err := s.db.BeginTxx(ctx, nil) - if err != nil { - return err - } + tx, err := s.db.BeginTxx(ctx, nil) + if err != nil { + return err + } - defer func() { - if err := tx.Rollback(); !errors.Is(err, sql.ErrTxDone) { - log.Printf("failed to rollback transaction: %v", err) - } - }() + defer func() { + if err := tx.Rollback(); !errors.Is(err, sql.ErrTxDone) { + log.Printf("failed to rollback transaction: %v", err) + } + }() + for { query, args, err := sq.Select("*"). From(s.table). Where(sq.Eq{"name": name, "namespace": namespace}). @@ -388,7 +390,12 @@ func (s *store) GuaranteedUpdate( updatedObj, _, err := tryUpdate(obj, storage.ResponseMeta{}) if err != nil { - continue + if apierrors.IsConflict(err) && strings.Contains(err.Error(), registry.OptimisticLockErrorMsg) { + // retry update on optimistic lock conflict + continue + } + + return err } version, err := s.Versioner().ObjectResourceVersion(obj)