@@ -24,10 +24,8 @@ import (
24
24
"math/big"
25
25
"net"
26
26
"sync"
27
- "time"
28
27
29
28
"github.com/ethereum/go-ethereum/common"
30
- "github.com/ethereum/go-ethereum/common/mclock"
31
29
"github.com/ethereum/go-ethereum/core"
32
30
"github.com/ethereum/go-ethereum/core/state"
33
31
"github.com/ethereum/go-ethereum/core/types"
@@ -60,7 +58,7 @@ const (
60
58
MaxHeaderProofsFetch = 64 // Amount of merkle proofs to be fetched per retrieval request
61
59
MaxTxSend = 64 // Amount of transactions to be send per request
62
60
63
- disableClientRemovePeer = true
61
+ disableClientRemovePeer = false
64
62
)
65
63
66
64
// errIncompatibleConfig is returned if the requested protocols and configs are
@@ -157,44 +155,27 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, network
157
155
Length : ProtocolLengths [i ],
158
156
Run : func (p * p2p.Peer , rw p2p.MsgReadWriter ) error {
159
157
var entry * poolEntry
158
+ peer := manager .newPeer (int (version ), networkId , p , rw )
160
159
if manager .serverPool != nil {
161
160
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 ))
163
162
if entry == nil {
164
163
return fmt .Errorf ("unwanted connection" )
165
164
}
166
165
}
167
- peer := manager .newPeer (int (version ), networkId , p , rw )
168
166
peer .poolEntry = entry
169
167
select {
170
168
case manager .newPeerCh <- peer :
171
169
manager .wg .Add (1 )
172
170
defer manager .wg .Done ()
173
- start := mclock .Now ()
174
171
err := manager .handle (peer )
175
172
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 )
193
174
}
194
175
return err
195
176
case <- manager .quitSync :
196
177
if entry != nil {
197
- manager .serverPool .disconnect (entry , 0 , false )
178
+ manager .serverPool .disconnect (entry )
198
179
}
199
180
return p2p .DiscQuitting
200
181
}
@@ -224,7 +205,6 @@ func NewProtocolManager(chainConfig *params.ChainConfig, lightSync bool, network
224
205
manager .downloader = downloader .New (downloader .LightSync , chainDb , manager .eventMux , blockchain .HasHeader , nil , blockchain .GetHeaderByHash ,
225
206
nil , blockchain .CurrentHeader , nil , nil , nil , blockchain .GetTdByHash ,
226
207
blockchain .InsertHeaderChain , nil , nil , blockchain .Rollback , removePeer )
227
- manager .fetcher = newLightFetcher (manager )
228
208
}
229
209
230
210
if odr != nil {
@@ -254,10 +234,12 @@ func (pm *ProtocolManager) removePeer(id string) {
254
234
glog .V (logger .Debug ).Infof ("LES: unregister peer %v" , id )
255
235
if pm .lightSync {
256
236
pm .downloader .UnregisterPeer (id )
257
- pm .odr .UnregisterPeer (peer )
258
237
if pm .txrelay != nil {
259
238
pm .txrelay .removePeer (id )
260
239
}
240
+ if pm .fetcher != nil {
241
+ pm .fetcher .removePeer (peer )
242
+ }
261
243
}
262
244
if err := pm .peers .Unregister (id ); err != nil {
263
245
glog .V (logger .Error ).Infoln ("Removal failed:" , err )
@@ -276,8 +258,10 @@ func (pm *ProtocolManager) Start(srvr *p2p.Server) {
276
258
lesTopic := discv5 .Topic ("LES@" + common .Bytes2Hex (pm .blockchain .Genesis ().Hash ().Bytes ()[0 :8 ]))
277
259
if pm .lightSync {
278
260
// start sync handler
279
- if srvr != nil {
261
+ if srvr != nil { // srvr is nil during testing
280
262
pm .serverPool = newServerPool (pm .chainDb , []byte ("serverPool/" ), srvr , lesTopic , pm .quitSync , & pm .wg )
263
+ pm .odr .serverPool = pm .serverPool
264
+ pm .fetcher = newLightFetcher (pm )
281
265
}
282
266
go pm .syncer ()
283
267
} else {
@@ -369,12 +353,17 @@ func (pm *ProtocolManager) handle(p *peer) error {
369
353
requestHeadersByHash , requestHeadersByNumber , nil , nil , nil ); err != nil {
370
354
return err
371
355
}
372
- pm .odr .RegisterPeer (p )
373
356
if pm .txrelay != nil {
374
357
pm .txrelay .addPeer (p )
375
358
}
376
359
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
+ }
378
367
379
368
if p .poolEntry != nil {
380
369
pm .serverPool .registered (p .poolEntry )
@@ -460,7 +449,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
460
449
return errResp (ErrDecode , "%v: %v" , msg , err )
461
450
}
462
451
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
+ }
464
455
465
456
case GetBlockHeadersMsg :
466
457
glog .V (logger .Debug ).Infof ("<=== GetBlockHeadersMsg from peer %v" , p .id )
@@ -558,7 +549,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
558
549
return errResp (ErrDecode , "msg %v: %v" , msg , err )
559
550
}
560
551
p .fcServer .GotReply (resp .ReqID , resp .BV )
561
- if pm .fetcher .requestedID (resp .ReqID ) {
552
+ if pm .fetcher != nil && pm . fetcher .requestedID (resp .ReqID ) {
562
553
pm .fetcher .deliverHeaders (p , resp .ReqID , resp .Headers )
563
554
} else {
564
555
err := pm .downloader .DeliverHeaders (p .id , resp .Headers )
0 commit comments