Skip to content

Commit 60545c0

Browse files
committed
improve source/destination errors on close
1 parent d855d14 commit 60545c0

3 files changed

Lines changed: 26 additions & 8 deletions

File tree

‎destination.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
)
2121

2222
var (
23-
ErrDestinationClosed = fmt.Errorf("destination closed: %w", errEndpointClosed)
23+
ErrDestinationClosed = fmt.Errorf("destination closed: %w: %w", errEndpointClosed, net.ErrClosed)
2424
errDestinationConnUpdated = errors.New("destination connection updated")
2525
errDestinationConnRemoved = errors.New("destination connection removed")
2626
)
@@ -71,7 +71,7 @@ func (d *Destination) AcceptContext(ctx context.Context) (net.Conn, error) {
7171
return nil, ctx.Err()
7272
case conn, ok := <-d.acceptCh:
7373
if !ok {
74-
return nil, fmt.Errorf("destination %s is closed: %w", d.cfg.Endpoint, net.ErrClosed)
74+
return nil, fmt.Errorf("destination %s is closed: %w", d.cfg.Endpoint, ErrDestinationClosed)
7575
}
7676
return conn, nil
7777
}

‎pkg/e2e/e2e_test.go‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,11 +293,11 @@ func TestE2E(t *testing.T) {
293293
require.Empty(t, cl.Sources())
294294

295295
acceptConn, acceptErr := dst.Accept()
296-
require.ErrorIs(t, acceptErr, net.ErrClosed)
296+
require.ErrorIs(t, acceptErr, connet.ErrDestinationClosed)
297297
require.Nil(t, acceptConn)
298298

299299
dialConn, dialErr := src.Dial("", "")
300-
require.ErrorIs(t, dialErr, connet.ErrSourceNoActiveDestinations)
300+
require.ErrorIs(t, dialErr, connet.ErrSourceClosed)
301301
require.Nil(t, dialConn)
302302
})
303303
t.Run("cancel-client", func(t *testing.T) {
@@ -333,11 +333,11 @@ func TestE2E(t *testing.T) {
333333
require.Empty(t, cl.Sources())
334334

335335
acceptConn, acceptErr := dst.Accept()
336-
require.ErrorIs(t, acceptErr, net.ErrClosed)
336+
require.ErrorIs(t, acceptErr, connet.ErrDestinationClosed)
337337
require.Nil(t, acceptConn)
338338

339339
dialConn, dialErr := src.Dial("", "")
340-
require.ErrorIs(t, dialErr, connet.ErrSourceNoActiveDestinations)
340+
require.ErrorIs(t, dialErr, connet.ErrSourceClosed)
341341
require.Nil(t, dialConn)
342342
})
343343
t.Run("close-dst", func(t *testing.T) {

‎source.go‎

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
)
2828

2929
var (
30-
ErrSourceClosed = fmt.Errorf("source closed: %w", errEndpointClosed)
30+
ErrSourceClosed = fmt.Errorf("source closed: %w: %w", errEndpointClosed, net.ErrClosed)
3131
ErrSourceConnect = errors.New("cannot connect destination")
3232
ErrSourceConnectDestinations = fmt.Errorf("%w: all peer connections were unreachable", ErrSourceConnect)
3333
ErrSourceNoActiveDestinations = fmt.Errorf("%w: no active peer connections", ErrSourceConnect)
@@ -88,6 +88,10 @@ func (s *Source) Dial(network, address string) (net.Conn, error) {
8888
// DialContext dials into any available destination. Both network and address are ignored.
8989
// Blocks until connection can be established.
9090
func (s *Source) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
91+
if err := s.ep.ctx.Err(); err != nil {
92+
return nil, fmt.Errorf("dial context: %w", context.Cause(s.ep.ctx))
93+
}
94+
9195
if s.cfg.DestinationPolicy == NoPolicy {
9296
conns, err := s.findActive()
9397
if err != nil {
@@ -157,6 +161,20 @@ func (s *Source) runActive(ctx context.Context) {
157161
}
158162

159163
func (s *Source) runActiveErr(ctx context.Context) error {
164+
defer func() {
165+
s.conns.Store(new([]sourceConn))
166+
}()
167+
168+
isConnsTracking := s.cfg.DestinationPolicy == LeastConnsPolicy
169+
if isConnsTracking {
170+
defer func() {
171+
s.connsTrackingMu.Lock()
172+
defer s.connsTrackingMu.Unlock()
173+
174+
s.connsTracking = map[peerID]*atomic.Int32{}
175+
}()
176+
}
177+
160178
return s.ep.peer.activeConnsListen(ctx, func(active map[peerConnKey]*quic.Conn) error {
161179
s.logger.Debug("active conns", "len", len(active))
162180

@@ -166,7 +184,7 @@ func (s *Source) runActiveErr(ctx context.Context) error {
166184
}
167185
s.conns.Store(&conns)
168186

169-
if s.connsTracking != nil {
187+
if isConnsTracking {
170188
activePeers := map[peerID]struct{}{}
171189
for peer := range active {
172190
activePeers[peer.id] = struct{}{}

0 commit comments

Comments
 (0)