81 lines
1.6 KiB
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
|
|
}
|