gotidb/pkg/engine/bolt/bolt_maintenance.go

81 lines
1.6 KiB
Go

package bolt
import (
"fmt"
"time"
bolt "go.etcd.io/bbolt"
)
// Compact 实现 Engine 接口
func (b *BoltEngine) Compact() error {
b.mu.Lock()
defer b.mu.Unlock()
if !b.opened || b.closed {
return fmt.Errorf("bolt engine not open")
}
// 执行数据库压缩
if err := b.db.Sync(); err != nil {
return fmt.Errorf("failed to sync database: %v", err)
}
// 更新统计信息
b.stats.CompactionCount++
b.stats.LastCompaction = time.Now()
return nil
}
// Cleanup 实现 Engine 接口
func (b *BoltEngine) Cleanup() error {
b.mu.Lock()
defer b.mu.Unlock()
if !b.opened || b.closed {
return fmt.Errorf("bolt engine not open")
}
// 清理空序列
err := b.db.Update(func(tx *bolt.Tx) error {
indexBucket := tx.Bucket([]byte(indexBucketName))
if indexBucket == nil {
return fmt.Errorf("index bucket not found")
}
return indexBucket.ForEach(func(k, v []byte) error {
seriesID := string(k)
bucket := tx.Bucket([]byte(seriesBucketPrefix + seriesID))
if bucket == nil {
return nil
}
// 如果序列为空,删除它
if bucket.Stats().KeyN == 0 {
if err := tx.DeleteBucket([]byte(seriesBucketPrefix + seriesID)); err != nil {
return fmt.Errorf("failed to delete empty series bucket: %v", err)
}
// 从索引中删除
if err := indexBucket.Delete(k); err != nil {
return fmt.Errorf("failed to delete series from index: %v", err)
}
}
return nil
})
})
if err != nil {
return fmt.Errorf("failed to cleanup: %v", err)
}
// 更新序列数
if err := b.updateSeriesCount(); err != nil {
return fmt.Errorf("failed to update series count: %v", err)
}
return nil
}