|
|
@@ -252,6 +252,7 @@ type streamReader struct {
|
|
|
errorc chan<- error
|
|
|
|
|
|
mu sync.Mutex
|
|
|
+ paused bool
|
|
|
cancel func()
|
|
|
closer io.Closer
|
|
|
stopc chan struct{}
|
|
|
@@ -331,6 +332,14 @@ func (cr *streamReader) decodeLoop(rc io.ReadCloser, t streamType) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+ cr.mu.Lock()
|
|
|
+ paused := cr.paused
|
|
|
+ cr.mu.Unlock()
|
|
|
+
|
|
|
+ if paused {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
if isLinkHeartbeatMessage(m) {
|
|
|
// raft is not interested in link layer
|
|
|
// heartbeat message, so we should ignore
|
|
|
@@ -463,6 +472,18 @@ func (cr *streamReader) close() {
|
|
|
cr.closer = nil
|
|
|
}
|
|
|
|
|
|
+func (cr *streamReader) pause() {
|
|
|
+ cr.mu.Lock()
|
|
|
+ defer cr.mu.Unlock()
|
|
|
+ cr.paused = true
|
|
|
+}
|
|
|
+
|
|
|
+func (cr *streamReader) resume() {
|
|
|
+ cr.mu.Lock()
|
|
|
+ defer cr.mu.Unlock()
|
|
|
+ cr.paused = false
|
|
|
+}
|
|
|
+
|
|
|
func isClosedConnectionError(err error) bool {
|
|
|
operr, ok := err.(*net.OpError)
|
|
|
return ok && operr.Err.Error() == "use of closed network connection"
|