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 }