forked from TrueCloudLab/frostfs-node
[#1515] neofs-node: Cache max object size
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
9269ed344d
commit
aab6094a7c
2 changed files with 40 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
lru "github.com/hashicorp/golang-lru"
|
lru "github.com/hashicorp/golang-lru"
|
||||||
|
@ -8,6 +9,7 @@ import (
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/core/netmap"
|
"github.com/nspcc-dev/neofs-node/pkg/core/netmap"
|
||||||
cntClient "github.com/nspcc-dev/neofs-node/pkg/morph/client/container"
|
cntClient "github.com/nspcc-dev/neofs-node/pkg/morph/client/container"
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/services/object/acl/eacl"
|
"github.com/nspcc-dev/neofs-node/pkg/services/object/acl/eacl"
|
||||||
|
putsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/put"
|
||||||
containerSDK "github.com/nspcc-dev/neofs-sdk-go/container"
|
containerSDK "github.com/nspcc-dev/neofs-sdk-go/container"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
||||||
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
|
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
|
||||||
|
@ -325,3 +327,40 @@ func (f *cachedIRFetcher) InnerRingKeys() ([][]byte, error) {
|
||||||
|
|
||||||
return val.([][]byte), nil
|
return val.([][]byte), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ttlMaxObjectSizeCache struct {
|
||||||
|
mtx sync.RWMutex
|
||||||
|
lastUpdated time.Time
|
||||||
|
lastSize uint64
|
||||||
|
src putsvc.MaxSizeSource
|
||||||
|
}
|
||||||
|
|
||||||
|
func newCachedMaxObjectSizeSource(src putsvc.MaxSizeSource) putsvc.MaxSizeSource {
|
||||||
|
return &ttlMaxObjectSizeCache{
|
||||||
|
src: src,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ttlMaxObjectSizeCache) MaxObjectSize() uint64 {
|
||||||
|
const ttl = time.Second * 30
|
||||||
|
|
||||||
|
c.mtx.RLock()
|
||||||
|
prevUpdated := c.lastUpdated
|
||||||
|
size := c.lastSize
|
||||||
|
c.mtx.RUnlock()
|
||||||
|
|
||||||
|
if time.Since(prevUpdated) < ttl {
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
c.mtx.Lock()
|
||||||
|
size = c.lastSize
|
||||||
|
if !c.lastUpdated.After(prevUpdated) {
|
||||||
|
size = c.src.MaxObjectSize()
|
||||||
|
c.lastSize = size
|
||||||
|
c.lastUpdated = time.Now()
|
||||||
|
}
|
||||||
|
c.mtx.Unlock()
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
|
@ -271,7 +271,7 @@ func initObjectService(c *cfg) {
|
||||||
sPut := putsvc.NewService(
|
sPut := putsvc.NewService(
|
||||||
putsvc.WithKeyStorage(keyStorage),
|
putsvc.WithKeyStorage(keyStorage),
|
||||||
putsvc.WithClientConstructor(coreConstructor),
|
putsvc.WithClientConstructor(coreConstructor),
|
||||||
putsvc.WithMaxSizeSource(c),
|
putsvc.WithMaxSizeSource(newCachedMaxObjectSizeSource(c)),
|
||||||
putsvc.WithObjectStorage(os),
|
putsvc.WithObjectStorage(os),
|
||||||
putsvc.WithContainerSource(c.cfgObject.cnrSource),
|
putsvc.WithContainerSource(c.cfgObject.cnrSource),
|
||||||
putsvc.WithNetworkMapSource(c.netMapSource),
|
putsvc.WithNetworkMapSource(c.netMapSource),
|
||||||
|
|
Loading…
Reference in a new issue