CleanupFailedBatch 清理失败的批次
(batchID string)
| 138 | |
| 139 | // CleanupFailedBatch 清理失败的批次 |
| 140 | func (h *ErrorHandler) CleanupFailedBatch(batchID string) error { |
| 141 | log.Printf("开始清理失败的批次: BatchID=%s", batchID) |
| 142 | |
| 143 | batch, err := h.batchManager.GetBatch(batchID) |
| 144 | if err != nil { |
| 145 | return fmt.Errorf("获取批次失败: %v", err) |
| 146 | } |
| 147 | |
| 148 | // 清理所有文件记录 - 先收集 keys 避免在遍历时修改 map 导致并发问题 |
| 149 | batch.mu.RLock() |
| 150 | keys := make([]string, 0, len(batch.Files)) |
| 151 | for fid := range batch.Files { |
| 152 | keys = append(keys, fid) |
| 153 | } |
| 154 | batch.mu.RUnlock() |
| 155 | |
| 156 | for _, fileID := range keys { |
| 157 | if err := h.HandleInvalidConnection(batchID, fileID, fmt.Errorf("批次清理")); err != nil { |
| 158 | log.Printf("清理文件失败: FileID=%s, Error=%v", fileID, err) |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | // 标记批次为失败状态(在锁内修改状态) |
| 163 | batch.mu.Lock() |
| 164 | batch.Status = "failed" |
| 165 | batch.mu.Unlock() |
| 166 | h.batchManager.progressStorage.SaveBatch(batch) |
| 167 | |
| 168 | log.Printf("批次清理完成: BatchID=%s", batchID) |
| 169 | return nil |
| 170 | } |
| 171 | |
| 172 | // GetErrorHandler 获取全局错误处理器实例 |
| 173 | var globalErrorHandler *ErrorHandler |