func mustWait(s *store.Store, n int64) <-chan store.Event { c, err := s.Wait(store.Any, n) if err != nil { panic(err) } return c }
func sendLearn(out chan<- Packet, p *packet, st *store.Store) { if p.msg.Cmd != nil && *p.msg.Cmd == msg_INVITE { ch, err := st.Wait(store.Any, *p.Seqn) if err == store.ErrTooLate { log.Println(err) } else { e := <-ch m := msg{ Seqn: &e.Seqn, Cmd: learn, Value: []byte(e.Mut), } buf, _ := proto.Marshal(&m) out <- Packet{p.Addr, buf} } } }
func activate(st *store.Store, self string, c *doozer.Conn) int64 { rev, _ := st.Snap() for _, base := range store.Getdir(st, calDir) { p := calDir + "/" + base v, rev := st.Get(p) if rev != store.Dir && v[0] == "" { seqn, err := c.Set(p, rev, []byte(self)) if err != nil { log.Println(err) continue } return seqn } } for { ch, err := st.Wait(calGlob, rev+1) if err != nil { panic(err) } ev, ok := <-ch if !ok { panic(os.EOF) } rev = ev.Rev // TODO ev.IsEmpty() if ev.IsSet() && ev.Body == "" { seqn, err := c.Set(ev.Path, ev.Rev, []byte(self)) if err != nil { log.Println(err) continue } return seqn } else if ev.IsSet() && ev.Body == self { return ev.Seqn } } return 0 }
func generateRuns(rev, alpha int64, st *store.Store, runs chan<- *run, t run) { for { ch, err := st.Wait(store.Any, rev) if err != nil { panic(err) // can't happen } e := <-ch if closed(ch) { break } rev = e.Seqn + 1 r := t r.seqn = e.Seqn + alpha r.cals = getCals(e) r.addrs = getAddrs(e) r.c.size = len(r.cals) r.c.quor = r.quorum() r.c.crnd = r.indexOf(r.self) + int64(len(r.cals)) r.l.init(int64(r.quorum())) runs <- &r } }