forked from TrueCloudLab/frostfs-sdk-go
[#126] pool: Store access time in the session token cache
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
ac66db59e0
commit
de4eedcd61
2 changed files with 56 additions and 3 deletions
|
@ -2,6 +2,7 @@ package pool
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
lru "github.com/hashicorp/golang-lru"
|
lru "github.com/hashicorp/golang-lru"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"github.com/nspcc-dev/neofs-sdk-go/session"
|
||||||
|
@ -11,6 +12,11 @@ type SessionCache struct {
|
||||||
cache *lru.Cache
|
cache *lru.Cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type cacheValue struct {
|
||||||
|
atime time.Time
|
||||||
|
token *session.Token
|
||||||
|
}
|
||||||
|
|
||||||
func NewCache() (*SessionCache, error) {
|
func NewCache() (*SessionCache, error) {
|
||||||
cache, err := lru.New(100)
|
cache, err := lru.New(100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -21,15 +27,31 @@ func NewCache() (*SessionCache, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SessionCache) Get(key string) *session.Token {
|
func (c *SessionCache) Get(key string) *session.Token {
|
||||||
tokenRaw, ok := c.cache.Get(key)
|
valueRaw, ok := c.cache.Get(key)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return tokenRaw.(*session.Token)
|
|
||||||
|
value := valueRaw.(*cacheValue)
|
||||||
|
value.atime = time.Now()
|
||||||
|
|
||||||
|
return value.token
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *SessionCache) GetAccessTime(key string) (time.Time, bool) {
|
||||||
|
valueRaw, ok := c.cache.Peek(key)
|
||||||
|
if !ok {
|
||||||
|
return time.Time{}, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return valueRaw.(*cacheValue).atime, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SessionCache) Put(key string, token *session.Token) bool {
|
func (c *SessionCache) Put(key string, token *session.Token) bool {
|
||||||
return c.cache.Add(key, token)
|
return c.cache.Add(key, &cacheValue{
|
||||||
|
atime: time.Now(),
|
||||||
|
token: token,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *SessionCache) DeleteByPrefix(prefix string) {
|
func (c *SessionCache) DeleteByPrefix(prefix string) {
|
||||||
|
|
31
pool/cache_test.go
Normal file
31
pool/cache_test.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package pool
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSessionCache_GetAccessTime(t *testing.T) {
|
||||||
|
const key = "Foo"
|
||||||
|
|
||||||
|
cache, err := NewCache()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cache.Put(key, nil)
|
||||||
|
|
||||||
|
t1, ok := cache.GetAccessTime(key)
|
||||||
|
require.True(t, ok)
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
|
||||||
|
t2, ok := cache.GetAccessTime(key)
|
||||||
|
require.True(t, ok)
|
||||||
|
require.Equal(t, t1, t2)
|
||||||
|
|
||||||
|
_ = cache.Get(key)
|
||||||
|
t3, ok := cache.GetAccessTime(key)
|
||||||
|
require.True(t, ok)
|
||||||
|
require.NotEqual(t, t1, t3)
|
||||||
|
}
|
Loading…
Reference in a new issue