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:
@@ -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)
|
||||
|
Reference in New Issue
Block a user