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