abb4da9cbd
[peermgr] - Add request cache with tests - Add requestCache to peermgr - refactored peer manager tests - Added blockInfo struct, to allow sorting on the blockIndex - added helper methods for cache, pickItem, pickFirstItem, removeHash, findHash and refactored tests - renamed requestcache to blockcache - refactored peer manager to use block cache for block requests *only* - added blockCallPeer function to handle block requests only - refactored onDisconnect to add back any pending peer requests that the disconnected peer did not complete into the peer manager queue [peermgr/server] - Modify onBlock handler in server, to send peermgr a BlockInfo struct [peermgr/syncmgr/server] - Modified blockIndex in BlockInfo to be uint32 and not uint64 - RequestBlocks in syncmgr now takes an index along with the hash - modified syncmgr code to pass index along with hash in all methods
42 lines
1.4 KiB
Go
42 lines
1.4 KiB
Go
package syncmgr
|
|
|
|
import (
|
|
"github.com/CityOfZion/neo-go/pkg/chain"
|
|
"github.com/CityOfZion/neo-go/pkg/wire/payload"
|
|
)
|
|
|
|
// headersModeOnHeaders is called when the sync manager is headers mode
|
|
// and receives a header.
|
|
func (s *Syncmgr) headersModeOnHeaders(peer SyncPeer, hdrs []*payload.BlockBase) error {
|
|
// If we are in Headers mode, then we just need to process the headers
|
|
// Note: For the un-optimised version, we move straight to blocksOnly mode
|
|
|
|
firstHash := hdrs[0].Hash
|
|
firstHdrIndex := hdrs[0].Index
|
|
|
|
err := s.cfg.ProcessHeaders(hdrs)
|
|
if err == nil {
|
|
// Update syncmgr last header
|
|
s.headerHash = hdrs[len(hdrs)-1].Hash
|
|
|
|
s.syncmode = blockMode
|
|
return s.cfg.RequestBlock(firstHash, firstHdrIndex)
|
|
}
|
|
|
|
// Check whether it is a validation error, or a database error
|
|
if _, ok := err.(*chain.ValidationError); ok {
|
|
// If we get a validation error we re-request the headers
|
|
// the method will automatically fetch from a different peer
|
|
// XXX: Add increment banScore for this peer
|
|
return s.cfg.FetchHeadersAgain(firstHash)
|
|
}
|
|
// This means it is a database error. We have no way to recover from this.
|
|
panic(err.Error())
|
|
}
|
|
|
|
// headersModeOnBlock is called when the sync manager is headers mode
|
|
// and receives a block.
|
|
func (s *Syncmgr) headersModeOnBlock(peer SyncPeer, block payload.Block) error {
|
|
// While in headers mode, ignore any blocks received
|
|
return nil
|
|
}
|