@@ -27,6 +27,8 @@ import (
27
27
"github.com/openshift/origin/pkg/util/namer"
28
28
)
29
29
30
+ const conflictRetries = 3
31
+
30
32
// GeneratorFatalError represents a fatal error while generating a build.
31
33
// An operation that fails because of a fatal error should not be retried.
32
34
type GeneratorFatalError struct {
@@ -248,6 +250,21 @@ func updateBuildArgs(oldArgs *[]kapi.EnvVar, newArgs []kapi.EnvVar) []kapi.EnvVa
248
250
249
251
// Instantiate returns a new Build object based on a BuildRequest object
250
252
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 ) {
251
268
glog .V (4 ).Infof ("Generating Build from %s" , describeBuildRequest (request ))
252
269
bc , err := g .Client .GetBuildConfig (ctx , request .Name , & metav1.GetOptions {})
253
270
if err != nil {
@@ -374,6 +391,21 @@ func (g *BuildGenerator) updateImageTriggers(ctx apirequest.Context, bc *buildap
374
391
375
392
// Clone returns clone of a Build
376
393
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 ) {
377
409
glog .V (4 ).Infof ("Generating build from build %s/%s" , request .Namespace , request .Name )
378
410
build , err := g .Client .GetBuild (ctx , request .Name , & metav1.GetOptions {})
379
411
if err != nil {
0 commit comments