diff --git a/realis.go b/realis.go index dbf205b..b278df1 100644 --- a/realis.go +++ b/realis.go @@ -168,9 +168,12 @@ func NewRealisClient(options ...option) (Realis, error) { //Cluster or URL? if config.cluster != nil { url, err = LeaderFromZK(*config.cluster) + + // If ZK is configured, throw an error if the leader is unable to be determined if err != nil { - fmt.Errorf("LeaderFromZK error: %+v\n ", err) + return nil, errors.Wrap(err, "LeaderFromZK error") } + fmt.Println("schedURLFromZK: ", url) } else if config.url != "" { fmt.Println("Scheduler URL: ", config.url) diff --git a/zk.go b/zk.go index 1c0c61c..4a6f593 100644 --- a/zk.go +++ b/zk.go @@ -41,32 +41,32 @@ type NoopLogger struct{} func (NoopLogger) Printf(format string, a ...interface{}) { } -// Loads leader from ZK endpoint. +// Retrieves current Aurora leader from ZK. func LeaderFromZK(cluster Cluster) (string, error) { var err error var zkurl string duration := defaultBackoff.Duration - for i := 0; i < defaultBackoff.Steps; i++ { - if i != 0 { - adjusted := duration - if defaultBackoff.Jitter > 0.0 { - adjusted = Jitter(duration, defaultBackoff.Jitter) - } - fmt.Println(" sleeping for: ", adjusted) - time.Sleep(adjusted) - duration = time.Duration(float64(duration) * defaultBackoff.Factor) - } - if zkurl, err = leaderFromZK(cluster); err == nil { + for step := 0; step < defaultBackoff.Steps; step++ { + + // Attempt to find leader + zkurl, err = leaderFromZK(cluster) + if err == nil { return zkurl, err } - if err != nil { - fmt.Println("error in LeaderFromZK: ", err) + + // Backoff if we failed to determine leader + adjusted := duration + if defaultBackoff.Jitter > 0.0 { + adjusted = Jitter(duration, defaultBackoff.Jitter) } + fmt.Printf("Error determining Aurora leader: %v; retrying in %v\n", err, adjusted) + time.Sleep(adjusted) + duration = time.Duration(float64(duration) * defaultBackoff.Factor) } - return "", err + return "", errors.Wrapf(err, "Failed to determine leader after %v attempts", defaultBackoff.Steps) } func leaderFromZK(cluster Cluster) (string, error) {