Skip to content

Commit f24a57f

Browse files
author
OpenShift Bot
authored
Merge pull request #13910 from jim-minter/issue13694
Merged by openshift-bot
2 parents 012de50 + 84906c4 commit f24a57f

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

pkg/build/generator/generator.go

+32
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import (
2727
"github.com/openshift/origin/pkg/util/namer"
2828
)
2929

30+
const conflictRetries = 3
31+
3032
// GeneratorFatalError represents a fatal error while generating a build.
3133
// An operation that fails because of a fatal error should not be retried.
3234
type GeneratorFatalError struct {
@@ -248,6 +250,21 @@ func updateBuildArgs(oldArgs *[]kapi.EnvVar, newArgs []kapi.EnvVar) []kapi.EnvVa
248250

249251
// Instantiate returns a new Build object based on a BuildRequest object
250252
func (g *BuildGenerator) Instantiate(ctx apirequest.Context, request *buildapi.BuildRequest) (*buildapi.Build, error) {
253+
var build *buildapi.Build
254+
var err error
255+
256+
for i := 0; i < conflictRetries; i++ {
257+
build, err = g.instantiate(ctx, request)
258+
if err == nil || !errors.IsConflict(err) {
259+
break
260+
}
261+
glog.V(4).Infof("instantiate returned conflict, try %d/%d", i+1, conflictRetries)
262+
}
263+
264+
return build, err
265+
}
266+
267+
func (g *BuildGenerator) instantiate(ctx apirequest.Context, request *buildapi.BuildRequest) (*buildapi.Build, error) {
251268
glog.V(4).Infof("Generating Build from %s", describeBuildRequest(request))
252269
bc, err := g.Client.GetBuildConfig(ctx, request.Name, &metav1.GetOptions{})
253270
if err != nil {
@@ -374,6 +391,21 @@ func (g *BuildGenerator) updateImageTriggers(ctx apirequest.Context, bc *buildap
374391

375392
// Clone returns clone of a Build
376393
func (g *BuildGenerator) Clone(ctx apirequest.Context, request *buildapi.BuildRequest) (*buildapi.Build, error) {
394+
var build *buildapi.Build
395+
var err error
396+
397+
for i := 0; i < conflictRetries; i++ {
398+
build, err = g.clone(ctx, request)
399+
if err == nil || !errors.IsConflict(err) {
400+
break
401+
}
402+
glog.V(4).Infof("clone returned conflict, try %d/%d", i+1, conflictRetries)
403+
}
404+
405+
return build, err
406+
}
407+
408+
func (g *BuildGenerator) clone(ctx apirequest.Context, request *buildapi.BuildRequest) (*buildapi.Build, error) {
377409
glog.V(4).Infof("Generating build from build %s/%s", request.Namespace, request.Name)
378410
build, err := g.Client.GetBuild(ctx, request.Name, &metav1.GetOptions{})
379411
if err != nil {

0 commit comments

Comments
 (0)