From f80dedfb0dd03b92b6834a161a35b1aada849f43 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Tue, 20 Aug 2024 11:11:59 +0800 Subject: [PATCH] fix: fix dynamic update config doesn't works for some param milvus support config cache to spped up config access, but only evict param's cache when param has been updated. but milvus's param may rely on other param's value, let's say ParamsA relys on paramsB, when paramsB updated, it will evict paramB's cache, but the paramA's cache still keep the old value. This PR evict all config cache to solve the above issue, cause dynamic update config won't be much frequetly. Signed-off-by: Wei Liu --- pkg/config/manager.go | 12 ++++-------- pkg/util/paramtable/component_param_test.go | 10 ++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pkg/config/manager.go b/pkg/config/manager.go index 29dc6ffb9c690..5672042457a8e 100644 --- a/pkg/config/manager.go +++ b/pkg/config/manager.go @@ -132,19 +132,15 @@ func (m *Manager) CASCachedValue(key string, origin string, value interface{}) b func (m *Manager) EvictCachedValue(key string) { m.cacheMutex.Lock() defer m.cacheMutex.Unlock() - delete(m.configCache, key) + // cause param'value may rely on other params, so we need to evict all the cached value when config is changed + clear(m.configCache) } func (m *Manager) EvictCacheValueByFormat(keys ...string) { m.cacheMutex.Lock() defer m.cacheMutex.Unlock() - - set := typeutil.NewSet(keys...) - for key := range m.configCache { - if set.Contain(formatKey(key)) { - delete(m.configCache, key) - } - } + // cause param'value may rely on other params, so we need to evict all the cached value when config is changed + clear(m.configCache) } func (m *Manager) GetConfig(key string) (string, error) { diff --git a/pkg/util/paramtable/component_param_test.go b/pkg/util/paramtable/component_param_test.go index 101ed92e14527..a3081af6e114d 100644 --- a/pkg/util/paramtable/component_param_test.go +++ b/pkg/util/paramtable/component_param_test.go @@ -648,4 +648,14 @@ func TestCachedParam(t *testing.T) { assert.Equal(t, 1*time.Hour, params.DataCoordCfg.GCInterval.GetAsDuration(time.Second)) assert.Equal(t, 1*time.Hour, params.DataCoordCfg.GCInterval.GetAsDuration(time.Second)) + + params.Save(params.QuotaConfig.DiskQuota.Key, "192") + assert.Equal(t, float64(192*1024*1024), params.QuotaConfig.DiskQuota.GetAsFloat()) + assert.Equal(t, float64(192*1024*1024), params.QuotaConfig.DiskQuotaPerCollection.GetAsFloat()) + params.Save(params.QuotaConfig.DiskQuota.Key, "256") + assert.Equal(t, float64(256*1024*1024), params.QuotaConfig.DiskQuota.GetAsFloat()) + assert.Equal(t, float64(256*1024*1024), params.QuotaConfig.DiskQuotaPerCollection.GetAsFloat()) + params.Save(params.QuotaConfig.DiskQuota.Key, "192") + assert.Equal(t, 192*1024*1024, params.QuotaConfig.DiskQuota.GetAsInt64()) + assert.Equal(t, 192*1024*1024, params.QuotaConfig.DiskQuotaPerCollection.GetAsInt64()) }