mirror of
https://github.com/rancher/steve.git
synced 2025-09-22 03:47:26 +00:00
* On Reset, remove all the sqlite files, not just the main one. * Avoid resetting the database and cache when not needed. Avoid resetting when a change doesn't bring in new schema fields. Always reset when a CRD is deleted. * Force a database reset when a new CRD is added. * Improve code readability. No functional change.
This commit is contained in:
@@ -5,6 +5,8 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"slices"
|
||||
"sync"
|
||||
|
||||
apiserver "github.com/rancher/apiserver/pkg/server"
|
||||
"github.com/rancher/apiserver/pkg/types"
|
||||
@@ -29,6 +31,7 @@ import (
|
||||
"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"
|
||||
)
|
||||
|
||||
@@ -210,7 +213,7 @@ func setup(ctx context.Context, server *Server) error {
|
||||
|
||||
var onSchemasHandler schemacontroller.SchemasHandlerFunc
|
||||
if server.SQLCache {
|
||||
s, err := sqlproxy.NewProxyStore(ctx, cols, cf, summaryCache, summaryCache, server.cacheFactory)
|
||||
sqlStore, err := sqlproxy.NewProxyStore(ctx, cols, cf, summaryCache, summaryCache, server.cacheFactory, false)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -219,7 +222,7 @@ func setup(ctx context.Context, server *Server) error {
|
||||
proxy.NewUnformatterStore(
|
||||
proxy.NewWatchRefresh(
|
||||
sqlpartition.NewStore(
|
||||
s,
|
||||
sqlStore,
|
||||
asl,
|
||||
),
|
||||
asl,
|
||||
@@ -232,12 +235,52 @@ 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) error {
|
||||
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 := s.Reset(); err != nil {
|
||||
if err := sqlStore.Reset(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -246,7 +289,9 @@ func setup(ctx context.Context, server *Server) error {
|
||||
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 = ccache.OnSchemas
|
||||
onSchemasHandler = func(schemas *schema.Collection, _ map[string]*types.APISchema, _ bool) error {
|
||||
return ccache.OnSchemas(schemas)
|
||||
}
|
||||
}
|
||||
|
||||
schemas.SetupWatcher(ctx, server.BaseSchemas, asl, sf)
|
||||
|
Reference in New Issue
Block a user