mirror of
https://github.com/rancher/steve.git
synced 2025-08-23 00:27:17 +00:00
Add debug logs and env var for user schema caches
This commit is contained in:
parent
a80bf83f76
commit
ec2b29d9f5
@ -3,6 +3,8 @@ package schema
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -17,6 +19,25 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/endpoints/request"
|
"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 {
|
type Collection struct {
|
||||||
toSync int32
|
toSync int32
|
||||||
baseSchema *types.APISchemas
|
baseSchema *types.APISchemas
|
||||||
@ -75,8 +96,8 @@ func NewCollection(ctx context.Context, baseSchema *types.APISchemas, access acc
|
|||||||
templates: map[string][]*Template{},
|
templates: map[string][]*Template{},
|
||||||
byGVR: map[schema.GroupVersionResource]string{},
|
byGVR: map[schema.GroupVersionResource]string{},
|
||||||
byGVK: map[schema.GroupVersionKind]string{},
|
byGVK: map[schema.GroupVersionKind]string{},
|
||||||
cache: cache.NewLRUExpireCache(1000),
|
cache: cache.NewLRUExpireCache(userSchemasCacheSize),
|
||||||
userCache: cache.NewLRUExpireCache(1000),
|
userCache: cache.NewLRUExpireCache(userSchemasCacheSize),
|
||||||
notifiers: map[int]func(){},
|
notifiers: map[int]func(){},
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
as: access,
|
as: access,
|
||||||
|
@ -5,16 +5,42 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/rancher/apiserver/pkg/builtin"
|
"github.com/rancher/apiserver/pkg/builtin"
|
||||||
"github.com/rancher/apiserver/pkg/types"
|
"github.com/rancher/apiserver/pkg/types"
|
||||||
"github.com/rancher/steve/pkg/accesscontrol"
|
"github.com/rancher/steve/pkg/accesscontrol"
|
||||||
"github.com/rancher/steve/pkg/attributes"
|
"github.com/rancher/steve/pkg/attributes"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"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 {
|
type Factory interface {
|
||||||
Schemas(user user.Info) (*types.APISchemas, error)
|
Schemas(user user.Info) (*types.APISchemas, error)
|
||||||
ByGVR(gvr schema.GroupVersionResource) string
|
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) {
|
func (c *Collection) addToCache(access *accesscontrol.AccessSet, user user.Info, schemas *types.APISchemas) {
|
||||||
c.cache.Add(access.ID, schemas, 24*time.Hour)
|
cacheSize := len(c.cache.Keys())
|
||||||
c.userCache.Add(user.GetName(), access.ID, 24*time.Hour)
|
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
|
// PurgeUserRecords removes a record from the backing LRU cache before expiry
|
||||||
|
Loading…
Reference in New Issue
Block a user