Commit 20537801 authored by obscuren's avatar obscuren

downloader: added demotion / promotion in prep. for rep. system

parent eda10c73
...@@ -245,6 +245,7 @@ out: ...@@ -245,6 +245,7 @@ out:
for { for {
select { select {
case blockPack := <-d.blockCh: case blockPack := <-d.blockCh:
d.peers[blockPack.peerId].promote()
d.queue.deliver(blockPack.peerId, blockPack.blocks) d.queue.deliver(blockPack.peerId, blockPack.blocks)
d.peers.setState(blockPack.peerId, idleState) d.peers.setState(blockPack.peerId, idleState)
case <-ticker.C: case <-ticker.C:
...@@ -310,6 +311,9 @@ out: ...@@ -310,6 +311,9 @@ out:
// 2) Measure their speed; // 2) Measure their speed;
// 3) Amount and availability. // 3) Amount and availability.
d.queue.deliver(pid, nil) d.queue.deliver(pid, nil)
if peer := p.peers[pid]; peer != nil {
peer.demote()
}
} }
} }
...@@ -343,6 +347,7 @@ func (d *Downloader) AddBlock(id string, block *types.Block, td *big.Int) { ...@@ -343,6 +347,7 @@ func (d *Downloader) AddBlock(id string, block *types.Block, td *big.Int) {
peer.td = td peer.td = td
peer.recentHash = block.Hash() peer.recentHash = block.Hash()
peer.mu.Unlock() peer.mu.Unlock()
peer.promote()
glog.V(logger.Detail).Infoln("Inserting new block from:", id) glog.V(logger.Detail).Infoln("Inserting new block from:", id)
d.queue.addBlock(id, block, td) d.queue.addBlock(id, block, td)
......
...@@ -95,3 +95,23 @@ func (p *peer) fetch(chunk *chunk) error { ...@@ -95,3 +95,23 @@ func (p *peer) fetch(chunk *chunk) error {
return nil return nil
} }
// promote increases the peer's reputation
func (p *peer) promote() {
p.mu.Lock()
defer p.mu.Unlock()
p.rep++
}
// demote decreases the peer's reputation or leaves it at 0
func (p *peer) demote() {
p.mu.Lock()
defer p.mu.Unlock()
if p.rep > 1 {
p.rep -= 2
} else {
p.rep = 0
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment