diff --git a/federation/pkg/kubefed/init/init.go b/federation/pkg/kubefed/init/init.go index e5c819cba3c..ad2a8475fd2 100644 --- a/federation/pkg/kubefed/init/init.go +++ b/federation/pkg/kubefed/init/init.go @@ -242,7 +242,7 @@ func waitForLoadBalancerAddress(clientset *client.Clientset, svc *api.Service) ( ips := []string{} hostnames := []string{} - err := wait.PollInfinite(lbAddrRetryInterval, func() (bool, error) { + err := wait.PollImmediateInfinite(lbAddrRetryInterval, func() (bool, error) { pollSvc, err := clientset.Core().Services(svc.Namespace).Get(svc.Name) if err != nil { return false, nil diff --git a/pkg/util/wait/wait.go b/pkg/util/wait/wait.go index 65f2e0b7618..34d833b44d9 100644 --- a/pkg/util/wait/wait.go +++ b/pkg/util/wait/wait.go @@ -192,6 +192,20 @@ func PollInfinite(interval time.Duration, condition ConditionFunc) error { return PollUntil(interval, condition, done) } +// PollImmediateInfinite is identical to PollInfinite, except that it +// performs the first check immediately, not waiting interval +// beforehand. +func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) error { + done, err := condition() + if err != nil { + return err + } + if done { + return nil + } + return PollInfinite(interval, condition) +} + // PollUntil is like Poll, but it takes a stop change instead of total duration func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { return WaitFor(poller(interval, 0), condition, stopCh)