diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-13 22:38:32 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-13 22:38:32 +0800 |
commit | a8a2b2a488f7433abc09c51b751556875c9107a9 (patch) | |
tree | 86536fc432ddf85ca2f9de0a4b1895c3bee8715b /eth/downloader/peer.go | |
parent | 7dcb9825c3a3afe1a287ad544a5ad0500c0027a7 (diff) | |
download | dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.gz dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.bz2 dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.lz dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.xz dexon-a8a2b2a488f7433abc09c51b751556875c9107a9.tar.zst dexon-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.go | 44 |
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 |