backoff/reconnect loop

This commit is contained in:
Cory Schwartz 2022-05-24 10:24:37 -07:00
parent 2b0d0ce224
commit d2299dfbf8

View File

@ -39,23 +39,49 @@ func NewLiveHandler(api lapi.FullNode) *HealthHandler {
ctx := context.Background() ctx := context.Background()
h := HealthHandler{} h := HealthHandler{}
go func() { go func() {
const reset int32 = 5 const (
var countdown int32 = 0 reset int32 = 5
maxbackoff time.Duration = time.Minute
minbackoff time.Duration = time.Second
)
var (
countdown int32
headCh <-chan []*lapi.HeadChange
backoff time.Duration = minbackoff
err error
)
minutely := time.NewTicker(time.Minute) minutely := time.NewTicker(time.Minute)
headCh, err := api.ChainNotify(ctx)
if err != nil {
healthlog.Warnf("failed to instantiate chain notify channel; liveness cannot be determined. %s", err)
h.SetHealthy(false)
return
}
for { for {
if headCh == nil {
healthlog.Infof("waiting %v before starting ChainNotify channel", backoff)
<-time.After(backoff)
headCh, err = api.ChainNotify(ctx)
if err != nil {
healthlog.Warnf("failed to instantiate ChainNotify channel; cannot determine liveness. %s", err)
h.SetHealthy(false)
nextbackoff := 2 * backoff
if nextbackoff > maxbackoff {
nextbackoff = maxbackoff
}
backoff = nextbackoff
continue
} else {
healthlog.Infof("started ChainNotify channel")
backoff = minbackoff
}
}
select { select {
case <-minutely.C: case <-minutely.C:
atomic.AddInt32(&countdown, -1) atomic.AddInt32(&countdown, -1)
if countdown <= 0 { if countdown <= 0 {
h.SetHealthy(false) h.SetHealthy(false)
} }
case <-headCh: case _, ok := <-headCh:
if !ok { // channel is closed, enter reconnect loop.
h.SetHealthy(false)
headCh = nil
continue
}
atomic.StoreInt32(&countdown, reset) atomic.StoreInt32(&countdown, reset)
h.SetHealthy(true) h.SetHealthy(true)
} }