diff --git a/pkg/domain/domain_sysvars.go b/pkg/domain/domain_sysvars.go index 2759cfbc67..722fcc8648 100644 --- a/pkg/domain/domain_sysvars.go +++ b/pkg/domain/domain_sysvars.go @@ -40,6 +40,8 @@ func (do *Domain) initDomainSysVars() { setGlobalResourceControlFunc := do.setGlobalResourceControl variable.SetGlobalResourceControl.Store(&setGlobalResourceControlFunc) variable.SetLowResolutionTSOUpdateInterval = do.setLowResolutionTSOUpdateInterval + + variable.ChangeSchemaCacheSize = do.changeSchemaCacheSize } // setStatsCacheCapacity sets statsCache cap @@ -115,3 +117,9 @@ func (do *Domain) setExternalTimestamp(ctx context.Context, ts uint64) error { func (do *Domain) getExternalTimestamp(ctx context.Context) (uint64, error) { return do.store.GetOracle().GetExternalTimestamp(ctx) } + +func (do *Domain) changeSchemaCacheSize(size uint64) { + if size > 0 { + do.infoCache.Data.SetCacheCapacity(size) + } +} diff --git a/pkg/infoschema/infoschema_v2.go b/pkg/infoschema/infoschema_v2.go index 701e1e1d00..d9d7b59d30 100644 --- a/pkg/infoschema/infoschema_v2.go +++ b/pkg/infoschema/infoschema_v2.go @@ -197,6 +197,11 @@ func (isd *Data) CacheCapacity() uint64 { return isd.tableCache.Capacity() } +// SetCacheCapacity sets the cache capacity size in bytes. +func (isd *Data) SetCacheCapacity(capacity uint64) { + isd.tableCache.SetCapacityAndWaitEvict(capacity) +} + func (isd *Data) add(item tableItem, tbl table.Table) { isd.byID.Set(item) isd.byName.Set(item) diff --git a/pkg/infoschema/sieve.go b/pkg/infoschema/sieve.go index de9db48c74..03ba1f8d88 100644 --- a/pkg/infoschema/sieve.go +++ b/pkg/infoschema/sieve.go @@ -103,6 +103,21 @@ func (s *Sieve[K, V]) SetCapacity(capacity uint64) { s.hook.onUpdateLimit(capacity) } +func (s *Sieve[K, V]) SetCapacityAndWaitEvict(capacity uint64) { + s.SetCapacity(capacity) + for { + s.mu.Lock() + if s.size <= s.capacity { + s.mu.Unlock() + break + } + for i := 0; s.size > s.capacity && i < 10; i++ { + s.evict() + } + s.mu.Unlock() + } +} + func (s *Sieve[K, V]) Capacity() uint64 { s.mu.Lock() defer s.mu.Unlock() diff --git a/pkg/sessionctx/variable/sysvar.go b/pkg/sessionctx/variable/sysvar.go index 8b80c856fa..0850383673 100644 --- a/pkg/sessionctx/variable/sysvar.go +++ b/pkg/sessionctx/variable/sysvar.go @@ -3154,6 +3154,9 @@ var defaultSysVars = []*SysVar{ if err != nil { return err } + if SchemaCacheSize.Load() != bt && ChangeSchemaCacheSize != nil { + ChangeSchemaCacheSize(bt) + } SchemaCacheSize.Store(bt) SchemaCacheSizeOriginText.Store(str) return nil diff --git a/pkg/sessionctx/variable/tidb_vars.go b/pkg/sessionctx/variable/tidb_vars.go index 1176bf27a8..ea09d67294 100644 --- a/pkg/sessionctx/variable/tidb_vars.go +++ b/pkg/sessionctx/variable/tidb_vars.go @@ -1647,6 +1647,8 @@ var ( ValidateCloudStorageURI func(ctx context.Context, uri string) error // SetLowResolutionTSOUpdateInterval is the func registered by domain to set slow resolution tso update interval. SetLowResolutionTSOUpdateInterval func(interval time.Duration) error = nil + // ChangeSchemaCacheSize is called when tidb_schema_cache_size is changed. + ChangeSchemaCacheSize func(size uint64) ) // Hooks functions for Cluster Resource Control.