Skip to content

Commit e401f5f

Browse files
les: close all connected les-server when shutdown (#21426)
* les: close all connected les-server when shutdown * les: linter nitpick Co-authored-by: Martin Holst Swende <[email protected]>
1 parent 8f24097 commit e401f5f

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

les/peer.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,3 +1288,42 @@ func (ps *serverPeerSet) close() {
12881288
}
12891289
ps.closed = true
12901290
}
1291+
1292+
// serverSet is a special set which contains all connected les servers.
1293+
// Les servers will also be discovered by discovery protocol because they
1294+
// also run the LES protocol. We can't drop them although they are useless
1295+
// for us(server) but for other protocols(e.g. ETH) upon the devp2p they
1296+
// may be useful.
1297+
type serverSet struct {
1298+
lock sync.Mutex
1299+
set map[string]*clientPeer
1300+
closed bool
1301+
}
1302+
1303+
func newServerSet() *serverSet {
1304+
return &serverSet{set: make(map[string]*clientPeer)}
1305+
}
1306+
1307+
func (s *serverSet) register(peer *clientPeer) error {
1308+
s.lock.Lock()
1309+
defer s.lock.Unlock()
1310+
1311+
if s.closed {
1312+
return errClosed
1313+
}
1314+
if _, exist := s.set[peer.id]; exist {
1315+
return errAlreadyRegistered
1316+
}
1317+
s.set[peer.id] = peer
1318+
return nil
1319+
}
1320+
1321+
func (s *serverSet) close() {
1322+
s.lock.Lock()
1323+
defer s.lock.Unlock()
1324+
1325+
for _, p := range s.set {
1326+
p.Disconnect(p2p.DiscQuitting)
1327+
}
1328+
s.closed = true
1329+
}

les/server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type LesServer struct {
3939

4040
archiveMode bool // Flag whether the ethereum node runs in archive mode.
4141
peers *clientPeerSet
42+
serverset *serverSet
4243
handler *serverHandler
4344
lesTopics []discv5.Topic
4445
privateKey *ecdsa.PrivateKey
@@ -83,6 +84,7 @@ func NewLesServer(node *node.Node, e *eth.Ethereum, config *eth.Config) (*LesSer
8384
},
8485
archiveMode: e.ArchiveMode(),
8586
peers: newClientPeerSet(),
87+
serverset: newServerSet(),
8688
lesTopics: lesTopics,
8789
fcManager: flowcontrol.NewClientManager(nil, &mclock.System{}),
8890
servingQueue: newServingQueue(int64(time.Millisecond*10), float64(config.LightServ)/100),
@@ -196,6 +198,9 @@ func (s *LesServer) Start() error {
196198
func (s *LesServer) Stop() error {
197199
close(s.closeCh)
198200

201+
// Disconnect existing connections with other LES servers.
202+
s.serverset.close()
203+
199204
// Disconnect existing sessions.
200205
// This also closes the gate for any new registrations on the peer set.
201206
// sessions which are already established but not added to pm.peers yet

les/server_handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ func (h *serverHandler) handle(p *clientPeer) error {
123123
return err
124124
}
125125
if p.server {
126+
if err := h.server.serverset.register(p); err != nil {
127+
return err
128+
}
126129
// connected to another server, no messages expected, just wait for disconnection
127130
_, err := p.rw.ReadMsg()
128131
return err

0 commit comments

Comments
 (0)