Browse Source

changed server to use goroutine for each group, using cond to fire checks

master
Christopher Ramey 3 years ago
parent
commit
534baa3ccb
  1. 34
      server.go

34
server.go

@ -2,15 +2,16 @@ package main
import ( import (
"fmt" "fmt"
"git.binarythought.com/cdramey/alrm/check"
"git.binarythought.com/cdramey/alrm/config" "git.binarythought.com/cdramey/alrm/config"
"time" "time"
"sync"
) )
func startServer(cfg *config.Config, debuglvl int) error { func startServer(cfg *config.Config, debuglvl int) error {
ch := make(chan check.Check, cfg.Threads)
for i := 0; i < cfg.Threads; i++ {
go worker(ch, debuglvl)
m := sync.Mutex{}
c := sync.NewCond(&m)
for _, g := range cfg.Groups {
go worker(g, c, debuglvl)
} }
t := time.NewTicker(cfg.Interval) t := time.NewTicker(cfg.Interval)
@ -21,24 +22,25 @@ func startServer(cfg *config.Config, debuglvl int) error {
if debuglvl > 0 { if debuglvl > 0 {
fmt.Printf("Interval check at %s\n", r) fmt.Printf("Interval check at %s\n", r)
} }
for _, g := range cfg.Groups {
for _, h := range g.Hosts {
for _, c := range h.Checks {
ch <- c
}
}
}
c.Broadcast()
} }
} }
return nil return nil
} }
func worker(ch chan check.Check, debuglvl int) {
func worker(g *config.Group, c *sync.Cond, debuglvl int) {
for { for {
chk := <-ch
err := chk.Check(debuglvl)
if err != nil {
fmt.Printf("Check error: %s\n", err)
c.L.Lock()
c.Wait()
c.L.Unlock()
for _, h := range g.Hosts {
for _, c := range h.Checks {
err := c.Check(debuglvl)
if err != nil {
fmt.Printf("Check error: %s\n", err)
}
}
} }
} }
} }
Loading…
Cancel
Save