processUploadTask 处理上传任务
(task *UploadTask)
| 306 | |
| 307 | // processUploadTask 处理上传任务 |
| 308 | func (m *BatchUploadManager) processUploadTask(task *UploadTask) { |
| 309 | defer func() { <-m.semaphore }() |
| 310 | |
| 311 | batch, err := m.GetBatch(task.BatchID) |
| 312 | if err != nil { |
| 313 | return |
| 314 | } |
| 315 | |
| 316 | // 获取 fileUpload 的安全副本并使用线程安全的更新方法,避免在持有 batch.mu 时重复加锁导致死锁 |
| 317 | fileUploadPtr, exists := batch.GetFileUpload(task.FileID) |
| 318 | if !exists || fileUploadPtr == nil { |
| 319 | return |
| 320 | } |
| 321 | if m.IsBatchCancelled(task.BatchID) { |
| 322 | return |
| 323 | } |
| 324 | // 使用副本修改并通过 updateFileProgress 持久化,避免在同一 goroutine 中重复持有 mutex 导致死锁 |
| 325 | fileUpload := *fileUploadPtr |
| 326 | // 更新文件状态为上传中 |
| 327 | fileUpload.Status = "uploading" |
| 328 | fileUpload.StartTime = time.Now() |
| 329 | // 生成10-30之间的随机进度值 |
| 330 | if progress, err := rand.Int(rand.Reader, big.NewInt(21)); err == nil { |
| 331 | fileUpload.Progress = float64(10 + progress.Int64()) |
| 332 | } else { |
| 333 | fileUpload.Progress = 20 // 出错时使用默认值 |
| 334 | } |
| 335 | // 使用线程安全的更新接口(内部对 batch.mu 加锁) |
| 336 | m.updateFileProgress(task.BatchID, task.FileID, &fileUpload) |
| 337 | |
| 338 | // 执行上传 |
| 339 | err = m.executeUpload(task) |
| 340 | if err != nil { |
| 341 | if errors.Is(err, errBatchUploadCancelled) { |
| 342 | return |
| 343 | } |
| 344 | fileUpload.Status = "failed" |
| 345 | fileUpload.Error = err.Error() |
| 346 | fileUpload.Progress = 0 |
| 347 | batch.FailedFiles++ |
| 348 | m.updateFileProgress(task.BatchID, task.FileID, &fileUpload) |
| 349 | } else { |
| 350 | if m.IsBatchCancelled(task.BatchID) { |
| 351 | return |
| 352 | } |
| 353 | // executeUpload已经处理了所有状态更新,这里只需要更新批次计数 |
| 354 | batch.UploadedFiles++ |
| 355 | } |
| 356 | |
| 357 | fileUpload.UpdateTime = time.Now() |
| 358 | m.updateBatchStatus(batch) |
| 359 | } |
| 360 | |
| 361 | // executeUpload 执行文件上传 |
| 362 | func (m *BatchUploadManager) executeUpload(task *UploadTask) error { |
no test coverage detected