@@ -24,10 +24,8 @@ import (
2424 "math/big"
2525 "net"
2626 "sync"
27- "time"
2827
2928 "github.com/ethereum/go-ethereum/common"
30- "github.com/ethereum/go-ethereum/common/mclock"
3129 "github.com/ethereum/go-ethereum/core"
3230 "github.com/ethereum/go-ethereum/core/state"
3331 "github.com/ethereum/go-ethereum/core/types"
@@ -60,7 +58,7 @@ const (
6058 MaxHeaderProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request
6159 MaxTxSend = 64 // Amount of transactions to be send per request
6260
63- disableClientRemovePeer = true
61+ disableClientRemovePeer = false
6462)
6563
6664// errIncompatibleConfig is returned if the requested protocols and configs are
@@ -157,44 +155,27 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, network
157155 Length : ProtocolLengths [i ],
158156 Run : func (p * p2p.Peer , rw p2p.MsgReadWriter ) error {
159157 var entry * poolEntry
158+ peer := manager .newPeer (int (version ), networkId , p , rw )
160159 if manager .serverPool != nil {
161160 addr := p .RemoteAddr ().(* net.TCPAddr )
162- entry = manager .serverPool .connect (p . ID () , addr .IP , uint16 (addr .Port ))
161+ entry = manager .serverPool .connect (peer , addr .IP , uint16 (addr .Port ))
163162 if entry == nil {
164163 return fmt .Errorf ("unwanted connection" )
165164 }
166165 }
167- peer := manager .newPeer (int (version ), networkId , p , rw )
168166 peer .poolEntry = entry
169167 select {
170168 case manager .newPeerCh <- peer :
171169 manager .wg .Add (1 )
172170 defer manager .wg .Done ()
173- start := mclock .Now ()
174171 err := manager .handle (peer )
175172 if entry != nil {
176- connTime := time .Duration (mclock .Now () - start )
177- stopped := false
178- select {
179- case <- manager .quitSync :
180- stopped = true
181- default :
182- }
183- //fmt.Println("connTime", peer.id, connTime, stopped, err)
184- quality := float64 (1 )
185- setQuality := true
186- if connTime < time .Minute * 10 {
187- quality = 0
188- if stopped {
189- setQuality = false
190- }
191- }
192- manager .serverPool .disconnect (entry , quality , setQuality )
173+ manager .serverPool .disconnect (entry )
193174 }
194175 return err
195176 case <- manager .quitSync :
196177 if entry != nil {
197- manager .serverPool .disconnect (entry , 0 , false )
178+ manager .serverPool .disconnect (entry )
198179 }
199180 return p2p .DiscQuitting
200181 }
@@ -224,7 +205,6 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, network
224205 manager .downloader = downloader .New (downloader .LightSync , chainDb , manager .eventMux , blockchain .HasHeader , nil , blockchain .GetHeaderByHash ,
225206 nil , blockchain .CurrentHeader , nil , nil , nil , blockchain .GetTdByHash ,
226207 blockchain .InsertHeaderChain , nil , nil , blockchain .Rollback , removePeer )
227- manager .fetcher = newLightFetcher (manager )
228208 }
229209
230210 if odr != nil {
@@ -254,10 +234,12 @@ func (pm *ProtocolManager) removePeer(id string) {
254234 glog .V (logger .Debug ).Infof ("LES: unregister peer %v" , id )
255235 if pm .lightSync {
256236 pm .downloader .UnregisterPeer (id )
257- pm .odr .UnregisterPeer (peer )
258237 if pm .txrelay != nil {
259238 pm .txrelay .removePeer (id )
260239 }
240+ if pm .fetcher != nil {
241+ pm .fetcher .removePeer (peer )
242+ }
261243 }
262244 if err := pm .peers .Unregister (id ); err != nil {
263245 glog .V (logger .Error ).Infoln ("Removal failed:" , err )
@@ -276,8 +258,10 @@ func (pm *ProtocolManager) Start(srvr *p2p.Server) {
276258 lesTopic := discv5 .Topic ("LES@" + common .Bytes2Hex (pm .blockchain .Genesis ().Hash ().Bytes ()[0 :8 ]))
277259 if pm .lightSync {
278260 // start sync handler
279- if srvr != nil {
261+ if srvr != nil { // srvr is nil during testing
280262 pm .serverPool = newServerPool (pm .chainDb , []byte ("serverPool/" ), srvr , lesTopic , pm .quitSync , & pm .wg )
263+ pm .odr .serverPool = pm .serverPool
264+ pm .fetcher = newLightFetcher (pm )
281265 }
282266 go pm .syncer ()
283267 } else {
@@ -369,12 +353,17 @@ func (pm *ProtocolManager) handle(p *peer) error {
369353 requestHeadersByHash , requestHeadersByNumber , nil , nil , nil ); err != nil {
370354 return err
371355 }
372- pm .odr .RegisterPeer (p )
373356 if pm .txrelay != nil {
374357 pm .txrelay .addPeer (p )
375358 }
376359
377- pm .fetcher .notify (p , nil )
360+ p .lock .Lock ()
361+ head := p .headInfo
362+ p .lock .Unlock ()
363+ if pm .fetcher != nil {
364+ pm .fetcher .addPeer (p )
365+ pm .fetcher .announce (p , head )
366+ }
378367
379368 if p .poolEntry != nil {
380369 pm .serverPool .registered (p .poolEntry )
@@ -460,7 +449,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
460449 return errResp (ErrDecode , "%v: %v" , msg , err )
461450 }
462451 glog .V (logger .Detail ).Infoln ("AnnounceMsg:" , req .Number , req .Hash , req .Td , req .ReorgDepth )
463- pm .fetcher .notify (p , & req )
452+ if pm .fetcher != nil {
453+ go pm .fetcher .announce (p , & req )
454+ }
464455
465456 case GetBlockHeadersMsg :
466457 glog .V (logger .Debug ).Infof ("<=== GetBlockHeadersMsg from peer %v" , p .id )
@@ -558,7 +549,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
558549 return errResp (ErrDecode , "msg %v: %v" , msg , err )
559550 }
560551 p .fcServer .GotReply (resp .ReqID , resp .BV )
561- if pm .fetcher .requestedID (resp .ReqID ) {
552+ if pm .fetcher != nil && pm . fetcher .requestedID (resp .ReqID ) {
562553 pm .fetcher .deliverHeaders (p , resp .ReqID , resp .Headers )
563554 } else {
564555 err := pm .downloader .DeliverHeaders (p .id , resp .Headers )
0 commit comments