func (a *ConsumerActor) Running() dfa.Letter { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() w := condition.NewNameWatch(a.grid.Etcd(), a.grid.Name(), a.flow.Name(), "finished") defer w.Stop() n := 0 finished := w.WatchUntil(ring.New(a.flow.NewContextualName("producer"), a.conf.NrProducers)) for { select { case <-a.exit: return Exit case <-a.chaos.C: return Failure case <-ticker.C: if err := a.started.Alive(); err != nil { return Failure } case <-finished: if err := a.SendCounts(); err != nil { return SendFailure } else { return EverybodyFinished } case err := <-w.WatchError(): log.Printf("%v: error: %v", a, err) return Failure case m := <-a.rx.Msgs(): switch m := m.(type) { case DataMsg: a.state.Counts[m.Producer]++ n++ if n%1000000 == 0 { log.Printf("%v: received: %v", a.ID(), n) } if n%1000 == 0 { if err := a.SendCounts(); err != nil { return SendFailure } } } } } }
func (a *LeaderActor) Starting() dfa.Letter { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() time.Sleep(3 * time.Second) j := condition.NewJoin(a.grid.Etcd(), 2*time.Minute, a.grid.Name(), a.flow.Name(), "started", a.ID()) if err := j.Rejoin(); err != nil { return Failure } a.started = j w := condition.NewCountWatch(a.grid.Etcd(), a.grid.Name(), a.flow.Name(), "started") defer w.Stop() f := condition.NewNameWatch(a.grid.Etcd(), a.grid.Name(), a.flow.Name(), "finished") defer f.Stop() started := w.WatchUntil(a.conf.NrConsumers + a.conf.NrProducers + 1) finished := f.WatchUntil(a.flow.NewContextualName("leader")) for { select { case <-a.exit: return Exit case <-a.chaos.C: return Failure case <-ticker.C: if err := a.started.Alive(); err != nil { return Failure } case <-started: return EverybodyStarted case <-finished: return EverybodyFinished } } }