1
0
mirror of https://github.com/rancher/steve.git synced 2025-09-22 03:47:26 +00:00

Stop single caches instead of all of them (#812)

* Revert OnSchemas change work

* Track schema changes

* Only stop a single GVK informer factory

* Add tests

* Rename crd to crdClient

* Rename s to sqlStore

* Don't wait for synced caches if request is canceled

* Move schematracker to pkg/sqlcache/schematracker
This commit is contained in:
Tom Lebreux
2025-09-10 17:04:25 -04:00
committed by GitHub
parent 45a3b07816
commit 13d5ad3ccb
10 changed files with 543 additions and 246 deletions

View File

@@ -5,8 +5,6 @@ import (
"errors"
"fmt"
"net/http"
"slices"
"sync"
apiserver "github.com/rancher/apiserver/pkg/server"
"github.com/rancher/apiserver/pkg/types"
@@ -26,12 +24,12 @@ import (
"github.com/rancher/steve/pkg/server/handler"
"github.com/rancher/steve/pkg/server/router"
"github.com/rancher/steve/pkg/sqlcache/informer/factory"
"github.com/rancher/steve/pkg/sqlcache/schematracker"
metricsStore "github.com/rancher/steve/pkg/stores/metrics"
"github.com/rancher/steve/pkg/stores/proxy"
"github.com/rancher/steve/pkg/stores/sqlpartition"
"github.com/rancher/steve/pkg/stores/sqlproxy"
"github.com/rancher/steve/pkg/summarycache"
"github.com/sirupsen/logrus"
"k8s.io/client-go/rest"
)
@@ -235,63 +233,25 @@ func setup(ctx context.Context, server *Server) error {
for _, template := range resources.DefaultSchemaTemplatesForStore(store, server.BaseSchemas, summaryCache, asl, server.controllers.K8s.Discovery(), common.TemplateOptions{InSQLMode: true}) {
sf.AddTemplate(template)
}
mutex := &sync.Mutex{}
fieldsForSchema := make(map[string][][]string) // map schemaID to fields
initializedDB := false
onSchemasHandler = func(schemas *schema.Collection, changedSchemas map[string]*types.APISchema, deletedSomething bool) error {
resetEverything := false
// We need a mutex around the fieldsForSchema closure because this handler is invoked asynchronously
// from the server
mutex.Lock()
if !initializedDB {
initializedDB = true
resetEverything = true
for _, id := range schemas.IDs() {
theSchema := schemas.Schema(id)
if theSchema == nil {
fieldsForSchema[id] = [][]string{}
continue
}
fieldsForSchema[id] = sqlproxy.GetFieldsFromSchema(theSchema)
}
logrus.Debugf("onSchemasHandler: need to reset everything on first run")
} else {
for id, theSchema := range changedSchemas {
oldFields, ok := fieldsForSchema[id]
newFields := sqlproxy.GetFieldsFromSchema(theSchema)
if !ok || !slices.EqualFunc(oldFields, newFields,
func(s1, s2 []string) bool {
return slices.Equal(s1, s2)
}) {
resetEverything = true
}
fieldsForSchema[id] = newFields
}
if deletedSomething {
resetEverything = true
}
logrus.Debugf("onSchemasHandler: need to reset everything: %t", resetEverything)
}
mutex.Unlock()
if !resetEverything {
return nil
}
if err := ccache.OnSchemas(schemas); err != nil {
return err
}
if err := sqlStore.Reset(); err != nil {
return err
}
return nil
sqlSchemaTracker := schematracker.NewSchemaTracker(sqlStore)
onSchemasHandler = func(schemas *schema.Collection) error {
var retErr error
err := ccache.OnSchemas(schemas)
retErr = errors.Join(retErr, err)
err = sqlSchemaTracker.OnSchemas(schemas)
retErr = errors.Join(retErr, err)
return retErr
}
} else {
for _, template := range resources.DefaultSchemaTemplates(cf, server.BaseSchemas, summaryCache, asl, server.controllers.K8s.Discovery(), server.controllers.Core.Namespace().Cache(), common.TemplateOptions{InSQLMode: false}) {
sf.AddTemplate(template)
}
onSchemasHandler = func(schemas *schema.Collection, _ map[string]*types.APISchema, _ bool) error {
return ccache.OnSchemas(schemas)
}
onSchemasHandler = ccache.OnSchemas
}
schemas.SetupWatcher(ctx, server.BaseSchemas, asl, sf)