From 3b430ef32de08bb8b478a9dbadbc3777b2599b57 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Wed, 29 May 2024 22:06:33 -0400 Subject: [PATCH] fix(dealer): make net.Dialer not to bind to reuse ephimeral ports --- scylla.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scylla.go b/scylla.go index 49d14d55a..54e00a9e4 100644 --- a/scylla.go +++ b/scylla.go @@ -780,14 +780,16 @@ type ScyllaShardAwareDialer struct { net.Dialer } -func (d *ScyllaShardAwareDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { +func (d *ScyllaShardAwareDialer) DialContext(ctx context.Context, network, addr string) (conn net.Conn, err error) { sourcePort := ScyllaGetSourcePort(ctx) - localAddr, err := net.ResolveTCPAddr(network, fmt.Sprintf(":%d", sourcePort)) + if sourcePort == 0 { + return d.Dialer.DialContext(ctx, network, addr) + } + dialerWithLocalAddr := d.Dialer + dialerWithLocalAddr.LocalAddr, err = net.ResolveTCPAddr(network, fmt.Sprintf(":%d", sourcePort)) if err != nil { return nil, err } - var dialerWithLocalAddr net.Dialer = d.Dialer - dialerWithLocalAddr.LocalAddr = localAddr return dialerWithLocalAddr.DialContext(ctx, network, addr) }