Skip to content

Commit 729e4f0

Browse files
committed
deployment: retry failed watch when observed controller has old resource version
1 parent badb6ac commit 729e4f0

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

pkg/deploy/registry/rest.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@ import (
66
"time"
77

88
kapi "k8s.io/kubernetes/pkg/api"
9+
"k8s.io/kubernetes/pkg/api/unversioned"
910
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
1011
"k8s.io/kubernetes/pkg/fields"
1112
"k8s.io/kubernetes/pkg/watch"
1213

14+
"github.com/golang/glog"
1315
"github.com/openshift/origin/pkg/deploy/api"
1416
deployutil "github.com/openshift/origin/pkg/deploy/util"
1517
)
1618

1719
var (
1820
// ErrUnknownDeploymentPhase is returned for WaitForRunningDeployment if an unknown phase is returned.
1921
ErrUnknownDeploymentPhase = errors.New("unknown deployment phase")
22+
ErrTooOldResourceVersion = errors.New("too old resource version")
2023
)
2124

2225
// WaitForRunningDeployment waits until the specified deployment is no longer New or Pending. Returns true if
@@ -33,6 +36,15 @@ func WaitForRunningDeployment(rn kcoreclient.ReplicationControllersGetter, obser
3336

3437
if _, err := watch.Until(timeout, w, func(e watch.Event) (bool, error) {
3538
if e.Type == watch.Error {
39+
// When we send too old resource version in observed replication controller to
40+
// watcher, restart the watch with latest available controller.
41+
switch t := e.Object.(type) {
42+
case *unversioned.Status:
43+
if t.Reason == unversioned.StatusReasonGone {
44+
glog.V(5).Infof("encountered error while watching for replication controller: %v (retrying)", t)
45+
return false, ErrTooOldResourceVersion
46+
}
47+
}
3648
return false, fmt.Errorf("encountered error while watching for replication controller: %v", e.Object)
3749
}
3850
obj, isController := e.Object.(*kapi.ReplicationController)
@@ -49,6 +61,13 @@ func WaitForRunningDeployment(rn kcoreclient.ReplicationControllersGetter, obser
4961
return false, ErrUnknownDeploymentPhase
5062
}
5163
}); err != nil {
64+
if err == ErrTooOldResourceVersion {
65+
latestRC, err := rn.ReplicationControllers(observed.Namespace).Get(observed.Name)
66+
if err != nil {
67+
return observed, false, err
68+
}
69+
return WaitForRunningDeployment(rn, latestRC, timeout)
70+
}
5271
return observed, false, err
5372
}
5473

0 commit comments

Comments
 (0)