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

Reset db more selectively: approach #2 (#745)

* 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:
Eric Promislow
2025-07-31 10:43:55 -07:00
committed by GitHub
parent e92b9cf7ea
commit 5f08feeb5f
5 changed files with 188 additions and 49 deletions

View File

@@ -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)