From e11f50ec8e8cd503283d1bec354821e78719b163 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Mon, 21 Jun 2021 19:59:05 +0300 Subject: [PATCH] [#607] network: Make ClientCache to accept AddressGroup Change type of the `ClientCache.Get` method's parameter to `AddressGroup`. Use `GroupFromAddress` to call the method from the wrappers in order to no change their interface. Signed-off-by: Leonard Lyubich --- cmd/neofs-node/container.go | 4 ++-- cmd/neofs-node/object.go | 4 ++-- cmd/neofs-node/reputation/common/remote.go | 4 ++-- pkg/innerring/rpc.go | 4 ++-- pkg/network/cache/client.go | 11 ++++++++--- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cmd/neofs-node/container.go b/cmd/neofs-node/container.go index c44da3dcdc..daa98bc060 100644 --- a/cmd/neofs-node/container.go +++ b/cmd/neofs-node/container.go @@ -205,7 +205,7 @@ type remoteLoadAnnounceProvider struct { loadAddrSrc network.LocalAddressSource clientCache interface { - Get(network.Address) (apiClient.Client, error) + Get(network.AddressGroup) (apiClient.Client, error) } deadEndProvider loadcontroller.WriterProvider @@ -230,7 +230,7 @@ func (r *remoteLoadAnnounceProvider) InitRemote(srv loadroute.ServerInfo) (loadc return loadcontroller.SimpleWriterProvider(new(nopLoadWriter)), nil } - c, err := r.clientCache.Get(netAddr) + c, err := r.clientCache.Get(network.GroupFromAddress(netAddr)) if err != nil { return nil, fmt.Errorf("could not initialize API client: %w", err) } diff --git a/cmd/neofs-node/object.go b/cmd/neofs-node/object.go index b7afcfb8ba..8a01e6d5c8 100644 --- a/cmd/neofs-node/object.go +++ b/cmd/neofs-node/object.go @@ -422,7 +422,7 @@ type reputationClientConstructor struct { trustStorage *truststorage.Storage basicConstructor interface { - Get(network.Address) (client.Client, error) + Get(network.AddressGroup) (client.Client, error) } } @@ -507,7 +507,7 @@ func (c *reputationClient) SearchObject(ctx context.Context, prm *client.SearchO } func (c *reputationClientConstructor) Get(addr network.Address) (client.Client, error) { - cl, err := c.basicConstructor.Get(addr) + cl, err := c.basicConstructor.Get(network.GroupFromAddress(addr)) if err != nil { return nil, err } diff --git a/cmd/neofs-node/reputation/common/remote.go b/cmd/neofs-node/reputation/common/remote.go index 5c4c88d51e..cd08ae062d 100644 --- a/cmd/neofs-node/reputation/common/remote.go +++ b/cmd/neofs-node/reputation/common/remote.go @@ -11,7 +11,7 @@ import ( ) type clientCache interface { - Get(network.Address) (apiClient.Client, error) + Get(network.AddressGroup) (apiClient.Client, error) } // clientKeyRemoteProvider must provide remote writer and take into account @@ -84,7 +84,7 @@ func (rtp *remoteTrustProvider) InitRemote(srv reputationcommon.ServerInfo) (rep return trustcontroller.SimpleWriterProvider(new(NopReputationWriter)), nil } - c, err := rtp.clientCache.Get(netAddr) + c, err := rtp.clientCache.Get(network.GroupFromAddress(netAddr)) if err != nil { return nil, fmt.Errorf("could not initialize API client: %w", err) } diff --git a/pkg/innerring/rpc.go b/pkg/innerring/rpc.go index ade22dbd01..584bb93019 100644 --- a/pkg/innerring/rpc.go +++ b/pkg/innerring/rpc.go @@ -22,7 +22,7 @@ type ( ClientCache struct { log *zap.Logger cache interface { - Get(address network.Address) (client.Client, error) + Get(address network.AddressGroup) (client.Client, error) CloseAll() } key *ecdsa.PrivateKey @@ -52,7 +52,7 @@ func newClientCache(p *clientCacheParams) *ClientCache { func (c *ClientCache) Get(address network.Address) (client.Client, error) { // Because cache is used by `ClientCache` exclusively, // client will always have valid key. - return c.cache.Get(address) + return c.cache.Get(network.GroupFromAddress(address)) } // GetSG polls the container from audit task to get the object by id. diff --git a/pkg/network/cache/client.go b/pkg/network/cache/client.go index 020dfb988d..0ce87dac66 100644 --- a/pkg/network/cache/client.go +++ b/pkg/network/cache/client.go @@ -28,11 +28,16 @@ func NewSDKClientCache(opts ...client.Option) *ClientCache { } // Get function returns existing client or creates a new one. -func (c *ClientCache) Get(netAddr network.Address) (client.Client, error) { +func (c *ClientCache) Get(netAddr network.AddressGroup) (client.Client, error) { // multiaddr is used as a key in client cache since // same host may have different connections(with tls or not), // therefore, host+port pair is not unique - mAddr := netAddr.String() + + // FIXME: we should calculate map key regardless of the address order, + // but network.StringifyGroup is order-dependent. + // This works until the same mixed group is transmitted + // (for a network map, it seems to be true). + mAddr := network.StringifyGroup(netAddr) c.mu.RLock() if cli, ok := c.clients[mAddr]; ok { @@ -53,7 +58,7 @@ func (c *ClientCache) Get(netAddr network.Address) (client.Client, error) { return cli, nil } - cli := newMultiClient(network.GroupFromAddress(netAddr), c.opts) + cli := newMultiClient(netAddr, c.opts) c.clients[mAddr] = cli