From fed7311d9c6880c3250332b45c0bc755da492369 Mon Sep 17 00:00:00 2001 From: bnkai <48220860+bnkai@users.noreply.github.com> Date: Wed, 22 Jan 2020 05:54:38 +0200 Subject: [PATCH] Add timeout to neededGenerate function (#324) * Add timeout to neededGenerate function * * verbose and cosmetic fixes --- pkg/manager/manager_tasks.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/manager/manager_tasks.go b/pkg/manager/manager_tasks.go index 6f5272ad6..db6da95c4 100644 --- a/pkg/manager/manager_tasks.go +++ b/pkg/manager/manager_tasks.go @@ -165,8 +165,12 @@ func (s *singleton) Generate(sprites bool, previews bool, markers bool, transcod return } totalsNeeded := s.neededGenerate(scenes, sprites, previews, markers, transcodes) - logger.Infof("Generating %d sprites %d previews %d markers %d transcodes", totalsNeeded.sprites, totalsNeeded.previews, totalsNeeded.markers, totalsNeeded.transcodes) - + if totalsNeeded == nil { + logger.Infof("Taking too long to count content. Skipping...") + logger.Infof("Generating content") + } else { + logger.Infof("Generating %d sprites %d previews %d markers %d transcodes", totalsNeeded.sprites, totalsNeeded.previews, totalsNeeded.markers, totalsNeeded.transcodes) + } for i, scene := range scenes { s.Status.setProgress(i, total) if s.Status.stopping { @@ -208,6 +212,7 @@ func (s *singleton) Generate(sprites bool, previews bool, markers bool, transcod wg.Wait() } + logger.Infof("Generate finished") }() } @@ -461,6 +466,18 @@ type totalsGenerate struct { func (s *singleton) neededGenerate(scenes []*models.Scene, sprites, previews, markers, transcodes bool) *totalsGenerate { var totals totalsGenerate + const timeoutSecs = 90 * time.Second + + // create a control channel through which to signal the counting loop when the timeout is reached + chTimeout := make(chan struct{}) + + //run the timeout function in a separate thread + go func() { + time.Sleep(timeoutSecs) + chTimeout <- struct{}{} + }() + + logger.Infof("Counting content to generate...") for _, scene := range scenes { if scene != nil { if sprites { @@ -489,6 +506,13 @@ func (s *singleton) neededGenerate(scenes []*models.Scene, sprites, previews, ma } } } + //check for timeout + select { + case <-chTimeout: + return nil + default: + } + } return &totals }