Remove printf, improve hueristic

License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
Jakub Sztandera 2019-12-08 20:32:34 +01:00
parent 9814d53460
commit 09d082b30e
No known key found for this signature in database
GPG Key ID: 9A9AF56F8B3879BA

View File

@ -164,8 +164,6 @@ func (bs *BlockSync) GetChainMessages(ctx context.Context, h *types.TipSet, coun
defer span.End() defer span.End()
peers := bs.getPeers() peers := bs.getPeers()
fmt.Println("BEST PEER: ", bs.syncPeers.peers[peers[0]])
// randomize the first few peers so we don't always pick the same peer // randomize the first few peers so we don't always pick the same peer
shufflePrefix(peers) shufflePrefix(peers)
@ -389,8 +387,6 @@ type peerStats struct {
averageTime time.Duration averageTime time.Duration
} }
const alpha = 20
type bsPeerTracker struct { type bsPeerTracker struct {
lk sync.Mutex lk sync.Mutex
@ -416,6 +412,12 @@ func (bpt *bsPeerTracker) addPeer(p peer.ID) {
} }
const (
// newPeerMul is how much better than average is the new peer assumed to be
// less than one to encourouge trying new peers
newPeerMul = 0.9
)
func (bpt *bsPeerTracker) prefSortedPeers() []peer.ID { func (bpt *bsPeerTracker) prefSortedPeers() []peer.ID {
// TODO: this could probably be cached, but as long as its not too many peers, fine for now // TODO: this could probably be cached, but as long as its not too many peers, fine for now
bpt.lk.Lock() bpt.lk.Lock()
@ -439,14 +441,14 @@ func (bpt *bsPeerTracker) prefSortedPeers() []peer.ID {
} else { } else {
// we know nothing about this peer // we know nothing about this peer
// make them bit better than average // make them bit better than average
costI = float64(bpt.avgGlobalTime) * 0.8 costI = 0.9 * float64(bpt.avgGlobalTime)
} }
if pj.successes+pj.failures > 0 { if pj.successes+pj.failures > 0 {
failRateJ := float64(pj.failures) / float64(pj.failures+pj.successes) failRateJ := float64(pj.failures) / float64(pj.failures+pj.successes)
costJ = float64(pj.averageTime) + failRateJ*float64(bpt.avgGlobalTime) costJ = float64(pj.averageTime) + failRateJ*float64(bpt.avgGlobalTime)
} else { } else {
costJ = float64(bpt.avgGlobalTime) * 0.8 costJ = 0.9 * float64(bpt.avgGlobalTime)
} }
return costI < costJ return costI < costJ
@ -455,26 +457,46 @@ func (bpt *bsPeerTracker) prefSortedPeers() []peer.ID {
return out return out
} }
const (
// xInvAlpha = (N+1)/2
localInvAlpha = 5 // 86% of the value is the last 9
globalInvAlpha = 20 // 86% of the value is the last 39
)
func (bpt *bsPeerTracker) logGlobalSuccess(dur time.Duration) { func (bpt *bsPeerTracker) logGlobalSuccess(dur time.Duration) {
bpt.lk.Lock() bpt.lk.Lock()
defer bpt.lk.Unlock() defer bpt.lk.Unlock()
delta := (dur - bpt.avgGlobalTime) / alpha if bpt.avgGlobalTime == 0 {
bpt.avgGlobalTime = dur
return
}
delta := (dur - bpt.avgGlobalTime) / globalInvAlpha
bpt.avgGlobalTime += delta bpt.avgGlobalTime += delta
} }
func logTime(pi *peerStats, dur time.Duration) {
if pi.averageTime == 0 {
pi.averageTime = dur
return
}
delta := (dur - pi.averageTime) / localInvAlpha
pi.averageTime += delta
}
func (bpt *bsPeerTracker) logSuccess(p peer.ID, dur time.Duration) { func (bpt *bsPeerTracker) logSuccess(p peer.ID, dur time.Duration) {
bpt.lk.Lock() bpt.lk.Lock()
defer bpt.lk.Unlock() defer bpt.lk.Unlock()
if pi, ok := bpt.peers[p]; !ok { if pi, ok := bpt.peers[p]; !ok {
log.Warn("log success called on peer not in tracker") log.Warnw("log success called on peer not in tracker", "peerid", p.String())
return return
} else { } else {
pi.successes++ pi.successes++
delta := (dur - pi.averageTime) / alpha logTime(pi, dur)
pi.averageTime += delta
} }
} }
@ -482,13 +504,11 @@ func (bpt *bsPeerTracker) logFailure(p peer.ID, dur time.Duration) {
bpt.lk.Lock() bpt.lk.Lock()
defer bpt.lk.Unlock() defer bpt.lk.Unlock()
if pi, ok := bpt.peers[p]; !ok { if pi, ok := bpt.peers[p]; !ok {
log.Warn("log failure called on peer not in tracker") log.Warn("log failure called on peer not in tracker", "peerid", p.String())
return return
} else { } else {
pi.failures++ pi.failures++
logTime(pi, dur)
delta := (dur - pi.averageTime) / alpha
pi.averageTime += delta
} }
} }