重构:为核心组件实现 Reset 方法优化重置机制
为所有核心组件添加 Reset() 方法: - LogWriter.Reset(): 删除并重新创建日志文件,保持 index 和 wbuf 引用不变 - RecordIndex.Reset(): 清空索引数据并重新创建索引文件 - RecordQuery.Reset(): 关闭并重新打开日志文件 - ProcessCursor.Reset(): 删除位置文件并重置游标位置 - LogTailer.Reset(): 重置内部 channel 状态 优化 TopicProcessor.Reset() 实现: - 不再销毁和重建组件对象 - 通过调用各组件的 Reset() 方法重置状态 - 保持组件间引用关系稳定 - 减少代码行数约 20 行 - 避免空指针风险和内存分配开销 代码改进: - LogWriter 添加 path 字段用于重置 - 移除 topic_processor.go 中未使用的 os import - 职责分离更清晰,每个组件管理自己的重置逻辑 测试结果: - TestTopicReset: PASS - TestTopicResetWithPendingRecords: PASS - 所有 TopicProcessor 相关测试通过 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
35
writer.go
35
writer.go
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
// LogWriter 日志写入器
|
||||
type LogWriter struct {
|
||||
path string // 日志文件路径
|
||||
fd *os.File
|
||||
off int64 // 当前写入偏移
|
||||
dirtyOff int64 // 最后一次写入偏移
|
||||
@@ -33,6 +34,7 @@ func NewLogWriter(path string, index *RecordIndex) (*LogWriter, error) {
|
||||
off, _ := fd.Seek(0, 2) // 跳到尾部
|
||||
|
||||
w := &LogWriter{
|
||||
path: path,
|
||||
fd: fd,
|
||||
off: off,
|
||||
dirtyOff: -1,
|
||||
@@ -108,3 +110,36 @@ func (w *LogWriter) Close() error {
|
||||
}
|
||||
return w.fd.Close()
|
||||
}
|
||||
|
||||
// Reset 重置写入器,删除日志文件并重新创建
|
||||
// 保持 index 和 wbuf 引用不变
|
||||
func (w *LogWriter) Reset() error {
|
||||
w.mu.Lock()
|
||||
defer w.mu.Unlock()
|
||||
|
||||
// 关闭当前文件句柄
|
||||
if w.fd != nil {
|
||||
if err := w.fd.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
w.fd = nil
|
||||
}
|
||||
|
||||
// 删除日志文件
|
||||
if err := os.Remove(w.path); err != nil && !os.IsNotExist(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
// 重新创建文件
|
||||
fd, err := os.OpenFile(w.path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 重置状态
|
||||
w.fd = fd
|
||||
w.off = 0
|
||||
w.dirtyOff = -1
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user