From 6c96cc2af6eb9cb64e747c5b758fbec4d90c7287 Mon Sep 17 00:00:00 2001
From: Dmitrii Stepanov <d.stepanov@yadro.com>
Date: Wed, 9 Oct 2024 11:11:44 +0300
Subject: [PATCH] [#1422] node: Use dialer source for SDK cache

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
---
 cmd/frostfs-node/config.go  |  1 +
 internal/net/dialer.go      |  6 +++++-
 pkg/network/cache/client.go |  2 ++
 pkg/network/cache/multi.go  | 25 ++++++++++++++-----------
 4 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/cmd/frostfs-node/config.go b/cmd/frostfs-node/config.go
index dc1bad485..d44597857 100644
--- a/cmd/frostfs-node/config.go
+++ b/cmd/frostfs-node/config.go
@@ -773,6 +773,7 @@ func initShared(appCfg *config.Config, key *keys.PrivateKey, netState *networkSt
 		Key:              &key.PrivateKey,
 		AllowExternal:    apiclientconfig.AllowExternal(appCfg),
 		ReconnectTimeout: apiclientconfig.ReconnectTimeout(appCfg),
+		DialerSource:     ds,
 	}
 
 	return shared{
diff --git a/internal/net/dialer.go b/internal/net/dialer.go
index 4537490f6..daf0f815f 100644
--- a/internal/net/dialer.go
+++ b/internal/net/dialer.go
@@ -13,6 +13,10 @@ type Dialer interface {
 	DialContext(ctx context.Context, network, address string) (net.Conn, error)
 }
 
+func DialContextTCP(ctx context.Context, address string, d Dialer) (net.Conn, error) {
+	return d.DialContext(ctx, "tcp", address)
+}
+
 func newDefaulDialer() net.Dialer {
 	// From `grpc.WithContextDialer` comment:
 	//
@@ -28,7 +32,7 @@ func newDefaulDialer() net.Dialer {
 		KeepAlive: time.Duration(-1),
 		Control: func(_, _ string, c syscall.RawConn) error {
 			return c.Control(func(fd uintptr) {
-				unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1)
+				_ = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1)
 			})
 		},
 	}
diff --git a/pkg/network/cache/client.go b/pkg/network/cache/client.go
index 371d3c76f..63ae0bfdb 100644
--- a/pkg/network/cache/client.go
+++ b/pkg/network/cache/client.go
@@ -5,6 +5,7 @@ import (
 	"sync"
 	"time"
 
+	"git.frostfs.info/TrueCloudLab/frostfs-node/internal/net"
 	clientcore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/client"
 	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
 )
@@ -25,6 +26,7 @@ type (
 		Key              *ecdsa.PrivateKey
 		ResponseCallback func(client.ResponseMetaInfo) error
 		AllowExternal    bool
+		DialerSource     *net.DialerSource
 	}
 )
 
diff --git a/pkg/network/cache/multi.go b/pkg/network/cache/multi.go
index b83cbb217..e936ead65 100644
--- a/pkg/network/cache/multi.go
+++ b/pkg/network/cache/multi.go
@@ -60,18 +60,21 @@ func (x *multiClient) createForAddress(ctx context.Context, addr network.Address
 		prmInit.Key = *x.opts.Key
 	}
 
+	grpcOpts := []grpc.DialOption{
+		grpc.WithChainUnaryInterceptor(
+			metrics.NewUnaryClientInterceptor(),
+			tracing.NewUnaryClientInteceptor(),
+		),
+		grpc.WithChainStreamInterceptor(
+			metrics.NewStreamClientInterceptor(),
+			tracing.NewStreamClientInterceptor(),
+		),
+		grpc.WithContextDialer(x.opts.DialerSource.GrpcContextDialer()),
+	}
+
 	prmDial := client.PrmDial{
-		Endpoint: addr.URIAddr(),
-		GRPCDialOptions: []grpc.DialOption{
-			grpc.WithChainUnaryInterceptor(
-				metrics.NewUnaryClientInterceptor(),
-				tracing.NewUnaryClientInteceptor(),
-			),
-			grpc.WithChainStreamInterceptor(
-				metrics.NewStreamClientInterceptor(),
-				tracing.NewStreamClientInterceptor(),
-			),
-		},
+		Endpoint:        addr.URIAddr(),
+		GRPCDialOptions: grpcOpts,
 	}
 	if x.opts.DialTimeout > 0 {
 		prmDial.DialTimeout = x.opts.DialTimeout