[#126] pool: Store access time in the session token cache

Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
Alex Vanin 2022-02-02 14:18:05 +03:00 committed by Alex Vanin
parent ac66db59e0
commit de4eedcd61
2 changed files with 56 additions and 3 deletions

View file

@ -2,6 +2,7 @@ package pool
import (
"strings"
"time"
lru "github.com/hashicorp/golang-lru"
"github.com/nspcc-dev/neofs-sdk-go/session"
@ -11,6 +12,11 @@ type SessionCache struct {
cache *lru.Cache
}
type cacheValue struct {
atime time.Time
token *session.Token
}
func NewCache() (*SessionCache, error) {
cache, err := lru.New(100)
if err != nil {
@ -21,15 +27,31 @@ func NewCache() (*SessionCache, error) {
}
func (c *SessionCache) Get(key string) *session.Token {
tokenRaw, ok := c.cache.Get(key)
valueRaw, ok := c.cache.Get(key)
if !ok {
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 {
return c.cache.Add(key, token)
return c.cache.Add(key, &cacheValue{
atime: time.Now(),
token: token,
})
}
func (c *SessionCache) DeleteByPrefix(prefix string) {

31
pool/cache_test.go Normal file
View 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)
}