feat(storage): 为内存引擎添加缓冲区长度配置
- 在 Config 结构中添加 MemLen 字段,用于配置内存缓冲区长度 - 在命令行参数中添加 --mem-len 选项,用于指定内存缓冲区长度 - 修改 MemoryEngine 结构,添加 buffLen 字段以支持自定义缓冲区长度 - 更新 NewMemoryEngine 函数,允许传入内存缓冲区长度参数 - 在创建 CircularBuffer 时使用指定的缓冲区长度 - 更新相关测试文件,使用新的内存
This commit is contained in:
parent
f97b0b2ea7
commit
989ce58da5
|
@ -18,6 +18,7 @@ type Config struct {
|
|||
PersistenceType string `yaml:"persistence_type"`
|
||||
PersistenceDir string `yaml:"persistence_dir"`
|
||||
SyncEvery int `yaml:"sync_every"`
|
||||
MemLen int `yaml:"mem_len"`
|
||||
QuicConfig *quic.Config `yaml:"quic_config"`
|
||||
|
||||
// BoltDB特有配置
|
||||
|
|
|
@ -25,6 +25,7 @@ var (
|
|||
persistenceType = flag.String("persistence", "none", "持久化类型 (none, wal)")
|
||||
persistenceDir = flag.String("persistence-dir", "./data", "持久化目录")
|
||||
syncEvery = flag.Int("sync-every", 100, "每写入多少条数据同步一次")
|
||||
memLen = flag.Int("mem-len", 2048, "内存缓冲区长度")
|
||||
configPath = flag.String("config", "config.yaml", "配置文件路径")
|
||||
// 定义配置QUIC服务的命令行参数
|
||||
quicAddr = flag.String("quic-addr", ":8083", "QUIC服务地址")
|
||||
|
@ -33,16 +34,6 @@ var (
|
|||
)
|
||||
|
||||
func main() {
|
||||
if *genSampleConfig {
|
||||
err := GenerateSampleConfig("./config.yaml.sample")
|
||||
if err != nil {
|
||||
log.Fatalf("生成示例配置文件失败: %v", err)
|
||||
}
|
||||
log.Println("示例配置文件已生成")
|
||||
return
|
||||
}
|
||||
flag.Parse()
|
||||
|
||||
// 保存命令行原始值,用于后续判断是否被用户显式设置
|
||||
originalRestAddr := *restAddr
|
||||
originalWsAddr := *wsAddr
|
||||
|
@ -52,6 +43,17 @@ func main() {
|
|||
originalPersistenceType := *persistenceType
|
||||
originalPersistenceDir := *persistenceDir
|
||||
originalSyncEvery := *syncEvery
|
||||
originalMemBufferLen := *memLen
|
||||
|
||||
if *genSampleConfig {
|
||||
err := GenerateSampleConfig("./config.yaml.sample")
|
||||
if err != nil {
|
||||
log.Fatalf("生成示例配置文件失败: %v", err)
|
||||
}
|
||||
log.Println("示例配置文件已生成")
|
||||
return
|
||||
}
|
||||
flag.Parse()
|
||||
|
||||
var config *Config
|
||||
if *configPath != "" {
|
||||
|
@ -86,6 +88,9 @@ func main() {
|
|||
if *syncEvery == originalSyncEvery {
|
||||
syncEvery = &config.SyncEvery
|
||||
}
|
||||
if *memLen == originalMemBufferLen {
|
||||
memLen = &config.MemLen
|
||||
}
|
||||
}
|
||||
|
||||
// 创建存储引擎配置
|
||||
|
|
|
@ -18,7 +18,7 @@ import (
|
|||
|
||||
func setupTestRESTServer() *RESTServer {
|
||||
// 创建存储引擎
|
||||
engine := storage.NewMemoryEngine()
|
||||
engine := storage.NewMemoryEngine(200)
|
||||
|
||||
// 创建数据管理器
|
||||
dataManager := manager.NewDataManager(engine)
|
||||
|
@ -152,7 +152,7 @@ func TestRESTServer_QueryEndpoint(t *testing.T) {
|
|||
server := setupTestRESTServer()
|
||||
|
||||
// 写入测试数据
|
||||
engine := storage.NewMemoryEngine()
|
||||
engine := storage.NewMemoryEngine(200)
|
||||
dataManager := manager.NewDataManager(engine)
|
||||
server.dataManager = dataManager
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ import (
|
|||
|
||||
func setupTestWebSocketServer() *WebSocketServer {
|
||||
// 创建存储引擎
|
||||
engine := storage.NewMemoryEngine()
|
||||
engine := storage.NewMemoryEngine(200)
|
||||
|
||||
// 创建数据管理器
|
||||
dataManager := manager.NewDataManager(engine)
|
||||
|
|
|
@ -11,7 +11,7 @@ import (
|
|||
|
||||
func TestDataManager(t *testing.T) {
|
||||
// 创建存储引擎
|
||||
engine := storage.NewMemoryEngine()
|
||||
engine := storage.NewMemoryEngine(200)
|
||||
|
||||
// 创建数据管理器
|
||||
manager := NewDataManager(engine)
|
||||
|
|
|
@ -75,14 +75,15 @@ type DataValue struct {
|
|||
|
||||
// CircularBuffer 环形缓冲区
|
||||
type CircularBuffer struct {
|
||||
Values [30]DataValue // 固定大小为30的环形缓冲区
|
||||
Values []DataValue // 固定大小为30的环形缓冲区
|
||||
Head int // 当前写入位置
|
||||
Lock sync.RWMutex // 细粒度锁
|
||||
}
|
||||
|
||||
// NewCircularBuffer 创建一个新的环形缓冲区
|
||||
func NewCircularBuffer() *CircularBuffer {
|
||||
func NewCircularBuffer(bufferLen int) *CircularBuffer {
|
||||
return &CircularBuffer{
|
||||
Values: make([]DataValue, bufferLen),
|
||||
Head: -1, // 初始化为-1,表示缓冲区为空
|
||||
}
|
||||
}
|
||||
|
|
|
@ -178,7 +178,7 @@ func (e *BoltDBEngine) Read(ctx context.Context, id model.DataPointID) ([]model.
|
|||
}
|
||||
|
||||
// 创建并填充缓存
|
||||
buffer := model.NewCircularBuffer()
|
||||
buffer := model.NewCircularBuffer(1024)
|
||||
for _, value := range values {
|
||||
buffer.Write(value)
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ type StorageEngine interface {
|
|||
|
||||
// MemoryEngine 内存存储引擎
|
||||
type MemoryEngine struct {
|
||||
buffLen int // every metric buffer size
|
||||
data map[string]*model.CircularBuffer // 数据存储
|
||||
dataLock sync.RWMutex // 数据锁
|
||||
persister Persister // 持久化器
|
||||
|
@ -102,8 +103,9 @@ func (e *MemoryEngine) ReadDuration(ctx context.Context, id model.DataPointID, f
|
|||
}
|
||||
|
||||
// NewMemoryEngine 创建一个新的内存存储引擎
|
||||
func NewMemoryEngine() *MemoryEngine {
|
||||
func NewMemoryEngine(memBufferLen int) *MemoryEngine {
|
||||
return &MemoryEngine{
|
||||
buffLen: memBufferLen,
|
||||
data: make(map[string]*model.CircularBuffer),
|
||||
}
|
||||
}
|
||||
|
@ -118,7 +120,11 @@ func (e *MemoryEngine) Write(ctx context.Context, id model.DataPointID, value mo
|
|||
|
||||
if !exists {
|
||||
// 如果数据点不存在,创建一个新的环形缓冲区
|
||||
buffer = model.NewCircularBuffer()
|
||||
bufferLen := e.buffLen
|
||||
if bufferLen <= 0 {
|
||||
bufferLen = 30
|
||||
}
|
||||
buffer = model.NewCircularBuffer(bufferLen)
|
||||
e.dataLock.Lock()
|
||||
e.data[key] = buffer
|
||||
e.dataLock.Unlock()
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
|
||||
func TestMemoryEngine(t *testing.T) {
|
||||
// 创建内存存储引擎
|
||||
engine := NewMemoryEngine()
|
||||
engine := NewMemoryEngine(200)
|
||||
|
||||
// 创建测试数据
|
||||
id := model.DataPointID{
|
||||
|
@ -170,7 +170,7 @@ func TestPersistence(t *testing.T) {
|
|||
defer os.RemoveAll(tempDir)
|
||||
|
||||
// 创建内存存储引擎
|
||||
engine := NewMemoryEngine()
|
||||
engine := NewMemoryEngine(200)
|
||||
|
||||
// 启用WAL持久化
|
||||
persistenceConfig := PersistenceConfig{
|
||||
|
@ -221,7 +221,7 @@ func TestPersistence(t *testing.T) {
|
|||
}
|
||||
|
||||
// 创建新的引擎并从WAL恢复
|
||||
newEngine := NewMemoryEngine()
|
||||
newEngine := NewMemoryEngine(200)
|
||||
err = newEngine.EnablePersistence(persistenceConfig)
|
||||
if err != nil {
|
||||
t.Fatalf("EnablePersistence() for new engine error = %v", err)
|
||||
|
|
|
@ -11,7 +11,8 @@ type EngineConfig struct {
|
|||
PersistenceType PersistenceType // 持久化类型
|
||||
PersistenceDir string // 持久化目录
|
||||
SyncEvery int // 每写入多少条数据同步一次
|
||||
|
||||
// memory engine特有配置
|
||||
MemLen int
|
||||
// BoltDB特有配置
|
||||
BoltDBFilename string // BoltDB文件名
|
||||
BoltDBOptions *BoltDBConfig // BoltDB选项
|
||||
|
@ -25,7 +26,7 @@ func NewStorageEngine(config EngineConfig) (StorageEngine, error) {
|
|||
switch config.PersistenceType {
|
||||
case PersistenceTypeNone, PersistenceTypeWAL:
|
||||
// 创建内存存储引擎
|
||||
memEngine := NewMemoryEngine()
|
||||
memEngine := NewMemoryEngine(config.MemLen)
|
||||
|
||||
// 如果需要持久化,启用WAL
|
||||
if config.PersistenceType == PersistenceTypeWAL {
|
||||
|
|
Loading…
Reference in New Issue