mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-08 10:08:42 +08:00
enhance: Refine segcore param change callback (#43838)
Related to #43230 This PR - Move segcore setup function to `initcore` package to remove cgo dependency from pkg - Register core callback only for components depends on segcore - Rectify `UpdateLogLevel` implementation Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
This commit is contained in:
parent
9f9ed14ddb
commit
f032044125
@ -15,6 +15,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include "common/Common.h"
|
#include "common/Common.h"
|
||||||
|
#include "gflags/gflags.h"
|
||||||
#include "log/Log.h"
|
#include "log/Log.h"
|
||||||
|
|
||||||
namespace milvus {
|
namespace milvus {
|
||||||
@ -76,11 +77,20 @@ void
|
|||||||
SetLogLevel(const char* level) {
|
SetLogLevel(const char* level) {
|
||||||
LOG_INFO("set log level: {}", level);
|
LOG_INFO("set log level: {}", level);
|
||||||
if (strcmp(level, "debug") == 0) {
|
if (strcmp(level, "debug") == 0) {
|
||||||
FLAGS_v = 5;
|
gflags::SetCommandLineOption("minloglevel", "0");
|
||||||
|
gflags::SetCommandLineOption("v", "5");
|
||||||
} else if (strcmp(level, "trace") == 0) {
|
} else if (strcmp(level, "trace") == 0) {
|
||||||
FLAGS_v = 6;
|
gflags::SetCommandLineOption("minloglevel", "0");
|
||||||
|
gflags::SetCommandLineOption("v", "6");
|
||||||
} else {
|
} else {
|
||||||
FLAGS_v = 4;
|
gflags::SetCommandLineOption("v", "4");
|
||||||
|
if (strcmp(level, "info") == 0) {
|
||||||
|
gflags::SetCommandLineOption("minloglevel", "0");
|
||||||
|
} else if (strcmp(level, "warn") == 0) {
|
||||||
|
gflags::SetCommandLineOption("minloglevel", "1");
|
||||||
|
} else if (strcmp(level, "error") == 0) {
|
||||||
|
gflags::SetCommandLineOption("minloglevel", "2");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,9 @@ func InitSegcore() {
|
|||||||
C.IndexBuilderInit(cGlogConf)
|
C.IndexBuilderInit(cGlogConf)
|
||||||
C.free(unsafe.Pointer(cGlogConf))
|
C.free(unsafe.Pointer(cGlogConf))
|
||||||
|
|
||||||
|
// update log level based on current setup
|
||||||
|
initcore.UpdateLogLevel(paramtable.Get().LogCfg.Level.GetValue())
|
||||||
|
|
||||||
// override index builder SIMD type
|
// override index builder SIMD type
|
||||||
cSimdType := C.CString(paramtable.Get().CommonCfg.SimdType.GetValue())
|
cSimdType := C.CString(paramtable.Get().CommonCfg.SimdType.GetValue())
|
||||||
C.IndexBuilderSetSimdType(cSimdType)
|
C.IndexBuilderSetSimdType(cSimdType)
|
||||||
@ -78,6 +81,9 @@ func InitSegcore() {
|
|||||||
cGpuMemoryPoolInitSize := C.uint32_t(paramtable.Get().GpuConfig.InitSize.GetAsUint32())
|
cGpuMemoryPoolInitSize := C.uint32_t(paramtable.Get().GpuConfig.InitSize.GetAsUint32())
|
||||||
cGpuMemoryPoolMaxSize := C.uint32_t(paramtable.Get().GpuConfig.MaxSize.GetAsUint32())
|
cGpuMemoryPoolMaxSize := C.uint32_t(paramtable.Get().GpuConfig.MaxSize.GetAsUint32())
|
||||||
C.SegcoreSetKnowhereGpuMemoryPoolSize(cGpuMemoryPoolInitSize, cGpuMemoryPoolMaxSize)
|
C.SegcoreSetKnowhereGpuMemoryPoolSize(cGpuMemoryPoolInitSize, cGpuMemoryPoolMaxSize)
|
||||||
|
|
||||||
|
// init paramtable change callback for core related config
|
||||||
|
initcore.SetupCoreConfigChangelCallback()
|
||||||
}
|
}
|
||||||
|
|
||||||
func CloseSegcore() {
|
func CloseSegcore() {
|
||||||
|
|||||||
@ -231,6 +231,9 @@ func (node *QueryNode) InitSegcore() error {
|
|||||||
C.SegcoreInit(cGlogConf)
|
C.SegcoreInit(cGlogConf)
|
||||||
C.free(unsafe.Pointer(cGlogConf))
|
C.free(unsafe.Pointer(cGlogConf))
|
||||||
|
|
||||||
|
// update log level based on current setup
|
||||||
|
initcore.UpdateLogLevel(paramtable.Get().LogCfg.Level.GetValue())
|
||||||
|
|
||||||
// override segcore chunk size
|
// override segcore chunk size
|
||||||
cChunkRows := C.int64_t(paramtable.Get().QueryNodeCfg.ChunkRows.GetAsInt64())
|
cChunkRows := C.int64_t(paramtable.Get().QueryNodeCfg.ChunkRows.GetAsInt64())
|
||||||
C.SegcoreSetChunkRows(cChunkRows)
|
C.SegcoreSetChunkRows(cChunkRows)
|
||||||
@ -412,6 +415,9 @@ func (node *QueryNode) InitSegcore() error {
|
|||||||
|
|
||||||
initcore.InitTraceConfig(paramtable.Get())
|
initcore.InitTraceConfig(paramtable.Get())
|
||||||
C.InitExecExpressionFunctionFactory()
|
C.InitExecExpressionFunctionFactory()
|
||||||
|
|
||||||
|
// init paramtable change callback for core related config
|
||||||
|
initcore.SetupCoreConfigChangelCallback()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,9 @@ func (s *Server) init() {
|
|||||||
if err := initcore.InitStorageV2FileSystem(paramtable.Get()); err != nil {
|
if err := initcore.InitStorageV2FileSystem(paramtable.Get()); err != nil {
|
||||||
panic(fmt.Sprintf("unrecoverable error happens at init storage v2 file system, %+v", err))
|
panic(fmt.Sprintf("unrecoverable error happens at init storage v2 file system, %+v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init paramtable change callback for core related config
|
||||||
|
initcore.SetupCoreConfigChangelCallback()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop stops the streamingnode server.
|
// Stop stops the streamingnode server.
|
||||||
|
|||||||
@ -29,9 +29,12 @@ package initcore
|
|||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
@ -281,6 +284,97 @@ func InitFileWriterConfig(params *paramtable.ComponentParam) error {
|
|||||||
return HandleCStatus(&status, "InitFileWriterConfig failed")
|
return HandleCStatus(&status, "InitFileWriterConfig failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var coreParamCallbackInitOnce sync.Once
|
||||||
|
|
||||||
|
func SetupCoreConfigChangelCallback() {
|
||||||
|
coreParamCallbackInitOnce.Do(func() {
|
||||||
|
paramtable.Get().CommonCfg.IndexSliceSize.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
size, err := strconv.Atoi(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateIndexSliceSize(size)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.HighPriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
coefficient, err := strconv.ParseFloat(newValue, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateHighPriorityThreadCoreCoefficient(coefficient)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.MiddlePriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
coefficient, err := strconv.ParseFloat(newValue, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateMiddlePriorityThreadCoreCoefficient(coefficient)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.LowPriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
coefficient, err := strconv.ParseFloat(newValue, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateLowPriorityThreadCoreCoefficient(coefficient)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.EnabledOptimizeExpr.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
enable, err := strconv.ParseBool(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateDefaultOptimizeExprEnable(enable)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.EnabledGrowingSegmentJSONKeyStats.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
enable, err := strconv.ParseBool(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateDefaultGrowingJSONKeyStatsEnable(enable)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().CommonCfg.EnableConfigParamTypeCheck.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
enable, err := strconv.ParseBool(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateDefaultConfigParamTypeCheck(enable)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().LogCfg.Level.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
return UpdateLogLevel(newValue)
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().QueryNodeCfg.ExprEvalBatchSize.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
size, err := strconv.Atoi(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateDefaultExprEvalBatchSize(size)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
paramtable.Get().QueryNodeCfg.JSONKeyStatsCommitInterval.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
||||||
|
interval, err := strconv.Atoi(newValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
UpdateDefaultJSONKeyStatsCommitInterval(interval)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func InitInterminIndexConfig(params *paramtable.ComponentParam) error {
|
func InitInterminIndexConfig(params *paramtable.ComponentParam) error {
|
||||||
enableInterminIndex := C.bool(params.QueryNodeCfg.EnableInterminSegmentIndex.GetAsBool())
|
enableInterminIndex := C.bool(params.QueryNodeCfg.EnableInterminSegmentIndex.GetAsBool())
|
||||||
C.SegcoreSetEnableInterminSegmentIndex(enableInterminIndex)
|
C.SegcoreSetEnableInterminSegmentIndex(enableInterminIndex)
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package paramtable
|
package initcore
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#cgo pkg-config: milvus_core
|
#cgo pkg-config: milvus_core
|
||||||
@ -25,9 +25,15 @@ package paramtable
|
|||||||
#include "common/init_c.h"
|
#include "common/init_c.h"
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import "unsafe"
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func UpdateLogLevel(level string) error {
|
func UpdateLogLevel(level string) error {
|
||||||
|
// always use lower case
|
||||||
|
level = strings.ToLower(level)
|
||||||
cvalue := C.CString(level)
|
cvalue := C.CString(level)
|
||||||
C.SetLogLevel(cvalue)
|
C.SetLogLevel(cvalue)
|
||||||
C.free(unsafe.Pointer(cvalue))
|
C.free(unsafe.Pointer(cvalue))
|
||||||
@ -17,7 +17,6 @@
|
|||||||
package paramtable
|
package paramtable
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@ -531,14 +530,6 @@ This configuration is only used by querynode and indexnode, it selects CPU instr
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.IndexSliceSize.Init(base.mgr)
|
p.IndexSliceSize.Init(base.mgr)
|
||||||
p.IndexSliceSize.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
size, err := strconv.Atoi(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateIndexSliceSize(size)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.EnableMaterializedView = ParamItem{
|
p.EnableMaterializedView = ParamItem{
|
||||||
Key: "common.materializedView.enabled",
|
Key: "common.materializedView.enabled",
|
||||||
@ -640,14 +631,6 @@ This configuration is only used by querynode and indexnode, it selects CPU instr
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.HighPriorityThreadCoreCoefficient.Init(base.mgr)
|
p.HighPriorityThreadCoreCoefficient.Init(base.mgr)
|
||||||
p.HighPriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
coefficient, err := strconv.ParseFloat(newValue, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateHighPriorityThreadCoreCoefficient(coefficient)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.MiddlePriorityThreadCoreCoefficient = ParamItem{
|
p.MiddlePriorityThreadCoreCoefficient = ParamItem{
|
||||||
Key: "common.threadCoreCoefficient.middlePriority",
|
Key: "common.threadCoreCoefficient.middlePriority",
|
||||||
@ -658,14 +641,6 @@ This configuration is only used by querynode and indexnode, it selects CPU instr
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.MiddlePriorityThreadCoreCoefficient.Init(base.mgr)
|
p.MiddlePriorityThreadCoreCoefficient.Init(base.mgr)
|
||||||
p.MiddlePriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
coefficient, err := strconv.ParseFloat(newValue, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateMiddlePriorityThreadCoreCoefficient(coefficient)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.LowPriorityThreadCoreCoefficient = ParamItem{
|
p.LowPriorityThreadCoreCoefficient = ParamItem{
|
||||||
Key: "common.threadCoreCoefficient.lowPriority",
|
Key: "common.threadCoreCoefficient.lowPriority",
|
||||||
@ -676,14 +651,6 @@ This configuration is only used by querynode and indexnode, it selects CPU instr
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.LowPriorityThreadCoreCoefficient.Init(base.mgr)
|
p.LowPriorityThreadCoreCoefficient.Init(base.mgr)
|
||||||
p.LowPriorityThreadCoreCoefficient.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
coefficient, err := strconv.ParseFloat(newValue, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateLowPriorityThreadCoreCoefficient(coefficient)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.DiskWriteMode = ParamItem{
|
p.DiskWriteMode = ParamItem{
|
||||||
Key: "common.diskWriteMode",
|
Key: "common.diskWriteMode",
|
||||||
@ -1097,14 +1064,6 @@ This helps Milvus-CDC synchronize incremental data`,
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.EnabledOptimizeExpr.Init(base.mgr)
|
p.EnabledOptimizeExpr.Init(base.mgr)
|
||||||
p.EnabledOptimizeExpr.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
enable, err := strconv.ParseBool(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateDefaultOptimizeExprEnable(enable)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.EnabledJSONKeyStats = ParamItem{
|
p.EnabledJSONKeyStats = ParamItem{
|
||||||
Key: "common.enabledJSONKeyStats",
|
Key: "common.enabledJSONKeyStats",
|
||||||
@ -1123,14 +1082,6 @@ This helps Milvus-CDC synchronize incremental data`,
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.EnabledGrowingSegmentJSONKeyStats.Init(base.mgr)
|
p.EnabledGrowingSegmentJSONKeyStats.Init(base.mgr)
|
||||||
p.EnabledGrowingSegmentJSONKeyStats.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
enable, err := strconv.ParseBool(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateDefaultGrowingJSONKeyStatsEnable(enable)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.EnableConfigParamTypeCheck = ParamItem{
|
p.EnableConfigParamTypeCheck = ParamItem{
|
||||||
Key: "common.enableConfigParamTypeCheck",
|
Key: "common.enableConfigParamTypeCheck",
|
||||||
@ -1140,14 +1091,6 @@ This helps Milvus-CDC synchronize incremental data`,
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.EnableConfigParamTypeCheck.Init(base.mgr)
|
p.EnableConfigParamTypeCheck.Init(base.mgr)
|
||||||
p.EnableConfigParamTypeCheck.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
enable, err := strconv.ParseBool(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateDefaultConfigParamTypeCheck(enable)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type gpuConfig struct {
|
type gpuConfig struct {
|
||||||
@ -1388,9 +1331,6 @@ It is recommended to use debug level under test and development environments, an
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
l.Level.Init(base.mgr)
|
l.Level.Init(base.mgr)
|
||||||
l.Level.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
return UpdateLogLevel(newValue)
|
|
||||||
})
|
|
||||||
|
|
||||||
l.RootPath = ParamItem{
|
l.RootPath = ParamItem{
|
||||||
Key: "log.file.rootPath",
|
Key: "log.file.rootPath",
|
||||||
@ -3943,14 +3883,6 @@ user-task-polling:
|
|||||||
Doc: "expr eval batch size for getnext interface",
|
Doc: "expr eval batch size for getnext interface",
|
||||||
}
|
}
|
||||||
p.ExprEvalBatchSize.Init(base.mgr)
|
p.ExprEvalBatchSize.Init(base.mgr)
|
||||||
p.ExprEvalBatchSize.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
size, err := strconv.Atoi(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateDefaultExprEvalBatchSize(size)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.JSONKeyStatsCommitInterval = ParamItem{
|
p.JSONKeyStatsCommitInterval = ParamItem{
|
||||||
Key: "queryNode.segcore.jsonKeyStatsCommitInterval",
|
Key: "queryNode.segcore.jsonKeyStatsCommitInterval",
|
||||||
@ -3960,14 +3892,6 @@ user-task-polling:
|
|||||||
Export: true,
|
Export: true,
|
||||||
}
|
}
|
||||||
p.JSONKeyStatsCommitInterval.Init(base.mgr)
|
p.JSONKeyStatsCommitInterval.Init(base.mgr)
|
||||||
p.JSONKeyStatsCommitInterval.RegisterCallback(func(ctx context.Context, key, oldValue, newValue string) error {
|
|
||||||
interval, err := strconv.Atoi(newValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
UpdateDefaultJSONKeyStatsCommitInterval(interval)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
p.CleanExcludeSegInterval = ParamItem{
|
p.CleanExcludeSegInterval = ParamItem{
|
||||||
Key: "queryCoord.cleanExcludeSegmentInterval",
|
Key: "queryCoord.cleanExcludeSegmentInterval",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user