6bed393c12
Backend Tests / backend-unit-test (push) Has been cancelled
Backend Tests / benchmark-test (push) Has been cancelled
CI@main / Node.js v22 (ubuntu-latest) (push) Has been cancelled
Thrift Syntax Validation / validate-thrift (push) Has been cancelled
License Check / License Check (push) Has been cancelled
155 lines
5.6 KiB
Go
155 lines
5.6 KiB
Go
/*
|
|
* Copyright 2025 coze-dev Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package oceanbase
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
defaultBatchSize = 100
|
|
defaultTopK = 10
|
|
defaultVectorDimension = 2048
|
|
defaultVectorMemoryLimitPercentage = 30
|
|
defaultMaxOpenConns = 100
|
|
defaultMaxIdleConns = 10
|
|
defaultConnMaxLifetime = 3600
|
|
defaultConnMaxIdleTime = 1800
|
|
defaultCacheTTL = 300
|
|
defaultConnTimeout = 30
|
|
defaultMaxRetries = 3
|
|
defaultRetryDelay = 1
|
|
maxVectorDimension = 4096
|
|
maxCollectionNameLength = 255
|
|
maxSQLIdentifierLength = 64
|
|
maxContentLength = 65535
|
|
maxBatchSize = 1000
|
|
|
|
enableCacheDefault = true
|
|
enableMetricsDefault = true
|
|
enableSlowQueryLogDefault = true
|
|
slowQueryThreshold = 1000
|
|
|
|
ErrCodeInvalidConfig = "INVALID_CONFIG"
|
|
ErrCodeConnectionFailed = "CONNECTION_FAILED"
|
|
ErrCodeQueryTimeout = "QUERY_TIMEOUT"
|
|
ErrCodeVectorDimensionMismatch = "VECTOR_DIMENSION_MISMATCH"
|
|
ErrCodeCollectionNotFound = "COLLECTION_NOT_FOUND"
|
|
ErrCodeDuplicateCollection = "DUPLICATE_COLLECTION"
|
|
)
|
|
|
|
type Config struct {
|
|
Host string
|
|
Port int
|
|
User string
|
|
Password string
|
|
Database string
|
|
|
|
VectorDimension int
|
|
MetricType string
|
|
MaxOpenConns int
|
|
MaxIdleConns int
|
|
ConnMaxLifetime time.Duration
|
|
ConnMaxIdleTime time.Duration
|
|
VectorMemoryLimitPercentage int
|
|
BatchSize int
|
|
|
|
EnableCache bool
|
|
CacheTTL time.Duration
|
|
EnableMetrics bool
|
|
EnableSlowQueryLog bool
|
|
MaxRetries int
|
|
RetryDelay time.Duration
|
|
ConnTimeout time.Duration
|
|
}
|
|
|
|
func DefaultConfig() *Config {
|
|
return &Config{
|
|
Host: getEnv("OCEANBASE_HOST", "localhost"),
|
|
Port: getEnvAsInt("OCEANBASE_PORT", 2881),
|
|
User: getEnv("OCEANBASE_USER", "root"),
|
|
Password: getEnv("OCEANBASE_PASSWORD", ""),
|
|
Database: getEnv("OCEANBASE_DATABASE", "test"),
|
|
VectorDimension: getVectorDimension(),
|
|
MetricType: "cosine",
|
|
MaxOpenConns: getEnvAsInt("OCEANBASE_MAX_OPEN_CONNS", defaultMaxOpenConns),
|
|
MaxIdleConns: getEnvAsInt("OCEANBASE_MAX_IDLE_CONNS", defaultMaxIdleConns),
|
|
ConnMaxLifetime: time.Duration(getEnvAsInt("OCEANBASE_CONN_MAX_LIFETIME", defaultConnMaxLifetime)) * time.Second,
|
|
ConnMaxIdleTime: time.Duration(getEnvAsInt("OCEANBASE_CONN_MAX_IDLE_TIME", defaultConnMaxIdleTime)) * time.Second,
|
|
VectorMemoryLimitPercentage: getEnvAsInt("OCEANBASE_VECTOR_MEMORY_LIMIT_PERCENTAGE", defaultVectorMemoryLimitPercentage),
|
|
BatchSize: getEnvAsInt("OCEANBASE_BATCH_SIZE", defaultBatchSize),
|
|
EnableCache: getEnvAsBool("OCEANBASE_ENABLE_CACHE", enableCacheDefault),
|
|
CacheTTL: time.Duration(getEnvAsInt("OCEANBASE_CACHE_TTL", defaultCacheTTL)) * time.Second,
|
|
EnableMetrics: getEnvAsBool("OCEANBASE_ENABLE_METRICS", enableMetricsDefault),
|
|
EnableSlowQueryLog: getEnvAsBool("OCEANBASE_ENABLE_SLOW_QUERY_LOG", enableSlowQueryLogDefault),
|
|
MaxRetries: getEnvAsInt("OCEANBASE_MAX_RETRIES", defaultMaxRetries),
|
|
RetryDelay: time.Duration(getEnvAsInt("OCEANBASE_RETRY_DELAY", defaultRetryDelay)) * time.Second,
|
|
ConnTimeout: time.Duration(getEnvAsInt("OCEANBASE_CONN_TIMEOUT", defaultConnTimeout)) * time.Second,
|
|
}
|
|
}
|
|
|
|
func (c *Config) Validate() error {
|
|
if c.Host == "" {
|
|
return fmt.Errorf("host cannot be empty")
|
|
}
|
|
if c.Port <= 0 || c.Port > 65535 {
|
|
return fmt.Errorf("port must be between 1 and 65535")
|
|
}
|
|
if c.User == "" {
|
|
return fmt.Errorf("user cannot be empty")
|
|
}
|
|
if c.Database == "" {
|
|
return fmt.Errorf("database cannot be empty")
|
|
}
|
|
if c.VectorDimension <= 0 || c.VectorDimension > maxVectorDimension {
|
|
return fmt.Errorf("vector dimension must be between 1 and %d", maxVectorDimension)
|
|
}
|
|
if c.BatchSize <= 0 || c.BatchSize > maxBatchSize {
|
|
return fmt.Errorf("batch size must be between 1 and %d", maxBatchSize)
|
|
}
|
|
if c.MaxOpenConns <= 0 {
|
|
return fmt.Errorf("max open connections must be positive")
|
|
}
|
|
if c.MaxIdleConns <= 0 || c.MaxIdleConns > c.MaxOpenConns {
|
|
return fmt.Errorf("max idle connections must be positive and not greater than max open connections")
|
|
}
|
|
if c.CacheTTL <= 0 {
|
|
return fmt.Errorf("cache TTL must be positive")
|
|
}
|
|
if c.MaxRetries < 0 {
|
|
return fmt.Errorf("max retries cannot be negative")
|
|
}
|
|
if c.RetryDelay < 0 {
|
|
return fmt.Errorf("retry delay cannot be negative")
|
|
}
|
|
if c.ConnTimeout <= 0 {
|
|
return fmt.Errorf("connection timeout must be positive")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getVectorDimension() int {
|
|
if dims := getEnvAsInt("ARK_EMBEDDING_DIMS", 0); dims > 0 {
|
|
return dims
|
|
}
|
|
if dims := getEnvAsInt("OPENAI_EMBEDDING_DIMS", 0); dims > 0 {
|
|
return dims
|
|
}
|
|
return defaultVectorDimension
|
|
}
|