aboutsummaryrefslogtreecommitdiffstats
path: root/eth/downloader/peer.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-04-13 22:38:32 +0800
committerobscuren <geffobscura@gmail.com>2015-04-13 22:38:32 +0800
commita8a2b2a488f7433abc09c51b751556875c9107a9 (patch)
tree86536fc432ddf85ca2f9de0a4b1895c3bee8715b /eth/downloader/peer.go
parent7dcb9825c3a3afe1a287ad544a5ad0500c0027a7 (diff)
downloadgo-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.gz
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.bz2
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.lz
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.xz
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.zst
go-tangerine-a8a2b2a488f7433abc09c51b751556875c9107a9.zip
downloader: added missing blocks catchup functionality
When a parent is missing in the block list an attempt should be made to fetch the missing parent and grandparents.
Diffstat (limited to 'eth/downloader/peer.go')
-rw-r--r--eth/downloader/peer.go44
1 files changed, 43 insertions, 1 deletions
diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go
index 318da59b7..f66e5afd8 100644
--- a/eth/downloader/peer.go
+++ b/eth/downloader/peer.go
@@ -13,9 +13,51 @@ const (
idleState = 4
)
+type hashFetcherFn func(common.Hash) error
+type blockFetcherFn func([]common.Hash) error
+
+// XXX make threadsafe!!!!
+type peers map[string]*peer
+
+func (p peers) get(state int) []*peer {
+ var peers []*peer
+ for _, peer := range p {
+ peer.mu.RLock()
+ if peer.state == state {
+ peers = append(peers, peer)
+ }
+ peer.mu.RUnlock()
+ }
+
+ return peers
+}
+
+func (p peers) setState(id string, state int) {
+ if peer, exist := p[id]; exist {
+ peer.mu.Lock()
+ defer peer.mu.Unlock()
+ peer.state = state
+ }
+}
+
+func (p peers) getPeer(id string) *peer {
+ return p[id]
+}
+
+func (p peers) bestPeer() *peer {
+ var peer *peer
+ for _, cp := range p {
+ if peer == nil || cp.td.Cmp(peer.td) > 0 {
+ peer = cp
+ }
+ }
+ return peer
+}
+
// peer represents an active peer
type peer struct {
- state int
+ state int // Peer state (working, idle)
+ rep int // TODO peer reputation
mu sync.RWMutex
id string