Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cd807bc

Browse files
authored
fix: delete old addresses from the active derp mesh mapping (coder#6926)
1 parent 334d982 commit cd807bc

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

enterprise/derpmesh/derpmesh.go

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ func (m *Mesh) removeAddress(address string) bool {
137137
cancelFunc, isActive := m.active[address]
138138
if isActive {
139139
cancelFunc()
140+
delete(m.active, address)
140141
}
141142
return isActive
142143
}

enterprise/derpmesh/derpmesh_test.go

+52-2
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ func TestDERPMesh(t *testing.T) {
5050
defer firstServer.Close()
5151
secondServer, secondServerURL := startDERP(t, tlsConfig)
5252
firstMesh := derpmesh.New(slogtest.Make(t, nil).Named("first").Leveled(slog.LevelDebug), firstServer, tlsConfig)
53-
firstMesh.SetAddresses([]string{secondServerURL}, true)
53+
firstMesh.SetAddresses([]string{secondServerURL}, false)
5454
secondMesh := derpmesh.New(slogtest.Make(t, nil).Named("second").Leveled(slog.LevelDebug), secondServer, tlsConfig)
55-
secondMesh.SetAddresses([]string{firstServerURL}, true)
55+
secondMesh.SetAddresses([]string{firstServerURL}, false)
5656
defer firstMesh.Close()
5757
defer secondMesh.Close()
5858

@@ -183,6 +183,56 @@ func TestDERPMesh(t *testing.T) {
183183
}
184184
}()
185185

186+
got := recvData(t, secondClient)
187+
require.Equal(t, sent, got)
188+
cancelFunc()
189+
<-closed
190+
})
191+
t.Run("CycleAddresses", func(t *testing.T) {
192+
t.Parallel()
193+
firstServer, firstServerURL := startDERP(t, tlsConfig)
194+
defer firstServer.Close()
195+
secondServer, secondServerURL := startDERP(t, tlsConfig)
196+
firstMesh := derpmesh.New(slogtest.Make(t, nil).Named("first").Leveled(slog.LevelDebug), firstServer, tlsConfig)
197+
firstMesh.SetAddresses([]string{secondServerURL}, false)
198+
secondMesh := derpmesh.New(slogtest.Make(t, nil).Named("second").Leveled(slog.LevelDebug), secondServer, tlsConfig)
199+
// Ensures that the client properly re-adds the address after it's removed.
200+
secondMesh.SetAddresses([]string{firstServerURL}, true)
201+
secondMesh.SetAddresses([]string{}, true)
202+
secondMesh.SetAddresses([]string{firstServerURL}, true)
203+
defer firstMesh.Close()
204+
defer secondMesh.Close()
205+
206+
first := key.NewNode()
207+
second := key.NewNode()
208+
firstClient, err := derphttp.NewClient(first, secondServerURL, tailnet.Logger(slogtest.Make(t, nil)))
209+
require.NoError(t, err)
210+
firstClient.TLSConfig = tlsConfig
211+
secondClient, err := derphttp.NewClient(second, firstServerURL, tailnet.Logger(slogtest.Make(t, nil)))
212+
require.NoError(t, err)
213+
secondClient.TLSConfig = tlsConfig
214+
err = secondClient.Connect(context.Background())
215+
require.NoError(t, err)
216+
217+
closed := make(chan struct{})
218+
ctx, cancelFunc := context.WithCancel(context.Background())
219+
defer cancelFunc()
220+
sent := []byte("hello world")
221+
go func() {
222+
defer close(closed)
223+
ticker := time.NewTicker(50 * time.Millisecond)
224+
defer ticker.Stop()
225+
for {
226+
select {
227+
case <-ctx.Done():
228+
return
229+
case <-ticker.C:
230+
}
231+
err = firstClient.Send(second.Public(), sent)
232+
require.NoError(t, err)
233+
}
234+
}()
235+
186236
got := recvData(t, secondClient)
187237
require.Equal(t, sent, got)
188238
cancelFunc()

0 commit comments

Comments
 (0)