From de35b14db9bb8dbfb8152d487ff76003df8086d0 Mon Sep 17 00:00:00 2001 From: cuidajun Date: Thu, 28 Jul 2022 18:36:52 +0800 Subject: [PATCH] fix: one piece task sometimes backsource after succeed (#1499) Signed-off-by: bigerous --- client/daemon/peer/peertask_conductor.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/client/daemon/peer/peertask_conductor.go b/client/daemon/peer/peertask_conductor.go index 4d72dce10..ff3741394 100644 --- a/client/daemon/peer/peertask_conductor.go +++ b/client/daemon/peer/peertask_conductor.go @@ -877,7 +877,11 @@ func (pt *peerTaskConductor) pullPiecesFromPeers(pieceRequestCh chan *DownloadPi ) // ensure first peer packet is not nil - peerPacket := pt.peerPacket.Load().(*scheduler.PeerPacket) + peerPacket, ok := pt.peerPacket.Load().(*scheduler.PeerPacket) + if !ok { + pt.Warn("pull pieces canceled") + return + } if len(peerPacket.CandidatePeers) == 0 { num, ok = pt.waitAvailablePeerPacket() if !ok { @@ -999,6 +1003,9 @@ func (pt *peerTaskConductor) initDownloadPieceWorkers(count int32, pieceRequestC func (pt *peerTaskConductor) waitFirstPeerPacket() (done bool, backSource bool) { // wait first available peer select { + case <-pt.successCh: + pt.Infof("peer task succeed too fast, no need to wait first peer") + return true, false case _, ok := <-pt.peerPacketReady: if ok { // preparePieceTasksByPeer func already send piece result with error