You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.9 KiB
165 lines
3.9 KiB
package pgc |
|
|
|
import ( |
|
"time" |
|
|
|
"go-common/app/job/main/tv/model/common" |
|
"go-common/app/job/main/tv/model/pgc" |
|
"go-common/library/log" |
|
) |
|
|
|
func (s *Service) addRetryEp(in *pgc.Content) { |
|
s.addRetryEps([]*pgc.Content{in}) |
|
} |
|
|
|
// addRetryEps adds eps into retry list |
|
func (s *Service) addRetryEps(in []*pgc.Content) { |
|
var ( |
|
epids []int |
|
newConts []*pgc.Content |
|
) |
|
for _, v := range in { |
|
if !s.retryLimit(false, int64(v.EPID)) { // filter retried too many times ep |
|
continue |
|
} |
|
newConts = append(newConts, v) |
|
epids = append(epids, v.EPID) |
|
} |
|
if len(newConts) == 0 { |
|
return |
|
} |
|
log.Warn("addRetryEps Add IDs %v", epids) |
|
s.ResuEps = append(s.ResuEps, newConts...) |
|
} |
|
|
|
// pickRetryEp picks the to-retry eps from memory |
|
func (s *Service) pickRetryEp() (res []*pgc.Content) { |
|
if len(s.ResuEps) == 0 { |
|
return |
|
} |
|
res = append(res, s.ResuEps...) |
|
log.Info("pickRetry EP Len %d", len(res)) |
|
s.ResuEps = make([]*pgc.Content, 0) |
|
return |
|
} |
|
|
|
// re-submit eps |
|
func (s *Service) resubEps() { |
|
defer s.waiter.Done() |
|
for { |
|
if s.daoClosed { |
|
log.Info("resubEps DB closed!") |
|
return |
|
} |
|
readyEps := s.pickRetryEp() // pick to-retry eps from memory |
|
if len(readyEps) == 0 { |
|
log.Info("resubEps Empty") |
|
time.Sleep(time.Duration(s.c.Cfg.SyncRetry.RetryFre)) |
|
continue |
|
} |
|
againEps := make([]*pgc.Content, 0) |
|
for _, ep := range readyEps { // retry them |
|
if err := s.epsSync(int64(ep.SeasonID), []*pgc.Content{ep}); err != nil { // if error, re-add this item into re-sub list |
|
log.Error("resubEps Sid %d, Epid %v, Err %v", ep.SeasonID, ep.EPID, err) |
|
againEps = append(againEps, ep) |
|
continue |
|
} |
|
retry := &common.SyncRetry{} |
|
retry.FromEp(0, int64(ep.EPID)) |
|
s.dao.DelRetry(ctx, retry) // after succ, del it from MC |
|
} |
|
if len(againEps) > 0 { |
|
s.addRetryEps(againEps) |
|
} |
|
time.Sleep(time.Duration(s.c.Cfg.SyncRetry.RetryFre)) |
|
} |
|
} |
|
|
|
func (s *Service) addRetrySn(in *pgc.TVEpSeason) { |
|
s.addRetrySns([]*pgc.TVEpSeason{in}) |
|
} |
|
|
|
// addRetrySns adds sns into retry list |
|
func (s *Service) addRetrySns(in []*pgc.TVEpSeason) { |
|
var ( |
|
sids []int64 |
|
newConts []*pgc.TVEpSeason |
|
) |
|
for _, v := range in { |
|
if !s.retryLimit(true, v.ID) { // filter retried too many times ep |
|
continue |
|
} |
|
newConts = append(newConts, v) |
|
sids = append(sids, v.ID) |
|
} |
|
log.Warn("addRetrySns Add IDs %v", sids) |
|
s.ResuSns = append(s.ResuSns, newConts...) |
|
} |
|
|
|
// pickRetryEp picks the to-retry eps from memory |
|
func (s *Service) pickRetrySn() (res []*pgc.TVEpSeason) { |
|
if len(s.ResuSns) == 0 { |
|
return |
|
} |
|
res = append(res, s.ResuSns...) |
|
log.Info("pickRetry Sn Len %d", len(res)) |
|
s.ResuSns = make([]*pgc.TVEpSeason, 0) |
|
return |
|
} |
|
|
|
// re-submit eps |
|
func (s *Service) resubSns() { |
|
defer s.waiter.Done() |
|
for { |
|
if s.daoClosed { |
|
log.Info("resubSns DB closed!") |
|
return |
|
} |
|
readySns := s.pickRetrySn() |
|
if len(readySns) == 0 { |
|
log.Info("resubSns Empty") |
|
time.Sleep(time.Duration(s.c.Cfg.SyncRetry.RetryFre)) |
|
continue |
|
} |
|
againSns := make([]*pgc.TVEpSeason, 0) |
|
for _, sn := range readySns { |
|
if err := s.snSync(sn); err != nil { // if error, re-add this item into re-sub list |
|
log.Error("resubSns Sid %d, Err %v", sn.ID, err) |
|
againSns = append(againSns, sn) |
|
continue |
|
} |
|
retry := &common.SyncRetry{} |
|
retry.FromSn(0, sn.ID) |
|
s.dao.DelRetry(ctx, retry) |
|
} |
|
if len(againSns) > 0 { |
|
s.addRetrySns(againSns) |
|
} |
|
time.Sleep(time.Duration(s.c.Cfg.SyncRetry.RetryFre)) |
|
} |
|
} |
|
|
|
// retryLimit limits the retry times |
|
func (s *Service) retryLimit(isSn bool, id int64) bool { |
|
var req = &common.SyncRetry{} |
|
if isSn { |
|
req.FromSn(0, id) |
|
} else { |
|
req.FromEp(0, id) |
|
} |
|
retryTms, err := s.dao.GetRetry(ctx, req) |
|
if err != nil { |
|
log.Error("GetRetry Req %s, Err %v", req.MCKey(), err) |
|
return true |
|
} |
|
if retryTms > s.c.Cfg.SyncRetry.MaxRetry { |
|
log.Error("retryLimit Req %s, Retry Already %d times, stop here", req.MCKey(), retryTms) |
|
return false |
|
} |
|
s.dao.SetRetry(ctx, &common.SyncRetry{ |
|
Ctype: req.Ctype, |
|
CID: req.CID, |
|
Retry: retryTms + 1, |
|
}) |
|
return true |
|
}
|
|
|