fix(service update): Retry an update in case of a conflict. (#240)

* fix(service update): Retry an update in case of a conflict.

Is related to #224 and should fix one flake.

* chore(service): Fixed retry-loop for kn service create/update
This commit is contained in:
Roland Huß 2019-07-10 20:18:10 +02:00 committed by Knative Prow Robot
parent 9f62341dcf
commit e1614f95e6
3 changed files with 48 additions and 26 deletions

View File

@ -19,6 +19,11 @@ import (
"github.com/spf13/cobra"
)
const (
// How often to retry in case of an optimistic lock error when replacing a service (--force)
MaxUpdateRetries = 3
)
func NewServiceCommand(p *commands.KnParams) *cobra.Command {
serviceCmd := &cobra.Command{
Use: "service",

View File

@ -147,17 +147,25 @@ func createService(client v1alpha1.KnClient, service *serving_v1alpha1_api.Servi
}
func replaceService(client v1alpha1.KnClient, service *serving_v1alpha1_api.Service, namespace string, out io.Writer) error {
existingService, err := client.GetService(service.Name)
if err != nil {
return err
var retries = 0
for {
existingService, err := client.GetService(service.Name)
if err != nil {
return err
}
service.ResourceVersion = existingService.ResourceVersion
err = client.UpdateService(service)
if err != nil {
// Retry to update when a resource version conflict exists
if api_errors.IsConflict(err) && retries < MaxUpdateRetries {
retries++
continue
}
return err
}
fmt.Fprintf(out, "Service '%s' successfully replaced in namespace '%s'.\n", service.Name, namespace)
return nil
}
service.ResourceVersion = existingService.ResourceVersion
err = client.UpdateService(service)
if err != nil {
return err
}
fmt.Fprintf(out, "Service '%s' successfully replaced in namespace '%s'.\n", service.Name, namespace)
return nil
}
func serviceExists(client v1alpha1.KnClient, name string, namespace string) (bool, error) {

View File

@ -18,8 +18,10 @@ import (
"errors"
"fmt"
"github.com/knative/client/pkg/kn/commands"
"github.com/spf13/cobra"
api_errors "k8s.io/apimachinery/pkg/api/errors"
"github.com/knative/client/pkg/kn/commands"
)
func NewServiceUpdateCommand(p *commands.KnParams) *cobra.Command {
@ -52,24 +54,31 @@ func NewServiceUpdateCommand(p *commands.KnParams) *cobra.Command {
return err
}
service, err := client.GetService(args[0])
if err != nil {
return err
}
service = service.DeepCopy()
var retries = 0
for {
service, err := client.GetService(args[0])
if err != nil {
return err
}
service = service.DeepCopy()
err = editFlags.Apply(service, cmd)
if err != nil {
return err
}
err = editFlags.Apply(service, cmd)
if err != nil {
return err
}
err = client.UpdateService(service)
if err != nil {
return err
err = client.UpdateService(service)
if err != nil {
// Retry to update when a resource version conflict exists
if api_errors.IsConflict(err) && retries < MaxUpdateRetries {
retries++
continue
}
return err
}
fmt.Fprintf(cmd.OutOrStdout(), "Service '%s' updated in namespace '%s'.\n", args[0], namespace)
return nil
}
fmt.Fprintf(cmd.OutOrStdout(), "Service '%s' updated in namespace '%s'.\n", args[0], namespace)
return nil
},
}