@@ -115,6 +115,45 @@ type scheduledWorkTimes struct {
115
115
nextAllowedCallToPeerSource time.Time
116
116
}
117
117
118
+ func (rf * relayFinder ) cleanupDisconnectedPeers (ctx context.Context ) {
119
+ subConnectedness , err := rf .host .EventBus ().Subscribe (new (event.EvtPeerConnectednessChanged ), eventbus .Name ("autorelay (relay finder)" ), eventbus .BufSize (32 ))
120
+ if err != nil {
121
+ log .Error ("failed to subscribe to the EvtPeerConnectednessChanged" )
122
+ return
123
+ }
124
+ defer subConnectedness .Close ()
125
+ for {
126
+ select {
127
+ case <- ctx .Done ():
128
+ return
129
+ case ev , ok := <- subConnectedness .Out ():
130
+ if ! ok {
131
+ return
132
+ }
133
+ evt := ev .(event.EvtPeerConnectednessChanged )
134
+ if evt .Connectedness != network .NotConnected {
135
+ continue
136
+ }
137
+ push := false
138
+
139
+ rf .relayMx .Lock ()
140
+ if rf .usingRelay (evt .Peer ) { // we were disconnected from a relay
141
+ log .Debugw ("disconnected from relay" , "id" , evt .Peer )
142
+ delete (rf .relays , evt .Peer )
143
+ rf .notifyMaybeConnectToRelay ()
144
+ rf .notifyMaybeNeedNewCandidates ()
145
+ push = true
146
+ }
147
+ rf .relayMx .Unlock ()
148
+
149
+ if push {
150
+ rf .clearCachedAddrsAndSignalAddressChange ()
151
+ rf .metricsTracer .ReservationEnded (1 )
152
+ }
153
+ }
154
+ }
155
+ }
156
+
118
157
func (rf * relayFinder ) background (ctx context.Context ) {
119
158
peerSourceRateLimiter := make (chan struct {}, 1 )
120
159
rf .refCount .Add (1 )
@@ -129,13 +168,6 @@ func (rf *relayFinder) background(ctx context.Context) {
129
168
rf .handleNewCandidates (ctx )
130
169
}()
131
170
132
- subConnectedness , err := rf .host .EventBus ().Subscribe (new (event.EvtPeerConnectednessChanged ), eventbus .Name ("autorelay (relay finder)" ))
133
- if err != nil {
134
- log .Error ("failed to subscribe to the EvtPeerConnectednessChanged" )
135
- return
136
- }
137
- defer subConnectedness .Close ()
138
-
139
171
now := rf .conf .clock .Now ()
140
172
bootDelayTimer := rf .conf .clock .InstantTimer (now .Add (rf .conf .bootDelay ))
141
173
defer bootDelayTimer .Stop ()
@@ -164,32 +196,10 @@ func (rf *relayFinder) background(ctx context.Context) {
164
196
workTimer := rf .conf .clock .InstantTimer (rf .runScheduledWork (ctx , now , scheduledWork , peerSourceRateLimiter ))
165
197
defer workTimer .Stop ()
166
198
199
+ go rf .cleanupDisconnectedPeers (ctx )
200
+
167
201
for {
168
202
select {
169
- case ev , ok := <- subConnectedness .Out ():
170
- if ! ok {
171
- return
172
- }
173
- evt := ev .(event.EvtPeerConnectednessChanged )
174
- if evt .Connectedness != network .NotConnected {
175
- continue
176
- }
177
- push := false
178
-
179
- rf .relayMx .Lock ()
180
- if rf .usingRelay (evt .Peer ) { // we were disconnected from a relay
181
- log .Debugw ("disconnected from relay" , "id" , evt .Peer )
182
- delete (rf .relays , evt .Peer )
183
- rf .notifyMaybeConnectToRelay ()
184
- rf .notifyMaybeNeedNewCandidates ()
185
- push = true
186
- }
187
- rf .relayMx .Unlock ()
188
-
189
- if push {
190
- rf .clearCachedAddrsAndSignalAddressChange ()
191
- rf .metricsTracer .ReservationEnded (1 )
192
- }
193
203
case <- rf .candidateFound :
194
204
rf .notifyMaybeConnectToRelay ()
195
205
case <- bootDelayTimer .Ch ():
@@ -264,7 +274,7 @@ func (rf *relayFinder) runScheduledWork(ctx context.Context, now time.Time, sche
264
274
if scheduledWork .nextOldCandidateCheck .Before (nextTime ) {
265
275
nextTime = scheduledWork .nextOldCandidateCheck
266
276
}
267
- if nextTime == now {
277
+ if nextTime . Equal ( now ) {
268
278
// Only happens in CI with a mock clock
269
279
nextTime = nextTime .Add (1 ) // avoids an infinite loop
270
280
}
0 commit comments