@@ -1086,11 +1086,16 @@ func (pt *peerTaskConductor) downloadPiece(workerID int32, request *DownloadPiec
1086
1086
pt .runningPieces .Set (request .piece .PieceNum )
1087
1087
pt .runningPiecesLock .Unlock ()
1088
1088
1089
- defer func () {
1090
- pt .runningPiecesLock .Lock ()
1091
- pt .runningPieces .Clean (request .piece .PieceNum )
1092
- pt .runningPiecesLock .Unlock ()
1093
- }()
1089
+ var cleanRunningPieceDone bool
1090
+ cleanRunningPiece := func () {
1091
+ if cleanRunningPieceDone {
1092
+ cleanRunningPieceDone = true
1093
+ pt .runningPiecesLock .Lock ()
1094
+ pt .runningPieces .Clean (request .piece .PieceNum )
1095
+ pt .runningPiecesLock .Unlock ()
1096
+ }
1097
+ }
1098
+ defer cleanRunningPiece ()
1094
1099
1095
1100
ctx , span := tracer .Start (pt .pieceDownloadCtx , fmt .Sprintf (config .SpanDownloadPiece , request .piece .PieceNum ))
1096
1101
span .SetAttributes (config .AttributePiece .Int (int (request .piece .PieceNum )))
@@ -1117,6 +1122,9 @@ func (pt *peerTaskConductor) downloadPiece(workerID int32, request *DownloadPiec
1117
1122
pt .Infof ("switch to back source, skip send failed piece" )
1118
1123
return result
1119
1124
}
1125
+
1126
+ // clean running piece first
1127
+ cleanRunningPiece ()
1120
1128
attempt , success := pt .pieceTaskSyncManager .acquire (
1121
1129
& commonv1.PieceTaskRequest {
1122
1130
Limit : 1 ,
0 commit comments