Skip to content

Commit 4fabd9c

Browse files
authored
les: separate peer into clientPeer and serverPeer (#19991)
* les: separate peer into clientPeer and serverPeer * les: address comments
1 parent fadf84a commit 4fabd9c

25 files changed

+1210
-1088
lines changed

les/benchmark.go

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type requestBenchmark interface {
4242
// init initializes the generator for generating the given number of randomized requests
4343
init(h *serverHandler, count int) error
4444
// request initiates sending a single request to the given peer
45-
request(peer *peer, index int) error
45+
request(peer *serverPeer, index int) error
4646
}
4747

4848
// benchmarkBlockHeaders implements requestBenchmark
@@ -72,11 +72,11 @@ func (b *benchmarkBlockHeaders) init(h *serverHandler, count int) error {
7272
return nil
7373
}
7474

75-
func (b *benchmarkBlockHeaders) request(peer *peer, index int) error {
75+
func (b *benchmarkBlockHeaders) request(peer *serverPeer, index int) error {
7676
if b.byHash {
77-
return peer.RequestHeadersByHash(0, 0, b.hashes[index], b.amount, b.skip, b.reverse)
77+
return peer.requestHeadersByHash(0, b.hashes[index], b.amount, b.skip, b.reverse)
7878
} else {
79-
return peer.RequestHeadersByNumber(0, 0, uint64(b.offset+rand.Int63n(b.randMax)), b.amount, b.skip, b.reverse)
79+
return peer.requestHeadersByNumber(0, uint64(b.offset+rand.Int63n(b.randMax)), b.amount, b.skip, b.reverse)
8080
}
8181
}
8282

@@ -95,11 +95,11 @@ func (b *benchmarkBodiesOrReceipts) init(h *serverHandler, count int) error {
9595
return nil
9696
}
9797

98-
func (b *benchmarkBodiesOrReceipts) request(peer *peer, index int) error {
98+
func (b *benchmarkBodiesOrReceipts) request(peer *serverPeer, index int) error {
9999
if b.receipts {
100-
return peer.RequestReceipts(0, 0, []common.Hash{b.hashes[index]})
100+
return peer.requestReceipts(0, []common.Hash{b.hashes[index]})
101101
} else {
102-
return peer.RequestBodies(0, 0, []common.Hash{b.hashes[index]})
102+
return peer.requestBodies(0, []common.Hash{b.hashes[index]})
103103
}
104104
}
105105

@@ -114,13 +114,13 @@ func (b *benchmarkProofsOrCode) init(h *serverHandler, count int) error {
114114
return nil
115115
}
116116

117-
func (b *benchmarkProofsOrCode) request(peer *peer, index int) error {
117+
func (b *benchmarkProofsOrCode) request(peer *serverPeer, index int) error {
118118
key := make([]byte, 32)
119119
rand.Read(key)
120120
if b.code {
121-
return peer.RequestCode(0, 0, []CodeReq{{BHash: b.headHash, AccKey: key}})
121+
return peer.requestCode(0, []CodeReq{{BHash: b.headHash, AccKey: key}})
122122
} else {
123-
return peer.RequestProofs(0, 0, []ProofReq{{BHash: b.headHash, Key: key}})
123+
return peer.requestProofs(0, []ProofReq{{BHash: b.headHash, Key: key}})
124124
}
125125
}
126126

@@ -144,7 +144,7 @@ func (b *benchmarkHelperTrie) init(h *serverHandler, count int) error {
144144
return nil
145145
}
146146

147-
func (b *benchmarkHelperTrie) request(peer *peer, index int) error {
147+
func (b *benchmarkHelperTrie) request(peer *serverPeer, index int) error {
148148
reqs := make([]HelperTrieReq, b.reqCount)
149149

150150
if b.bloom {
@@ -163,7 +163,7 @@ func (b *benchmarkHelperTrie) request(peer *peer, index int) error {
163163
}
164164
}
165165

166-
return peer.RequestHelperTrieProofs(0, 0, reqs)
166+
return peer.requestHelperTrieProofs(0, reqs)
167167
}
168168

169169
// benchmarkTxSend implements requestBenchmark
@@ -189,9 +189,9 @@ func (b *benchmarkTxSend) init(h *serverHandler, count int) error {
189189
return nil
190190
}
191191

192-
func (b *benchmarkTxSend) request(peer *peer, index int) error {
192+
func (b *benchmarkTxSend) request(peer *serverPeer, index int) error {
193193
enc, _ := rlp.EncodeToBytes(types.Transactions{b.txs[index]})
194-
return peer.SendTxs(0, 0, enc)
194+
return peer.sendTxs(0, enc)
195195
}
196196

197197
// benchmarkTxStatus implements requestBenchmark
@@ -201,10 +201,10 @@ func (b *benchmarkTxStatus) init(h *serverHandler, count int) error {
201201
return nil
202202
}
203203

204-
func (b *benchmarkTxStatus) request(peer *peer, index int) error {
204+
func (b *benchmarkTxStatus) request(peer *serverPeer, index int) error {
205205
var hash common.Hash
206206
rand.Read(hash[:])
207-
return peer.RequestTxStatus(0, 0, []common.Hash{hash})
207+
return peer.requestTxStatus(0, []common.Hash{hash})
208208
}
209209

210210
// benchmarkSetup stores measurement data for a single benchmark type
@@ -283,18 +283,17 @@ func (h *serverHandler) measure(setup *benchmarkSetup, count int) error {
283283
var id enode.ID
284284
rand.Read(id[:])
285285

286-
clientPeer := newPeer(lpv2, NetworkId, false, p2p.NewPeer(id, "client", nil), clientMeteredPipe)
287-
serverPeer := newPeer(lpv2, NetworkId, false, p2p.NewPeer(id, "server", nil), serverMeteredPipe)
288-
serverPeer.sendQueue = newExecQueue(count)
289-
serverPeer.announceType = announceTypeNone
290-
serverPeer.fcCosts = make(requestCostTable)
286+
peer1 := newServerPeer(lpv2, NetworkId, false, p2p.NewPeer(id, "client", nil), clientMeteredPipe)
287+
peer2 := newClientPeer(lpv2, NetworkId, p2p.NewPeer(id, "server", nil), serverMeteredPipe)
288+
peer2.announceType = announceTypeNone
289+
peer2.fcCosts = make(requestCostTable)
291290
c := &requestCosts{}
292291
for code := range requests {
293-
serverPeer.fcCosts[code] = c
292+
peer2.fcCosts[code] = c
294293
}
295-
serverPeer.fcParams = flowcontrol.ServerParams{BufLimit: 1, MinRecharge: 1}
296-
serverPeer.fcClient = flowcontrol.NewClientNode(h.server.fcManager, serverPeer.fcParams)
297-
defer serverPeer.fcClient.Disconnect()
294+
peer2.fcParams = flowcontrol.ServerParams{BufLimit: 1, MinRecharge: 1}
295+
peer2.fcClient = flowcontrol.NewClientNode(h.server.fcManager, peer2.fcParams)
296+
defer peer2.fcClient.Disconnect()
298297

299298
if err := setup.req.init(h, count); err != nil {
300299
return err
@@ -305,15 +304,15 @@ func (h *serverHandler) measure(setup *benchmarkSetup, count int) error {
305304

306305
go func() {
307306
for i := 0; i < count; i++ {
308-
if err := setup.req.request(clientPeer, i); err != nil {
307+
if err := setup.req.request(peer1, i); err != nil {
309308
errCh <- err
310309
return
311310
}
312311
}
313312
}()
314313
go func() {
315314
for i := 0; i < count; i++ {
316-
if err := h.handleMsg(serverPeer, &sync.WaitGroup{}); err != nil {
315+
if err := h.handleMsg(peer2, &sync.WaitGroup{}); err != nil {
317316
errCh <- err
318317
return
319318
}

les/client.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import (
4949
type LightEthereum struct {
5050
lesCommons
5151

52+
peers *serverPeerSet
5253
reqDist *requestDistributor
5354
retriever *retrieveManager
5455
odr *LesOdr
@@ -80,17 +81,17 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) {
8081
}
8182
log.Info("Initialised chain configuration", "config", chainConfig)
8283

83-
peers := newPeerSet()
84+
peers := newServerPeerSet()
8485
leth := &LightEthereum{
8586
lesCommons: lesCommons{
8687
genesis: genesisHash,
8788
config: config,
8889
chainConfig: chainConfig,
8990
iConfig: light.DefaultClientIndexerConfig,
9091
chainDb: chainDb,
91-
peers: peers,
9292
closeCh: make(chan struct{}),
9393
},
94+
peers: peers,
9495
eventMux: ctx.EventMux,
9596
reqDist: newRequestDistributor(peers, &mclock.System{}),
9697
accountManager: ctx.AccountManager,
@@ -225,7 +226,7 @@ func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux
225226
// network protocols to start.
226227
func (s *LightEthereum) Protocols() []p2p.Protocol {
227228
return s.makeProtocols(ClientProtocolVersions, s.handler.runPeer, func(id enode.ID) interface{} {
228-
if p := s.peers.Peer(peerIdToString(id)); p != nil {
229+
if p := s.peers.peer(peerIdToString(id)); p != nil {
229230
return p.Info()
230231
}
231232
return nil
@@ -253,7 +254,7 @@ func (s *LightEthereum) Start(srvr *p2p.Server) error {
253254
// Ethereum protocol.
254255
func (s *LightEthereum) Stop() error {
255256
close(s.closeCh)
256-
s.peers.Close()
257+
s.peers.close()
257258
s.reqDist.close()
258259
s.odr.Stop()
259260
s.relay.Stop()

les/client_handler.go

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.T
6565
}
6666
handler.fetcher = newLightFetcher(handler)
6767
handler.downloader = downloader.New(height, backend.chainDb, nil, backend.eventMux, nil, backend.blockchain, handler.removePeer)
68-
handler.backend.peers.notify((*downloaderPeerNotify)(handler))
68+
handler.backend.peers.subscribe((*downloaderPeerNotify)(handler))
6969
return handler
7070
}
7171

@@ -82,7 +82,8 @@ func (h *clientHandler) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter)
8282
if h.ulc != nil {
8383
trusted = h.ulc.trusted(p.ID())
8484
}
85-
peer := newPeer(int(version), h.backend.config.NetworkId, trusted, p, newMeteredMsgWriter(rw, int(version)))
85+
peer := newServerPeer(int(version), h.backend.config.NetworkId, trusted, p, newMeteredMsgWriter(rw, int(version)))
86+
defer peer.close()
8687
peer.poolEntry = h.backend.serverPool.connect(peer, peer.Node())
8788
if peer.poolEntry == nil {
8889
return p2p.DiscRequested
@@ -94,8 +95,8 @@ func (h *clientHandler) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter)
9495
return err
9596
}
9697

97-
func (h *clientHandler) handle(p *peer) error {
98-
if h.backend.peers.Len() >= h.backend.config.LightPeers && !p.Peer.Info().Network.Trusted {
98+
func (h *clientHandler) handle(p *serverPeer) error {
99+
if h.backend.peers.len() >= h.backend.config.LightPeers && !p.Peer.Info().Network.Trusted {
99100
return p2p.DiscTooManyPeers
100101
}
101102
p.Log().Debug("Light Ethereum peer connected", "name", p.Name())
@@ -112,20 +113,20 @@ func (h *clientHandler) handle(p *peer) error {
112113
return err
113114
}
114115
// Register the peer locally
115-
if err := h.backend.peers.Register(p); err != nil {
116+
if err := h.backend.peers.register(p); err != nil {
116117
p.Log().Error("Light Ethereum peer registration failed", "err", err)
117118
return err
118119
}
119-
serverConnectionGauge.Update(int64(h.backend.peers.Len()))
120+
serverConnectionGauge.Update(int64(h.backend.peers.len()))
120121

121122
connectedAt := mclock.Now()
122123
defer func() {
123-
h.backend.peers.Unregister(p.id)
124+
h.backend.peers.unregister(p.id)
124125
connectionTimer.Update(time.Duration(mclock.Now() - connectedAt))
125-
serverConnectionGauge.Update(int64(h.backend.peers.Len()))
126+
serverConnectionGauge.Update(int64(h.backend.peers.len()))
126127
}()
127128

128-
h.fetcher.announce(p, p.headInfo)
129+
h.fetcher.announce(p, &announceData{Hash: p.headInfo.Hash, Number: p.headInfo.Number, Td: p.headInfo.Td})
129130

130131
// pool entry can be nil during the unit test.
131132
if p.poolEntry != nil {
@@ -143,7 +144,7 @@ func (h *clientHandler) handle(p *peer) error {
143144

144145
// handleMsg is invoked whenever an inbound message is received from a remote
145146
// peer. The remote connection is torn down upon returning any error.
146-
func (h *clientHandler) handleMsg(p *peer) error {
147+
func (h *clientHandler) handleMsg(p *serverPeer) error {
147148
// Read the next message from the remote peer, and ensure it's fully consumed
148149
msg, err := p.rw.ReadMsg()
149150
if err != nil {
@@ -297,7 +298,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
297298
Obj: resp.Status,
298299
}
299300
case StopMsg:
300-
p.freezeServer(true)
301+
p.freeze()
301302
h.backend.retriever.frozen(p)
302303
p.Log().Debug("Service stopped")
303304
case ResumeMsg:
@@ -306,7 +307,7 @@ func (h *clientHandler) handleMsg(p *peer) error {
306307
return errResp(ErrDecode, "msg %v: %v", msg, err)
307308
}
308309
p.fcServer.ResumeFreeze(bv)
309-
p.freezeServer(false)
310+
p.unfreeze()
310311
p.Log().Debug("Service resumed")
311312
default:
312313
p.Log().Trace("Received invalid message", "code", msg.Code)
@@ -315,8 +316,8 @@ func (h *clientHandler) handleMsg(p *peer) error {
315316
// Deliver the received response to retriever.
316317
if deliverMsg != nil {
317318
if err := h.backend.retriever.deliver(p, deliverMsg); err != nil {
318-
p.responseErrors++
319-
if p.responseErrors > maxResponseErrors {
319+
p.errCount++
320+
if p.errCount > maxResponseErrors {
320321
return err
321322
}
322323
}
@@ -325,12 +326,12 @@ func (h *clientHandler) handleMsg(p *peer) error {
325326
}
326327

327328
func (h *clientHandler) removePeer(id string) {
328-
h.backend.peers.Unregister(id)
329+
h.backend.peers.unregister(id)
329330
}
330331

331332
type peerConnection struct {
332333
handler *clientHandler
333-
peer *peer
334+
peer *serverPeer
334335
}
335336

336337
func (pc *peerConnection) Head() (common.Hash, *big.Int) {
@@ -340,18 +341,18 @@ func (pc *peerConnection) Head() (common.Hash, *big.Int) {
340341
func (pc *peerConnection) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error {
341342
rq := &distReq{
342343
getCost: func(dp distPeer) uint64 {
343-
peer := dp.(*peer)
344-
return peer.GetRequestCost(GetBlockHeadersMsg, amount)
344+
peer := dp.(*serverPeer)
345+
return peer.getRequestCost(GetBlockHeadersMsg, amount)
345346
},
346347
canSend: func(dp distPeer) bool {
347-
return dp.(*peer) == pc.peer
348+
return dp.(*serverPeer) == pc.peer
348349
},
349350
request: func(dp distPeer) func() {
350351
reqID := genReqID()
351-
peer := dp.(*peer)
352-
cost := peer.GetRequestCost(GetBlockHeadersMsg, amount)
352+
peer := dp.(*serverPeer)
353+
cost := peer.getRequestCost(GetBlockHeadersMsg, amount)
353354
peer.fcServer.QueuedRequest(reqID, cost)
354-
return func() { peer.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse) }
355+
return func() { peer.requestHeadersByHash(reqID, origin, amount, skip, reverse) }
355356
},
356357
}
357358
_, ok := <-pc.handler.backend.reqDist.queue(rq)
@@ -364,18 +365,18 @@ func (pc *peerConnection) RequestHeadersByHash(origin common.Hash, amount int, s
364365
func (pc *peerConnection) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error {
365366
rq := &distReq{
366367
getCost: func(dp distPeer) uint64 {
367-
peer := dp.(*peer)
368-
return peer.GetRequestCost(GetBlockHeadersMsg, amount)
368+
peer := dp.(*serverPeer)
369+
return peer.getRequestCost(GetBlockHeadersMsg, amount)
369370
},
370371
canSend: func(dp distPeer) bool {
371-
return dp.(*peer) == pc.peer
372+
return dp.(*serverPeer) == pc.peer
372373
},
373374
request: func(dp distPeer) func() {
374375
reqID := genReqID()
375-
peer := dp.(*peer)
376-
cost := peer.GetRequestCost(GetBlockHeadersMsg, amount)
376+
peer := dp.(*serverPeer)
377+
cost := peer.getRequestCost(GetBlockHeadersMsg, amount)
377378
peer.fcServer.QueuedRequest(reqID, cost)
378-
return func() { peer.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse) }
379+
return func() { peer.requestHeadersByNumber(reqID, origin, amount, skip, reverse) }
379380
},
380381
}
381382
_, ok := <-pc.handler.backend.reqDist.queue(rq)
@@ -388,7 +389,7 @@ func (pc *peerConnection) RequestHeadersByNumber(origin uint64, amount int, skip
388389
// downloaderPeerNotify implements peerSetNotify
389390
type downloaderPeerNotify clientHandler
390391

391-
func (d *downloaderPeerNotify) registerPeer(p *peer) {
392+
func (d *downloaderPeerNotify) registerPeer(p *serverPeer) {
392393
h := (*clientHandler)(d)
393394
pc := &peerConnection{
394395
handler: h,
@@ -397,7 +398,7 @@ func (d *downloaderPeerNotify) registerPeer(p *peer) {
397398
h.downloader.RegisterLightPeer(p.id, ethVersion, pc)
398399
}
399400

400-
func (d *downloaderPeerNotify) unregisterPeer(p *peer) {
401+
func (d *downloaderPeerNotify) unregisterPeer(p *serverPeer) {
401402
h := (*clientHandler)(d)
402403
h.downloader.UnregisterPeer(p.id)
403404
}

0 commit comments

Comments
 (0)