瀏覽代碼

[R4R] fix: graceful shutdown bug (#509)

* fix: graceful shutdown bug that diff handshake failure caused waitDiffExtension can't receive exit signal

* fix: add lock for peerset
SolidityGo 4 年之前
父節點
當前提交
176407ae5f
共有 1 個文件被更改,包括 12 次插入0 次删除
  1. 12 0
      eth/handler_diff.go

+ 12 - 0
eth/handler_diff.go

@@ -33,6 +33,18 @@ func (h *diffHandler) Chain() *core.BlockChain { return h.chain }
 // RunPeer is invoked when a peer joins on the `diff` protocol.
 func (h *diffHandler) RunPeer(peer *diff.Peer, hand diff.Handler) error {
 	if err := peer.Handshake(h.diffSync); err != nil {
+		// ensure that waitDiffExtension receives the exit signal normally
+		// otherwise, can't graceful shutdown
+		ps := h.peers
+		id := peer.ID()
+
+		// Ensure nobody can double connect
+		ps.lock.Lock()
+		if wait, ok := ps.diffWait[id]; ok {
+			delete(ps.diffWait, id)
+			wait <- peer
+		}
+		ps.lock.Unlock()
 		return err
 	}
 	defer h.chain.RemoveDiffPeer(peer.ID())