Skip to content

Commit

Permalink
Merge pull request #37 from fabriziosestito/fix/guaranteed-update
Browse files Browse the repository at this point in the history
fix(storage): tryUpdate should only retry index conflict errors
  • Loading branch information
fabriziosestito authored Nov 18, 2024
2 parents 1c4aa1b + 1e91c90 commit 737b747
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 20 deletions.
3 changes: 0 additions & 3 deletions examples/image.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
3 changes: 0 additions & 3 deletions examples/sbom.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
3 changes: 0 additions & 3 deletions examples/vulnerabilityreport.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
29 changes: 18 additions & 11 deletions internal/storage/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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}).
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 737b747

Please sign in to comment.