mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
Merge pull request #26378 from pwittrock/fix-26138
Automatic merge from submit-queue Retry concurrency exceptions in e2e/kubectl.go. Fixes #26138 []()
This commit is contained in:
commit
35922bdcbd
@ -122,6 +122,8 @@ type Store struct {
|
||||
Storage storage.Interface
|
||||
}
|
||||
|
||||
const OptimisticLockErrorMsg = "the object has been modified; please apply your changes to the latest version and try again"
|
||||
|
||||
// NamespaceKeyRootFunc is the default function for constructing storage paths to resource directories enforcing namespace rules.
|
||||
func NamespaceKeyRootFunc(ctx api.Context, prefix string) string {
|
||||
key := prefix
|
||||
@ -364,7 +366,7 @@ func (e *Store) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectI
|
||||
return nil, nil, kubeerr.NewInvalid(qualifiedKind, name, fieldErrList)
|
||||
}
|
||||
if newVersion != version {
|
||||
return nil, nil, kubeerr.NewConflict(e.QualifiedResource, name, fmt.Errorf("the object has been modified; please apply your changes to the latest version and try again"))
|
||||
return nil, nil, kubeerr.NewConflict(e.QualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg))
|
||||
}
|
||||
}
|
||||
if err := rest.BeforeUpdate(e.UpdateStrategy, ctx, obj, existing); err != nil {
|
||||
|
@ -49,6 +49,7 @@ import (
|
||||
"k8s.io/kubernetes/pkg/controller"
|
||||
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/registry/generic/registry"
|
||||
pkgutil "k8s.io/kubernetes/pkg/util"
|
||||
utilnet "k8s.io/kubernetes/pkg/util/net"
|
||||
"k8s.io/kubernetes/pkg/util/wait"
|
||||
@ -140,6 +141,23 @@ func readTestFileOrDie(file string) []byte {
|
||||
return framework.ReadOrDie(path.Join(kubeCtlManifestPath, file))
|
||||
}
|
||||
|
||||
func runKubectlRetryOrDie(args ...string) string {
|
||||
var err error
|
||||
var output string
|
||||
for i := 0; i < 3; i++ {
|
||||
output, err = framework.RunKubectl(args...)
|
||||
if err == nil || !strings.Contains(err.Error(), registry.OptimisticLockErrorMsg) {
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
// Expect no errors to be present after retries are finished
|
||||
// Copied from framework #ExecOrDie
|
||||
framework.Logf("stdout: %q", output)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
return output
|
||||
}
|
||||
|
||||
var _ = framework.KubeDescribe("Kubectl client", func() {
|
||||
defer GinkgoRecover()
|
||||
f := framework.NewDefaultFramework("kubectl")
|
||||
@ -909,7 +927,8 @@ var _ = framework.KubeDescribe("Kubectl client", func() {
|
||||
framework.WaitForRCToStabilize(c, ns, rcName, framework.PodStartTimeout)
|
||||
|
||||
By("rolling-update to same image controller")
|
||||
framework.RunKubectlOrDie("rolling-update", rcName, "--update-period=1s", "--image="+nginxImage, "--image-pull-policy="+string(api.PullIfNotPresent), nsFlag)
|
||||
|
||||
runKubectlRetryOrDie("rolling-update", rcName, "--update-period=1s", "--image="+nginxImage, "--image-pull-policy="+string(api.PullIfNotPresent), nsFlag)
|
||||
framework.ValidateController(c, nginxImage, 1, rcName, "run="+rcName, noOpValidatorFn, ns)
|
||||
})
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user