From d1fa44e8166351e981363b163beb6a21dd2db842 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 7 Feb 2018 13:22:41 +0400 Subject: [PATCH 1/4] improve "curRate too low" message Refs #1177 Note on labels: KB - 1024 kB - 1000 https://ux.stackexchange.com/questions/13815/files-size-units-kib-vs-kb-vs-kb --- blockchain/pool.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/blockchain/pool.go b/blockchain/pool.go index bb589684b..63f4a2d32 100644 --- a/blockchain/pool.go +++ b/blockchain/pool.go @@ -1,6 +1,7 @@ package blockchain import ( + "fmt" "math" "sync" "time" @@ -30,7 +31,11 @@ const ( maxTotalRequesters = 1000 maxPendingRequests = maxTotalRequesters maxPendingRequestsPerPeer = 50 - minRecvRate = 10240 // 10Kb/s + + // Minimum recv rate to ensure we're receiving blocks from a peer fast + // enough. If a peer is not sending us data at at least that rate, we + // consider them to have timedout and we disconnect. + minRecvRate = 10240 // 10 KB/s ) var peerTimeoutSeconds = time.Duration(15) // not const so we can override with tests @@ -88,7 +93,6 @@ func (pool *BlockPool) OnStop() {} // Run spawns requesters as needed. func (pool *BlockPool) makeRequestersRoutine() { - for { if !pool.IsRunning() { break @@ -122,7 +126,10 @@ func (pool *BlockPool) removeTimedoutPeers() { // XXX remove curRate != 0 if curRate != 0 && curRate < minRecvRate { pool.sendTimeout(peer.id) - pool.Logger.Error("SendTimeout", "peer", peer.id, "reason", "curRate too low") + pool.Logger.Error("SendTimeout", "peer", peer.id, + "reason", "peer is not sending us data fast enough", + "curRate", fmt.Sprintf("%d KB/s", curRate/1024), + "minRate", fmt.Sprintf("%d KB/s", minRecvRate/1024)) peer.didTimeout = true } } From b0a55882b2c2c8c6ab62f3c672827ed431f16597 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 7 Feb 2018 21:15:39 +0400 Subject: [PATCH 2/4] lower the minRecvRate See https://github.com/tendermint/tendermint/issues/1177#issuecomment-363720118 --- blockchain/pool.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blockchain/pool.go b/blockchain/pool.go index 63f4a2d32..95956757c 100644 --- a/blockchain/pool.go +++ b/blockchain/pool.go @@ -35,7 +35,10 @@ const ( // Minimum recv rate to ensure we're receiving blocks from a peer fast // enough. If a peer is not sending us data at at least that rate, we // consider them to have timedout and we disconnect. - minRecvRate = 10240 // 10 KB/s + // + // Assuming a DSL connection (not a good choice) 128 Kbps (upload) ~ 15 KB/s, + // sending data across atlantic ~ 7.5 KB/s. + minRecvRate = 7680 ) var peerTimeoutSeconds = time.Duration(15) // not const so we can override with tests From c8990d06d940e774912ea0038600fff145ae8809 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 7 Feb 2018 21:22:24 +0400 Subject: [PATCH 3/4] remove curRate != 0 --- blockchain/pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockchain/pool.go b/blockchain/pool.go index 95956757c..110c5735c 100644 --- a/blockchain/pool.go +++ b/blockchain/pool.go @@ -127,7 +127,7 @@ func (pool *BlockPool) removeTimedoutPeers() { if !peer.didTimeout && peer.numPending > 0 { curRate := peer.recvMonitor.Status().CurRate // XXX remove curRate != 0 - if curRate != 0 && curRate < minRecvRate { + if curRate < minRecvRate { pool.sendTimeout(peer.id) pool.Logger.Error("SendTimeout", "peer", peer.id, "reason", "peer is not sending us data fast enough", From 0c1b91b7622356d2d276955554c6e25fa9a8477c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 9 Feb 2018 13:02:44 +0400 Subject: [PATCH 4/4] revert back curRate != 0 --- blockchain/pool.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockchain/pool.go b/blockchain/pool.go index 110c5735c..6b40a8e73 100644 --- a/blockchain/pool.go +++ b/blockchain/pool.go @@ -126,8 +126,8 @@ func (pool *BlockPool) removeTimedoutPeers() { for _, peer := range pool.peers { if !peer.didTimeout && peer.numPending > 0 { curRate := peer.recvMonitor.Status().CurRate - // XXX remove curRate != 0 - if curRate < minRecvRate { + // curRate can be 0 on start + if curRate != 0 && curRate < minRecvRate { pool.sendTimeout(peer.id) pool.Logger.Error("SendTimeout", "peer", peer.id, "reason", "peer is not sending us data fast enough",