From cd7d7efb20cef4a743948753bd9169e83ea135de Mon Sep 17 00:00:00 2001 From: Nikita Skrynnik Date: Wed, 25 May 2022 17:09:00 +0700 Subject: [PATCH] add mutex Signed-off-by: Nikita Skrynnik --- pkg/networkservice/common/dial/client.go | 6 +++++- pkg/registry/common/dial/ns_client.go | 6 +++++- pkg/tools/grpcutils/listen_and_serve.go | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/networkservice/common/dial/client.go b/pkg/networkservice/common/dial/client.go index dc8d746c1..a4fa049b2 100644 --- a/pkg/networkservice/common/dial/client.go +++ b/pkg/networkservice/common/dial/client.go @@ -72,8 +72,12 @@ func (d *dialClient) Request(ctx context.Context, request *networkservice.Networ return next.Client(ctx).Request(ctx, request, opts...) } + grpcutils.UrlMut.Lock() + condition := di.clientURL != nil && di.clientURL.String() != clientURL.String() + grpcutils.UrlMut.Unlock() + // If our existing dialer has a different URL close down the chain - if di.clientURL != nil && di.clientURL.String() != clientURL.String() { + if condition { closeCtx, closeCancel := closeContextFunc() defer closeCancel() err := di.Dial(closeCtx, di.clientURL) diff --git a/pkg/registry/common/dial/ns_client.go b/pkg/registry/common/dial/ns_client.go index b77e9d8ef..8dd2809ee 100644 --- a/pkg/registry/common/dial/ns_client.go +++ b/pkg/registry/common/dial/ns_client.go @@ -59,8 +59,12 @@ func (c *dialNSClient) Register(ctx context.Context, in *registry.NetworkService return next.NetworkServiceRegistryClient(ctx).Register(ctx, in, opts...) } + grpcutils.UrlMut.Lock() + condition := di.clientURL != nil && di.clientURL.String() != clientURL.String() + grpcutils.UrlMut.Unlock() + // If our existing dialer has a different URL close down the chain - if di.clientURL != nil && di.clientURL.String() != clientURL.String() { + if condition { closeCtx, closeCancel := closeContextFunc() defer closeCancel() err := di.Dial(closeCtx, di.clientURL) diff --git a/pkg/tools/grpcutils/listen_and_serve.go b/pkg/tools/grpcutils/listen_and_serve.go index 375b2f118..94f618efc 100644 --- a/pkg/tools/grpcutils/listen_and_serve.go +++ b/pkg/tools/grpcutils/listen_and_serve.go @@ -25,6 +25,7 @@ import ( "net/url" "os" "path" + "sync" "github.com/networkservicemesh/sdk/pkg/tools/log" @@ -37,6 +38,8 @@ const ( tcpScheme = "tcp" ) +var UrlMut sync.Mutex + // ListenAndServe listens on address with server. Returns an chan err which will // receive an error and then be closed in the event that server.Serve(listener) returns an error. func ListenAndServe(ctx context.Context, address *url.URL, server *grpc.Server) <-chan error { @@ -66,8 +69,10 @@ func ListenAndServe(ctx context.Context, address *url.URL, server *grpc.Server) ln, err := net.Listen(network, target) if ln != nil { + UrlMut.Lock() // We need to pass a real listener address into context, since we could specify random port. *address = *AddressToURL(ln.Addr()) + UrlMut.Unlock() } // Serve