1
0
mirror of https://github.com/rancher/steve.git synced 2025-08-22 16:16:49 +00:00

Add debug logs and env var for user schema caches

This commit is contained in:
Ricardo Weir 2024-05-09 13:48:18 -07:00 committed by Silvio Moioli
parent a80bf83f76
commit ec2b29d9f5
No known key found for this signature in database
2 changed files with 58 additions and 4 deletions

View File

@ -3,6 +3,8 @@ package schema
import (
"context"
"net/http"
"os"
"strconv"
"strings"
"sync"
@ -17,6 +19,25 @@ import (
"k8s.io/apiserver/pkg/endpoints/request"
)
const (
defaultUserSchemasCacheSize = 1000
)
var (
userSchemasCacheSize = defaultUserSchemasCacheSize
)
func init() {
if size := os.Getenv("CATTLE_USER_SCHEMAS_CACHE_SIZE"); size != "" {
sizeInt, err := strconv.Atoi(size)
if err != nil {
logrus.Errorf("failed to set user schemas cache size: %v", err)
return
}
userSchemasCacheSize = sizeInt
}
}
type Collection struct {
toSync int32
baseSchema *types.APISchemas
@ -75,8 +96,8 @@ func NewCollection(ctx context.Context, baseSchema *types.APISchemas, access acc
templates: map[string][]*Template{},
byGVR: map[schema.GroupVersionResource]string{},
byGVK: map[schema.GroupVersionKind]string{},
cache: cache.NewLRUExpireCache(1000),
userCache: cache.NewLRUExpireCache(1000),
cache: cache.NewLRUExpireCache(userSchemasCacheSize),
userCache: cache.NewLRUExpireCache(userSchemasCacheSize),
notifiers: map[int]func(){},
ctx: ctx,
as: access,

View File

@ -5,16 +5,42 @@ import (
"context"
"fmt"
"net/http"
"os"
"strconv"
"time"
"github.com/rancher/apiserver/pkg/builtin"
"github.com/rancher/apiserver/pkg/types"
"github.com/rancher/steve/pkg/accesscontrol"
"github.com/rancher/steve/pkg/attributes"
"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/authentication/user"
)
const (
defaultExpiry = 24 * time.Hour
)
var (
schemasExpiry = defaultExpiry
logSizeDebug = false
)
func init() {
if showSizeDebug := os.Getenv("CATTLE_LOG_CACHE_SIZE_DEBUG"); showSizeDebug == "true" {
logSizeDebug = true
}
if expiry := os.Getenv("CATTLE_SCHEMAS_CACHE_EXPIRY"); expiry != "" {
expInt, err := strconv.Atoi(expiry)
if err != nil {
logrus.Errorf("failed to set user schemas cache size: %v", err)
return
}
schemasExpiry = time.Duration(expInt) * time.Hour
}
}
type Factory interface {
Schemas(user user.Info) (*types.APISchemas, error)
ByGVR(gvr schema.GroupVersionResource) string
@ -63,8 +89,15 @@ func (c *Collection) removeOldRecords(access *accesscontrol.AccessSet, user user
}
func (c *Collection) addToCache(access *accesscontrol.AccessSet, user user.Info, schemas *types.APISchemas) {
c.cache.Add(access.ID, schemas, 24*time.Hour)
c.userCache.Add(user.GetName(), access.ID, 24*time.Hour)
cacheSize := len(c.cache.Keys())
if cacheSize >= userSchemasCacheSize {
logrus.Debugf("user schemas cache is full. set size limit [%d], records will be evicted", userSchemasCacheSize)
}
if logSizeDebug {
logrus.Debugf("current size of schemas cache [%d], access ID being added [%s]", cacheSize, access.ID)
}
c.cache.Add(access.ID, schemas, schemasExpiry)
c.userCache.Add(user.GetName(), access.ID, schemasExpiry)
}
// PurgeUserRecords removes a record from the backing LRU cache before expiry