Files
zgene 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
first commit
2026-05-14 13:29:56 +08:00

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
}