fix rescheduling issue

This commit is contained in:
garionion 2020-12-29 13:01:30 +01:00
parent 1f3e1d284d
commit 7b0cdac7c3
3 changed files with 27 additions and 17 deletions

28
main.go
View File

@ -45,9 +45,8 @@ type ScheduledJob struct {
func schedulePlayout(s *store.Store) fiber.Handler { func schedulePlayout(s *store.Store) fiber.Handler {
// TODO return custom error // TODO return custom error
return func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error {
var p playout.Job var p *playout.Job
job := new(Job) job := new(Job)
jsonErr := json.Unmarshal(c.Body(), job) jsonErr := json.Unmarshal(c.Body(), job)
if jsonErr != nil { if jsonErr != nil {
log.Println("got defective request: ", jsonErr) log.Println("got defective request: ", jsonErr)
@ -60,6 +59,18 @@ func schedulePlayout(s *store.Store) fiber.Handler {
return errors.New("Got Empty Source. I can't play »Nothing«") return errors.New("Got Empty Source. I can't play »Nothing«")
} }
var output string
newPlayoutJob := new(playout.Job)
s.RLock()
olPlayoutJob, playoutExists := s.Playouts[job.ID]
s.RUnlock()
if playoutExists {
p = olPlayoutJob
} else {
p = newPlayoutJob
p.ControlChannel = make(chan string)
}
p.ID = job.ID p.ID = job.ID
p.Source = job.Source p.Source = job.Source
p.Version = job.Version p.Version = job.Version
@ -70,17 +81,14 @@ func schedulePlayout(s *store.Store) fiber.Handler {
p.StopAt = job.StopAt p.StopAt = job.StopAt
} }
var output string
s.RLock()
oldPlayout, playoutExists := s.Playouts[job.ID]
s.RUnlock()
if playoutExists { if playoutExists {
oldPlayout.ControlChannel <- "reschedule" p.ControlChannel <- "reschedule"
output = oldPlayout.Output output = p.Output
} else { } else {
var err error var err error
s.Lock() s.Lock()
output, err = s.AddPlayout(&p) output, err = s.AddPlayout(p)
s.Unlock() s.Unlock()
if err != nil { if err != nil {
c.SendStatus(500) c.SendStatus(500)
@ -100,7 +108,7 @@ func schedulePlayout(s *store.Store) fiber.Handler {
for { for {
select { select {
case ctrlMsg := <-p.ControlChannel: case ctrlMsg := <-p.ControlChannel:
fmt.Println(ctrlMsg) log.Println(ctrlMsg)
continue continue
case <-time.After(time.Until(p.StartAt)): case <-time.After(time.Until(p.StartAt)):
break Waiting break Waiting

View File

@ -95,6 +95,8 @@ func (p *Job) Playout(cfg *Config) {
playoutScript := path.Join(cfg.PlayoutScriptPath, cfg.PlayoutScript) playoutScript := path.Join(cfg.PlayoutScriptPath, cfg.PlayoutScript)
for { for {
log.Printf("Start Playout for %v", p.ID) log.Printf("Start Playout for %v", p.ID)
log.Println(p.StopAt)
log.Println(time.Until(p.StopAt))
cmd := exec.Command(playoutScript, //nolint:gosec cmd := exec.Command(playoutScript, //nolint:gosec
"-i", p.Source, "-i", p.Source,
"-o", p.Output, "-o", p.Output,

View File

@ -38,13 +38,13 @@ func NewStore(o []string, defaultDuration string, playoutScriptPath string, play
func (s *Store) AddPlayout(p *playout.Job) (string, error) { func (s *Store) AddPlayout(p *playout.Job) (string, error) {
outputs := s.Outputs outputs := s.Outputs
for _, value := range s.Playouts { for _, job := range s.Playouts {
if len(outputs) != 0 && if p.StartAt.After(job.StartAt) && p.StartAt.Before(job.StopAt) ||
(value.StartAt.After(p.StartAt) && value.StartAt.Before(p.StopAt) || p.StopAt.After(job.StartAt) && p.StopAt.Before(job.StopAt) ||
value.StopAt.After(p.StartAt) && value.StopAt.Before(p.StopAt) || job.StartAt.After(p.StartAt) && job.StartAt.Before(p.StopAt) ||
p.StartAt.After(value.StartAt) && p.StartAt.Before(value.StopAt) || job.StopAt.After(p.StartAt) && job.StopAt.Before(p.StopAt) ||
p.StopAt.After(value.StartAt) && p.StopAt.Before(value.StopAt)) { job.StartAt == p.StartAt || job.StopAt == p.StopAt {
inSlice, index := stringInSlice(value.Output, outputs) inSlice, index := stringInSlice(job.Output, outputs)
if inSlice { if inSlice {
outputs = remove(outputs, index) outputs = remove(outputs, index)
} }