backoff/reconnect loop
This commit is contained in:
parent
2b0d0ce224
commit
d2299dfbf8
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user