func activate(st *store.Store, self string, c *client.Client, cal chan int) { logger := util.NewLogger("activate") ch := make(chan store.Event) st.GetDirAndWatch("/doozer/slot", ch) for ev := range ch { // TODO ev.IsEmpty() if ev.IsSet() && ev.Body == "" { _, err := c.Set(ev.Path, self, ev.Cas) if err != nil { logger.Println(err) continue } close(cal) close(ch) } } }
func Monitor(self string, st *store.Store, cl SetDeler) os.Error { mon := &monitor{ self: self, st: st, cl: cl, clock: make(chan ticker), units: make(map[string]unit), refs: make(map[string]int), exitCh: make(chan exit), readyCh: make(chan ready), logger: util.NewLogger("monitor"), } mon.logger.Println("reading units") evs := make(chan store.Event) st.GetDirAndWatch(ctlKey, evs) go func(c <-chan store.Event) { for e := range c { evs <- e } close(evs) }(st.Watch(lockKey + "/*")) for { select { case t := <-mon.clock: t.tick() case ev := <-evs: prefix, id := path.Split(ev.Path) switch prefix { case ctlDir: if ev.IsDel() { mon.logger.Println("\n\n\ndel", id) mon.decrefUnit(id) break } ut := mon.increfUnit(id) if ut == nil { break } switch ev.Body { case "start": ut.start() case "stop": ut.stop() case "auto", "": fallthrough default: // nothing } case lockDir: ut := mon.units[id] if ut == nil { break } ut.dispatchLockEvent(ev) } case e := <-mon.exitCh: e.e.exited(e.w) case r := <-mon.readyCh: r.r.ready(r.f) } } panic("unreachable") }