@@ -42,8 +42,8 @@ type SliceUploadSession struct {
42
42
// NewSliceUploadManager 创建分片上传管理器
43
43
func NewSliceUploadManager () * SliceUploadManager {
44
44
manager := & SliceUploadManager {}
45
- // 启动时恢复未完成的上传任务
46
- go manager .recoverIncompleteUploads ()
45
+ // 系统重启后清理未完成的上传任务,因为前端session会失效
46
+ go manager .cleanupIncompleteUploads ()
47
47
return manager
48
48
}
49
49
@@ -532,18 +532,18 @@ func (sw *sliceWriter) Write(p []byte) (int, error) {
532
532
return n , err
533
533
}
534
534
535
- // recoverIncompleteUploads 恢复重启后未完成的上传任务
536
- func (m * SliceUploadManager ) recoverIncompleteUploads () {
535
+ // cleanupIncompleteUploads 清理重启后未完成的上传任务和临时文件
536
+ func (m * SliceUploadManager ) cleanupIncompleteUploads () {
537
537
defer func () {
538
538
if r := recover (); r != nil {
539
- log .Errorf ("Panic in recoverIncompleteUploads : %v" , r )
539
+ log .Errorf ("Panic in cleanupIncompleteUploads : %v" , r )
540
540
}
541
541
}()
542
542
543
543
// 等待一段时间,确保系统完全启动
544
544
time .Sleep (10 * time .Second )
545
545
546
- log .Info ("Starting recovery of incomplete slice uploads..." )
546
+ log .Info ("Starting cleanup of incomplete slice uploads after restart ..." )
547
547
548
548
// 查询所有未完成的上传任务
549
549
incompleteUploads , err := db .GetIncompleteSliceUploads ()
@@ -557,67 +557,43 @@ func (m *SliceUploadManager) recoverIncompleteUploads() {
557
557
return
558
558
}
559
559
560
- log .Infof ("Found %d incomplete slice uploads, starting recovery ..." , len (incompleteUploads ))
560
+ log .Infof ("Found %d incomplete slice uploads, starting cleanup ..." , len (incompleteUploads ))
561
561
562
+ cleanedCount := 0
562
563
for _ , upload := range incompleteUploads {
563
- m .recoverSingleUpload (upload )
564
+ if m .cleanupSingleUpload (upload ) {
565
+ cleanedCount ++
566
+ }
564
567
}
565
568
566
- log .Info ("Slice upload recovery completed" )
569
+ log .Infof ("Slice upload cleanup completed, cleaned up %d tasks" , cleanedCount )
567
570
}
568
571
569
- // recoverSingleUpload 恢复单个上传任务
570
- func (m * SliceUploadManager ) recoverSingleUpload (upload * tables.SliceUpload ) {
572
+ // cleanupSingleUpload 清理单个上传任务
573
+ func (m * SliceUploadManager ) cleanupSingleUpload (upload * tables.SliceUpload ) bool {
571
574
defer func () {
572
575
if r := recover (); r != nil {
573
- log .Errorf ("Panic in recoverSingleUpload for task %s: %v" , upload .TaskID , r )
576
+ log .Errorf ("Panic in cleanupSingleUpload for task %s: %v" , upload .TaskID , r )
574
577
}
575
578
}()
576
579
577
- log .Infof ("Recovering upload task: %s, status: %s" , upload .TaskID , upload .Status )
578
-
579
- // 检查是否所有切片都已上传完成
580
- if tables .IsAllSliceUploaded (upload .SliceUploadStatus , upload .SliceCnt ) {
581
- // 所有切片都已完成,尝试完成上传
582
- log .Infof ("All slices completed for task %s, attempting to complete upload" , upload .TaskID )
583
- m .attemptCompleteUpload (upload )
584
- return
585
- }
586
-
587
- // 部分切片未完成的情况
588
- completedSlices := tables .CountUploadedSlices (upload .SliceUploadStatus )
589
- log .Infof ("Task %s: %d/%d slices completed, marking as available for resume" ,
590
- upload .TaskID , completedSlices , upload .SliceCnt )
591
-
592
- // 更新状态为等待用户继续上传
593
- upload .Status = tables .SliceUploadStatusWaiting
594
- upload .Message = "Ready for resume after server restart"
595
- if err := db .UpdateSliceUpload (upload ); err != nil {
596
- log .Errorf ("Failed to update slice upload status for task %s: %v" , upload .TaskID , err )
597
- }
580
+ log .Infof ("Cleaning up upload task: %s, status: %s" , upload .TaskID , upload .Status )
598
581
599
- // 如果有临时文件但文件不存在,清理记录
582
+ // 清理临时文件
600
583
if upload .TmpFile != "" {
601
- if _ , err := os .Stat (upload .TmpFile ); os .IsNotExist (err ) {
602
- log .Warnf ("Temporary file lost for task %s, cleaning up" , upload .TaskID )
603
- if err := db .DeleteSliceUploadByTaskID (upload .TaskID ); err != nil {
604
- log .Errorf ("Failed to clean up lost task %s: %v" , upload .TaskID , err )
605
- }
584
+ if err := os .Remove (upload .TmpFile ); err != nil && ! os .IsNotExist (err ) {
585
+ log .Warnf ("Failed to remove temp file %s for task %s: %v" , upload .TmpFile , upload .TaskID , err )
586
+ } else {
587
+ log .Debugf ("Removed temp file: %s" , upload .TmpFile )
606
588
}
607
589
}
608
- }
609
-
610
- // attemptCompleteUpload 尝试完成上传(用于恢复已完成切片的任务)
611
- func (m * SliceUploadManager ) attemptCompleteUpload (upload * tables.SliceUpload ) {
612
- // 这里需要获取存储驱动,但在恢复阶段我们无法直接获取 storage driver
613
- // 所以我们将状态标记为待完成,等用户下次操作时自动完成
614
- upload .Status = tables .SliceUploadStatusPendingComplete
615
- upload .Message = "All slices completed, waiting for final completion"
616
590
617
- if err := db .UpdateSliceUpload (upload ); err != nil {
618
- log .Errorf ("Failed to update slice upload to pending complete for task %s: %v" , upload .TaskID , err )
619
- return
591
+ // 从数据库中删除任务记录
592
+ if err := db .DeleteSliceUploadByTaskID (upload .TaskID ); err != nil {
593
+ log .Errorf ("Failed to delete slice upload task %s: %v" , upload .TaskID , err )
594
+ return false
620
595
}
621
596
622
- log .Infof ("Task %s marked as pending completion" , upload .TaskID )
597
+ log .Infof ("Successfully cleaned up task: %s" , upload .TaskID )
598
+ return true
623
599
}
0 commit comments