// Elect chooses a seed node, and returns a connection to a cal. // If this process is the seed, returns nil. func elect(name, id, laddr string, b *doozer.Conn) *doozer.Conn { // advertise our presence, since we might become a cal nspath := "/ctl/ns/" + name + "/" + id r, err := b.Set(nspath, 0, []byte(laddr)) if err != nil { panic(err) } // fight to be the seed _, err = b.Set("/ctl/boot/"+name, 0, []byte(id)) if err, ok := err.(*doozer.Error); ok && err.Err == doozer.ErrOldRev { // we lost, lookup addresses again cl := lookupAndAttach(b, name) if cl == nil { panic("failed to attach after losing election") } // also delete our entry, since we're not officially a cal yet. // it gets set again in peer.Main when we become a cal. err := b.Del(nspath, r) if err != nil { panic(err) } return cl } else if err != nil { panic(err) } return nil // we are the seed node -- don't attach }
func writer( conn *doozer.Conn, root string, entryc chan *journal.Entry, errc chan error, ) { for entry := range entryc { if strings.HasPrefix(entry.Path, root) && !strings.HasPrefix(entry.Path, journal.InternalPrefix) { var err error switch entry.Op { case journal.OpSet: _, e := conn.Set(entry.Path, -1, entry.Value) if e != nil { err = fmt.Errorf("unable setting '%s' to '%s'", entry.Path, string(entry.Value)) } case journal.OpDel: e := conn.Del(entry.Path, -1) if e != nil { err = fmt.Errorf("unable deleting '%s'", entry.Path) } default: err = fmt.Errorf("unknown operation %s", entry.Op) } if err != nil { errc <- err return } b, err := journal.Marshal(entry) if err != nil { continue } fmt.Println(string(b)) } } }