1
0
mirror of https://github.com/rancher/steve.git synced 2025-09-22 20:09:34 +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

@@ -294,17 +294,17 @@ func (mr *MockCacheFactoryMockRecorder) DoneWithCache(arg0 any) *gomock.Call {
}
// Stop mocks base method.
func (m *MockCacheFactory) Stop() error {
func (m *MockCacheFactory) Stop(gvk schema.GroupVersionKind) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Stop")
ret := m.ctrl.Call(m, "Stop", gvk)
ret0, _ := ret[0].(error)
return ret0
}
// Stop indicates an expected call of Stop.
func (mr *MockCacheFactoryMockRecorder) Stop() *gomock.Call {
func (mr *MockCacheFactoryMockRecorder) Stop(gvk any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockCacheFactory)(nil).Stop))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockCacheFactory)(nil).Stop), gvk)
}
// MockSchemaColumnSetter is a mock of SchemaColumnSetter interface.

View File

@@ -302,7 +302,7 @@ type CacheFactoryInitializer func() (CacheFactory, error)
type CacheFactory interface {
CacheFor(ctx context.Context, fields [][]string, externalUpdateInfo *sqltypes.ExternalGVKUpdates, selfUpdateInfo *sqltypes.ExternalGVKUpdates, transform cache.TransformFunc, client dynamic.ResourceInterface, gvk schema.GroupVersionKind, namespaced bool, watchable bool) (*factory.Cache, error)
DoneWithCache(*factory.Cache)
Stop() error
Stop(gvk schema.GroupVersionKind) error
}
// NewProxyStore returns a Store implemented directly on top of kubernetes.
@@ -334,18 +334,20 @@ func NewProxyStore(ctx context.Context, c SchemaColumnSetter, clientGetter Clien
}
// Reset locks the store, resets the underlying cache factory, and warm the namespace cache.
func (s *Store) Reset() error {
func (s *Store) Reset(gvk schema.GroupVersionKind) error {
s.lock.Lock()
defer s.lock.Unlock()
if s.namespaceCache != nil {
if s.namespaceCache != nil && gvk == namespaceGVK {
s.cacheFactory.DoneWithCache(s.namespaceCache)
}
if err := s.cacheFactory.Stop(); err != nil {
if err := s.cacheFactory.Stop(gvk); err != nil {
return fmt.Errorf("reset: %w", err)
}
if err := s.initializeNamespaceCache(); err != nil {
return err
if gvk == namespaceGVK {
if err := s.initializeNamespaceCache(); err != nil {
return err
}
}
return nil
}

View File

@@ -33,6 +33,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
schema2 "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/apiserver/pkg/authentication/user"
@@ -726,13 +727,14 @@ func TestReset(t *testing.T) {
transformBuilder: tb,
}
nsSchema := baseNSSchema
cf.EXPECT().Stop().Return(nil)
gvk := attributes.GVK(&nsSchema)
cf.EXPECT().Stop(gvk).Return(nil)
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(nsc, nil)
cf.EXPECT().DoneWithCache(nsc)
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
err := s.Reset()
tb.EXPECT().GetTransformFunc(gvk, gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
err := s.Reset(gvk)
assert.Nil(t, err)
assert.Equal(t, nsc, s.namespaceCache)
},
@@ -754,8 +756,9 @@ func TestReset(t *testing.T) {
transformBuilder: tb,
}
cf.EXPECT().Stop().Return(fmt.Errorf("error"))
err := s.Reset()
gvk := schema.GroupVersionKind{}
cf.EXPECT().Stop(gvk).Return(fmt.Errorf("error"))
err := s.Reset(gvk)
assert.NotNil(t, err)
},
})
@@ -776,9 +779,12 @@ func TestReset(t *testing.T) {
transformBuilder: tb,
}
cf.EXPECT().Stop().Return(nil)
nsSchema := baseNSSchema
gvk := attributes.GVK(&nsSchema)
cf.EXPECT().Stop(gvk).Return(nil)
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(fmt.Errorf("error"))
err := s.Reset()
err := s.Reset(gvk)
assert.NotNil(t, err)
},
})
@@ -799,11 +805,12 @@ func TestReset(t *testing.T) {
transformBuilder: tb,
}
nsSchema := baseNSSchema
gvk := attributes.GVK(&nsSchema)
cf.EXPECT().Stop().Return(nil)
cf.EXPECT().Stop(gvk).Return(nil)
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(nil, fmt.Errorf("error"))
err := s.Reset()
err := s.Reset(gvk)
assert.NotNil(t, err)
},
})
@@ -825,13 +832,14 @@ func TestReset(t *testing.T) {
transformBuilder: tb,
}
nsSchema := baseNSSchema
gvk := attributes.GVK(&nsSchema)
cf.EXPECT().Stop().Return(nil)
cf.EXPECT().Stop(gvk).Return(nil)
cs.EXPECT().SetColumns(gomock.Any(), gomock.Any()).Return(nil)
cg.EXPECT().TableAdminClient(nil, &nsSchema, "", &WarningBuffer{}).Return(ri, nil)
cf.EXPECT().CacheFor(context.Background(), [][]string{{`id`}, {`metadata`, `state`, `name`}, {"spec", "displayName"}}, gomock.Any(), gomock.Any(), gomock.Any(), &tablelistconvert.Client{ResourceInterface: ri}, attributes.GVK(&nsSchema), false, true).Return(nil, fmt.Errorf("error"))
tb.EXPECT().GetTransformFunc(attributes.GVK(&nsSchema), gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
err := s.Reset()
tb.EXPECT().GetTransformFunc(gvk, gomock.Any(), false).Return(func(obj interface{}) (interface{}, error) { return obj, nil })
err := s.Reset(gvk)
assert.NotNil(t, err)
},
})