@@ -218,7 +218,9 @@ func (s *SESSION) GoWorker(wid int, provider *Provider, waitWorker *sync.WaitGro
218218 dlog (always , "CheckRoutine: wid=%d provider='%s' timeout reached, exiting. lastGood: %v" , wid , provider .Name , time .Since (lastGood ))
219219 return
220220 }
221- dlog (always , "CheckRoutine: wid=%d provider='%s' still alive, waiting on segCC len=%d timeout in: %v (lastGood: %v)" , wid , provider .Name , len (segCC ), time .Until (timeOut ), time .Since (lastGood ))
221+ if time .Since (lastGood ) > 9 * time .Second {
222+ dlog (always , "CheckRoutine: wid=%d provider='%s' waiting on segCC len=%d timeout in: %v (lastGood: %v)" , wid , provider .Name , len (segCC ), time .Until (timeOut ), time .Since (lastGood ))
223+ }
222224 case item , ok := <- segCC :
223225 if ! ok {
224226 dlog (always , "CheckRoutine: channel closed wid=%d provider='%s'" , wid , provider .Name )
@@ -282,7 +284,9 @@ func (s *SESSION) GoWorker(wid int, provider *Provider, waitWorker *sync.WaitGro
282284 dlog (always , "GoDownsRoutine: wid=%d provider='%s' timeout reached, exiting. lastGood: %v" , wid , provider .Name , time .Since (lastGood ))
283285 return
284286 }
285- dlog (always && segcheckdone , "GoDownsRoutine: wid=%d provider='%s' still alive, waiting on segCD len=%d timeout in: %v (lastGood: %v)" , wid , provider .Name , len (segCD ), time .Until (timeOut ), time .Since (lastGood ))
287+ if time .Since (lastGood ) > 9 * time .Second {
288+ dlog (always && segcheckdone , "GoDownsRoutine: wid=%d provider='%s' waiting on segCD len=%d timeout in: %v (lastGood: %v)" , wid , provider .Name , len (segCD ), time .Until (timeOut ), time .Since (lastGood ))
289+ }
286290 case item , ok := <- segCD :
287291 if ! ok {
288292 dlog (always , "GoDownsRoutine: channel closed wid=%d provider='%s'" , wid , provider .Name )
@@ -372,7 +376,9 @@ func (s *SESSION) GoWorker(wid int, provider *Provider, waitWorker *sync.WaitGro
372376 dlog (always , "ReupsRoutine: wid=%d provider='%s' timeout reached, exiting. lastGood: %v" , wid , provider .Name , time .Since (lastGood ))
373377 return
374378 }
375- dlog (always , "ReupsRoutine: wid=%d provider='%s' still alive, waiting on segCR len=%d timeout in: %v (lastgood: %v)" , wid , provider .Name , len (segCR ), time .Until (timeOut ), time .Since (lastGood ))
379+ if time .Since (lastGood ) > 9 * time .Second {
380+ dlog (always , "ReupsRoutine: wid=%d provider='%s' waiting on segCR len=%d timeout in: %v (lastgood: %v)" , wid , provider .Name , len (segCR ), time .Until (timeOut ), time .Since (lastGood ))
381+ }
376382 case item , ok := <- segCR :
377383 if ! ok {
378384 dlog (always , "ReupsRoutine: channel closed wid=%d provider='%s'" , wid , provider .Name )
@@ -687,7 +693,7 @@ providerUp:
687693 IncreaseUPQueueCnt () // increment upQueueCnt counter
688694 //GCounter.IncrMax("upQueueCnt", uint64(len(s.segmentList)), "pushUP")
689695 //GCounter.IncrMax("TOTAL_upQueueCnt", uint64(len(s.segmentList)), "pushUP")
690- dlog (always , " | pushUP: in chan seg.Id='%s' @ #'%s'" , item .segment .Id , s .providerList [pid ].Group )
696+ dlog (cfg . opt . DebugWorker , " | pushUP: in chan seg.Id='%s' @ #'%s'" , item .segment .Id , s .providerList [pid ].Group )
691697 return true , 0 , 0 , nil // return after 1st push to a group!
692698 default :
693699 //dlog(cfg.opt.BUG "DEBUG SPAM pushUP: chan is full @ '%s'", s.providerList[pid].Name)
@@ -735,6 +741,9 @@ func (s *SESSION) GoWorkDivider(waitDivider *sync.WaitGroup, waitDividerDone *sy
735741 fetchedtoDL , fetchedtoUP , backlogDL , refillUP , pushedDL , pushedUP := uint64 (0 ), uint64 (0 ), uint64 (0 ), uint64 (0 ), uint64 (0 ), uint64 (0 )
736742 startLoop := time .Now ()
737743 deadWorkersDeadline := 9
744+ deadcounter := 10
745+ var capture_done , capture_segm , capture_isdl , capture_isup float64
746+
738747forever:
739748 for {
740749
@@ -776,6 +785,12 @@ forever:
776785 for _ , item := range s .segmentList {
777786 item .mux .PrintStatus (false )
778787
788+ if deadcounter <= 0 {
789+ dlog (always , "GoWorkDivider: counters not increasing for too long, exiting" )
790+ closeCase = "noProgress"
791+ break forever
792+ }
793+
779794 item .mux .RLock () // RLOCKS HERE #824d
780795 if item .flagCache {
781796 cached ++
@@ -873,6 +888,10 @@ forever:
873888
874889 } // end for forsegmentList
875890 //dlog(cfg.opt.DebugWorker, " | [DV] lastRunTook='%d ms' '%v", lastRunTook.Milliseconds(), lastRunTook)
891+ s .mux .RLock ()
892+ checkFeedDone := s .checkFeedDone // read value of s.checkDone
893+ segcheckdone := s .segcheckdone // read value of s.segcheckdone
894+ s .mux .RUnlock ()
876895
877896 // part to print stats begins here
878897 upQ = GCounter .GetValue ("upQueueCnt" )
@@ -893,9 +912,37 @@ forever:
893912 isup_perc := float64 (isup ) / float64 (todo ) * 100
894913 dmca_perc := float64 (dmca ) / float64 (todo ) * 100
895914 yenc_perc := float64 (isyenc ) / float64 (todo ) * 100
896-
897915 used_slots , max_slots := memlim .Usage ()
898916
917+ if segm_perc > capture_segm {
918+ capture_segm = segm_perc
919+ deadcounter = 10 // reset deadcounter
920+ } else if segm_perc < 100 && segm_perc == capture_segm {
921+ deadcounter --
922+ dlog (always , "GoWorkDivider: segm_perc not increasing, deadcounter=%d" , deadcounter )
923+
924+ } else if segcheckdone && done_perc > capture_done {
925+ capture_done = done_perc
926+ deadcounter = 10 // reset deadcounter
927+ } else if segcheckdone && done_perc < 100 && done_perc == capture_done {
928+ deadcounter --
929+ dlog (always , "GoWorkDivider: done_perc not increasing, deadcounter=%d" , deadcounter )
930+
931+ } else if segcheckdone && isdl_perc > capture_isdl {
932+ capture_isdl = isdl_perc
933+ deadcounter = 10 // reset deadcounter
934+ } else if segcheckdone && isdl_perc < 100 && isdl_perc == capture_isdl {
935+ deadcounter --
936+ dlog (always , "GoWorkDivider: isdl_perc not increasing, deadcounter=%d" , deadcounter )
937+
938+ } else if segcheckdone && isup_perc > capture_isup {
939+ capture_isup = isup_perc
940+ deadcounter = 10 // reset deadcounter
941+ } else if segcheckdone && isup_perc < 100 && isup_perc == capture_isup {
942+ deadcounter --
943+ dlog (always , "GoWorkDivider: isup_perc not increasing, deadcounter=%d" , deadcounter )
944+ }
945+
899946 //log00 = fmt.Sprintf(" TODO: %d ", todo)
900947
901948 if (cfg .opt .CheckFirst || cfg .opt .CheckOnly ) || (checked > 0 && checked != segm && checked != done ) {
@@ -987,11 +1034,6 @@ forever:
9871034 }
9881035 } // print some stats ends here
9891036
990- s .mux .RLock ()
991- checkFeedDone := s .checkFeedDone // read value of s.checkDone
992- segcheckdone := s .segcheckdone // read value of s.segcheckdone
993- s .mux .RUnlock ()
994-
9951037 if ! segcheckdone && checked == todo && checkFeedDone {
9961038 s .mux .Lock ()
9971039 s .segmentCheckEndTime = time .Now ()
0 commit comments