chain/rpc: remove unnecessary ping keep alive

In this commit, we remove the keep-alive logic within the handler of the
RPCClient struct as this logic already exists within the backing
rpclient.Client instance. In this case, we'd completely stop the
connection after the ping timeout (1 min), which would render the
reconnection logic within rpcclient.Client useless.
This commit is contained in:
Wilmer Paulino 2018-08-27 17:24:00 -07:00
parent 7b84dc25a6
commit d179c276b4
No known key found for this signature in database
GPG key ID: 6DF57B9F9514972F

View file

@ -386,8 +386,6 @@ func (c *RPCClient) handler() {
enqueue := c.enqueueNotification enqueue := c.enqueueNotification
var dequeue chan interface{} var dequeue chan interface{}
var next interface{} var next interface{}
pingChan := time.After(time.Minute)
pingChanReset := make(chan (<-chan time.Time))
out: out:
for { for {
select { select {
@ -407,7 +405,6 @@ out:
dequeue = c.dequeueNotification dequeue = c.dequeueNotification
} }
notifications = append(notifications, n) notifications = append(notifications, n)
pingChan = time.After(time.Minute)
case dequeue <- next: case dequeue <- next:
if n, ok := next.(BlockConnected); ok { if n, ok := next.(BlockConnected); ok {
@ -430,47 +427,6 @@ out:
dequeue = nil dequeue = nil
} }
case <-pingChan:
// No notifications were received in the last 60s. Ensure the
// connection is still active by making a new request to the server.
//
// This MUST wait for the response in a new goroutine so as to not
// block channel sends enqueueing more notifications. Doing so
// would cause a deadlock and after the timeout expires, the client
// would be shut down.
//
// TODO: A minute timeout is used to prevent the handler loop from
// blocking here forever, but this is much larger than it needs to
// be due to dcrd processing websocket requests synchronously (see
// https://github.com/btcsuite/btcd/issues/504). Decrease this to
// something saner like 3s when the above issue is fixed.
type sessionResult struct {
err error
}
sessionResponse := make(chan sessionResult, 1)
go func() {
_, err := c.Session()
sessionResponse <- sessionResult{err}
}()
go func() {
select {
case resp := <-sessionResponse:
if resp.err != nil {
log.Errorf("Failed to receive session "+
"result: %v", resp.err)
c.Stop()
}
pingChanReset <- time.After(time.Minute)
case <-time.After(time.Minute):
log.Errorf("Timeout waiting for session RPC")
c.Stop()
}
}()
case ch := <-pingChanReset:
pingChan = ch
case c.currentBlock <- bs: case c.currentBlock <- bs:
case <-c.quit: case <-c.quit: