|
@ -11,11 +11,25 @@ import ( |
|
|
"github.com/tendermint/tmlibs/log" |
|
|
"github.com/tendermint/tmlibs/log" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
|
|
|
|
|
|
eg, L = latency = 0.1s |
|
|
|
|
|
P = num peers = 10 |
|
|
|
|
|
FN = num full nodes |
|
|
|
|
|
BS = 1kB block size |
|
|
|
|
|
CB = 1 Mbit/s = 128 kB/s |
|
|
|
|
|
CB/P = 12.8 kB |
|
|
|
|
|
B/S = CB/P/BS = 12.8 blocks/s |
|
|
|
|
|
|
|
|
|
|
|
12.8 * 0.1 = 1.28 blocks on conn |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
const ( |
|
|
const ( |
|
|
requestIntervalMS = 250 |
|
|
requestIntervalMS = 250 |
|
|
maxTotalRequesters = 300 |
|
|
maxTotalRequesters = 300 |
|
|
maxPendingRequests = maxTotalRequesters |
|
|
maxPendingRequests = maxTotalRequesters |
|
|
maxPendingRequestsPerPeer = 75 |
|
|
|
|
|
|
|
|
maxPendingRequestsPerPeer = 10 |
|
|
minRecvRate = 10240 // 10Kb/s
|
|
|
minRecvRate = 10240 // 10Kb/s
|
|
|
) |
|
|
) |
|
|
|
|
|
|
|
@ -186,15 +200,16 @@ func (pool *BlockPool) PopRequest() { |
|
|
// Remove the peer and redo request from others.
|
|
|
// Remove the peer and redo request from others.
|
|
|
func (pool *BlockPool) RedoRequest(height int) { |
|
|
func (pool *BlockPool) RedoRequest(height int) { |
|
|
pool.mtx.Lock() |
|
|
pool.mtx.Lock() |
|
|
|
|
|
defer pool.mtx.Unlock() |
|
|
|
|
|
|
|
|
request := pool.requesters[height] |
|
|
request := pool.requesters[height] |
|
|
pool.mtx.Unlock() |
|
|
|
|
|
|
|
|
|
|
|
if request.block == nil { |
|
|
if request.block == nil { |
|
|
cmn.PanicSanity("Expected block to be non-nil") |
|
|
cmn.PanicSanity("Expected block to be non-nil") |
|
|
} |
|
|
} |
|
|
// RemovePeer will redo all requesters associated with this peer.
|
|
|
// RemovePeer will redo all requesters associated with this peer.
|
|
|
// TODO: record this malfeasance
|
|
|
// TODO: record this malfeasance
|
|
|
pool.RemovePeer(request.peerID) |
|
|
|
|
|
|
|
|
pool.removePeer(request.peerID) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// TODO: ensure that blocks come in order for each peer.
|
|
|
// TODO: ensure that blocks come in order for each peer.
|
|
@ -204,6 +219,8 @@ func (pool *BlockPool) AddBlock(peerID string, block *types.Block, blockSize int |
|
|
|
|
|
|
|
|
requester := pool.requesters[block.Height] |
|
|
requester := pool.requesters[block.Height] |
|
|
if requester == nil { |
|
|
if requester == nil { |
|
|
|
|
|
// a block we didn't expect.
|
|
|
|
|
|
// TODO:if height is too far ahead, punish peer
|
|
|
return |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|