[#1117] node: Introduce cache for frostfsid contract client
Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
This commit is contained in:
parent
b60a51b862
commit
9cc51f86b7
4 changed files with 99 additions and 4 deletions
|
@ -32,6 +32,7 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/ape/chainbase"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/ape/chainbase"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container"
|
||||||
|
frostfsidcore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/frostfsid"
|
||||||
netmapCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/netmap"
|
netmapCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/blobovniczatree"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/blobovniczatree"
|
||||||
|
@ -46,7 +47,6 @@ import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/metrics"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/metrics"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
|
||||||
containerClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container"
|
containerClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container"
|
||||||
frostfsidClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/frostfsid"
|
|
||||||
nmClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/netmap"
|
nmClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
|
||||||
netmap2 "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event/netmap"
|
netmap2 "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event/netmap"
|
||||||
|
@ -421,7 +421,7 @@ type shared struct {
|
||||||
|
|
||||||
cnrClient *containerClient.Client
|
cnrClient *containerClient.Client
|
||||||
|
|
||||||
frostfsidClient *frostfsidClient.Client
|
frostfsidClient frostfsidcore.SubjectProvider
|
||||||
|
|
||||||
respSvc *response.Service
|
respSvc *response.Service
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ const (
|
||||||
|
|
||||||
// APEChainCacheSizeDefault is a default value of APE chain cache.
|
// APEChainCacheSizeDefault is a default value of APE chain cache.
|
||||||
APEChainCacheSizeDefault = 10_000
|
APEChainCacheSizeDefault = 10_000
|
||||||
|
|
||||||
|
// FrostfsIDCacheSizeDefault is a default value of APE chain cache.
|
||||||
|
FrostfsIDCacheSizeDefault = 10_000
|
||||||
)
|
)
|
||||||
|
|
||||||
var errNoMorphEndpoints = errors.New("no morph chain RPC endpoints, see `morph.rpc_endpoint` section")
|
var errNoMorphEndpoints = errors.New("no morph chain RPC endpoints, see `morph.rpc_endpoint` section")
|
||||||
|
@ -114,3 +117,15 @@ func APEChainCacheSize(c *config.Config) uint32 {
|
||||||
}
|
}
|
||||||
return config.Uint32Safe(c.Sub(subsection), "ape_chain_cache_size")
|
return config.Uint32Safe(c.Sub(subsection), "ape_chain_cache_size")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FrostfsIDCacheSize returns the value of "frostfsid_cache_size" config parameter
|
||||||
|
// from "morph" section.
|
||||||
|
//
|
||||||
|
// Returns 0 if the value is not positive integer.
|
||||||
|
// Returns FrostfsIDCacheSizeDefault if the value is missing.
|
||||||
|
func FrostfsIDCacheSize(c *config.Config) uint32 {
|
||||||
|
if c.Sub(subsection).Value("frostfsid_cache_size") == nil {
|
||||||
|
return FrostfsIDCacheSizeDefault
|
||||||
|
}
|
||||||
|
return config.Uint32Safe(c.Sub(subsection), "frostfsid_cache_size")
|
||||||
|
}
|
||||||
|
|
|
@ -6,8 +6,10 @@ import (
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
containerGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container/grpc"
|
containerGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container/grpc"
|
||||||
|
morphconfig "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-node/config/morph"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
||||||
containerCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container"
|
containerCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container"
|
||||||
|
frostfsidcore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/frostfsid"
|
||||||
cntClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container"
|
cntClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/frostfsid"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/frostfsid"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
|
||||||
|
@ -33,9 +35,16 @@ func initContainerService(_ context.Context, c *cfg) {
|
||||||
|
|
||||||
cnrRdr, cnrWrt := configureEACLAndContainerSources(c, wrap, cnrSrc)
|
cnrRdr, cnrWrt := configureEACLAndContainerSources(c, wrap, cnrSrc)
|
||||||
|
|
||||||
frostFSIDClient, err := frostfsid.NewFromMorph(c.cfgMorph.client, c.cfgFrostfsID.scriptHash, 0)
|
var frostfsIDSubjectProvider frostfsidcore.SubjectProvider
|
||||||
|
frostfsIDSubjectProvider, err = frostfsid.NewFromMorph(c.cfgMorph.client, c.cfgFrostfsID.scriptHash, 0)
|
||||||
fatalOnErr(err)
|
fatalOnErr(err)
|
||||||
c.shared.frostfsidClient = frostFSIDClient
|
|
||||||
|
cacheSize := morphconfig.FrostfsIDCacheSize(c.appCfg)
|
||||||
|
if cacheSize > 0 {
|
||||||
|
frostfsIDSubjectProvider = newMorphFrostfsIDCache(frostfsIDSubjectProvider, int(cacheSize), c.cfgMorph.cacheTTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.shared.frostfsidClient = frostfsIDSubjectProvider
|
||||||
|
|
||||||
server := containerTransportGRPC.New(
|
server := containerTransportGRPC.New(
|
||||||
containerService.NewSignService(
|
containerService.NewSignService(
|
||||||
|
|
71
cmd/frostfs-node/frostfsid.go
Normal file
71
cmd/frostfs-node/frostfsid.go
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-contract/frostfsid/client"
|
||||||
|
frostfsidcore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/frostfsid"
|
||||||
|
"github.com/hashicorp/golang-lru/v2/expirable"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
type morphFrostfsIDCache struct {
|
||||||
|
subjProvider frostfsidcore.SubjectProvider
|
||||||
|
|
||||||
|
subjCache *expirable.LRU[util.Uint160, *client.Subject]
|
||||||
|
|
||||||
|
subjExtCache *expirable.LRU[util.Uint160, *client.SubjectExtended]
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMorphFrostfsIDCache(subjProvider frostfsidcore.SubjectProvider, size int, ttl time.Duration) frostfsidcore.SubjectProvider {
|
||||||
|
return &morphFrostfsIDCache{
|
||||||
|
subjProvider: subjProvider,
|
||||||
|
|
||||||
|
subjCache: expirable.NewLRU(size, func(util.Uint160, *client.Subject) {}, ttl),
|
||||||
|
|
||||||
|
subjExtCache: expirable.NewLRU(size, func(util.Uint160, *client.SubjectExtended) {}, ttl),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *morphFrostfsIDCache) GetSubject(addr util.Uint160) (*client.Subject, error) {
|
||||||
|
result, found := m.subjCache.Get(addr)
|
||||||
|
if found {
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := m.subjProvider.GetSubject(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.subjCache.Add(addr, result)
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *morphFrostfsIDCache) GetSubjectExtended(addr util.Uint160) (*client.SubjectExtended, error) {
|
||||||
|
subjExt, found := m.subjExtCache.Get(addr)
|
||||||
|
if found {
|
||||||
|
return subjExt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
subjExt, err = m.subjProvider.GetSubjectExtended(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.subjExtCache.Add(addr, subjExt)
|
||||||
|
m.subjCache.Add(addr, subjectFromSubjectExtended(subjExt))
|
||||||
|
|
||||||
|
return subjExt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func subjectFromSubjectExtended(subjExt *client.SubjectExtended) *client.Subject {
|
||||||
|
return &client.Subject{
|
||||||
|
PrimaryKey: subjExt.PrimaryKey,
|
||||||
|
AdditionalKeys: subjExt.AdditionalKeys,
|
||||||
|
Namespace: subjExt.Name,
|
||||||
|
Name: subjExt.Name,
|
||||||
|
KV: subjExt.KV,
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue