les: using random request IDs

This commit is contained in:
Zsolt Felfoldi 2016-12-06 06:16:53 +01:00
parent af8a742d00
commit c8130df1d9
3 changed files with 10 additions and 11 deletions

View File

@ -350,7 +350,7 @@ func (f *lightFetcher) request(p *peer, n *fetcherTreeNode, amount uint64) (uint
return 0, false return 0, false
} }
reqID := f.odr.getNextReqID() reqID := getNextReqID()
n.requested = true n.requested = true
cost := p.GetRequestCost(GetBlockHeadersMsg, int(amount)) cost := p.GetRequestCost(GetBlockHeadersMsg, int(amount))
p.fcServer.SendRequest(reqID, cost) p.fcServer.SendRequest(reqID, cost)

View File

@ -338,13 +338,13 @@ func (pm *ProtocolManager) handle(p *peer) error {
glog.V(logger.Debug).Infof("LES: register peer %v", p.id) glog.V(logger.Debug).Infof("LES: register peer %v", p.id)
if pm.lightSync { if pm.lightSync {
requestHeadersByHash := func(origin common.Hash, amount int, skip int, reverse bool) error { requestHeadersByHash := func(origin common.Hash, amount int, skip int, reverse bool) error {
reqID := pm.odr.getNextReqID() reqID := getNextReqID()
cost := p.GetRequestCost(GetBlockHeadersMsg, amount) cost := p.GetRequestCost(GetBlockHeadersMsg, amount)
p.fcServer.SendRequest(reqID, cost) p.fcServer.SendRequest(reqID, cost)
return p.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse) return p.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse)
} }
requestHeadersByNumber := func(origin uint64, amount int, skip int, reverse bool) error { requestHeadersByNumber := func(origin uint64, amount int, skip int, reverse bool) error {
reqID := pm.odr.getNextReqID() reqID := getNextReqID()
cost := p.GetRequestCost(GetBlockHeadersMsg, amount) cost := p.GetRequestCost(GetBlockHeadersMsg, amount)
p.fcServer.SendRequest(reqID, cost) p.fcServer.SendRequest(reqID, cost)
return p.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse) return p.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse)

View File

@ -17,6 +17,8 @@
package les package les
import ( import (
"crypto/rand"
"encoding/binary"
"sync" "sync"
"time" "time"
@ -50,7 +52,6 @@ type LesOdr struct {
mlock, clock sync.Mutex mlock, clock sync.Mutex
sentReqs map[uint64]*sentReq sentReqs map[uint64]*sentReq
serverPool odrPeerSelector serverPool odrPeerSelector
lastReqID uint64
} }
func NewLesOdr(db ethdb.Database) *LesOdr { func NewLesOdr(db ethdb.Database) *LesOdr {
@ -167,7 +168,7 @@ func (self *LesOdr) networkRequest(ctx context.Context, lreq LesOdrRequest) erro
sentTo: make(map[*peer]chan struct{}), sentTo: make(map[*peer]chan struct{}),
answered: answered, // reply delivered by any peer answered: answered, // reply delivered by any peer
} }
reqID := self.getNextReqID() reqID := getNextReqID()
self.mlock.Lock() self.mlock.Lock()
self.sentReqs[reqID] = req self.sentReqs[reqID] = req
self.mlock.Unlock() self.mlock.Unlock()
@ -236,10 +237,8 @@ func (self *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err err
return return
} }
func (self *LesOdr) getNextReqID() uint64 { func getNextReqID() uint64 {
self.clock.Lock() var rnd [8]byte
defer self.clock.Unlock() rand.Read(rnd[:])
return binary.BigEndian.Uint64(rnd[:])
self.lastReqID++
return self.lastReqID
} }