Monitor logs and panics, doesn't block on start

master
Bel LaPointe 2018-10-09 18:32:25 -06:00
parent 682f69746e
commit bc794892a3
1 changed files with 13 additions and 17 deletions

View File

@ -2,7 +2,7 @@ package monitor
import ( import (
"errors" "errors"
"fmt" "local1/logger"
"time" "time"
"github.com/golang-collections/go-datastructures/queue" "github.com/golang-collections/go-datastructures/queue"
@ -34,21 +34,11 @@ func (monitor *Monitor) Submit(url string, interval time.Duration) error {
} }
func (monitor *Monitor) Start() error { func (monitor *Monitor) Start() error {
errs := make(chan error)
go func() { go func() {
if err := monitor.loop(); err != nil { if err := monitor.loop(); err != nil {
select { panic(err)
case errs <- err:
case <-time.After(time.Second * 5):
panic(err)
}
} }
}() }()
select {
case err := <-errs:
return fmt.Errorf("%s: %v", "monitor loop quit early", err)
case <-time.After(time.Second * 2):
}
return nil return nil
} }
@ -69,29 +59,35 @@ func (monitor *Monitor) loop() error {
} }
var err error var err error
if nextEvent, err = nextEventTime(queue); err != nil { if nextEvent, err = nextEventTime(queue); err != nil {
return err logger.Log("no next event time", err)
nextEvent = time.Now().Add(time.Minute * 60)
continue
} }
case <-time.After(nextEvent.Sub(time.Now())): case <-time.After(nextEvent.Sub(time.Now())):
items, err := queue.Get(1) items, err := queue.Get(1)
if err != nil { if err != nil {
return err logger.Fatal("can't get item")
} }
if len(items) == 0 { if len(items) == 0 {
logger.Log("no items in queue")
nextEvent = time.Now().Add(time.Minute * 60)
continue continue
} }
item, ok := items[0].(*Item) item, ok := items[0].(*Item)
if !ok { if !ok {
return errors.New("queue contains illegal item") logger.Fatal("queue contains illegal item")
} }
monitor.trigger(item.URL) monitor.trigger(item.URL)
item.increment() item.increment()
queue.Put(item) queue.Put(item)
if nextEvent, err = nextEventTime(queue); err != nil { if nextEvent, err = nextEventTime(queue); err != nil {
return err logger.Log("no next event time", err)
nextEvent = time.Now().Add(time.Minute * 60)
continue
} }
} }
} }
return nil return errors.New("monitor loop exited")
} }
func nextEventTime(q *queue.PriorityQueue) (time.Time, error) { func nextEventTime(q *queue.PriorityQueue) (time.Time, error) {