Exemple #1
0
// fetch returns the anchor files and subdirectories rooted at zdir
func fetch(z *zookeeper.Conn, zdir string, children []string) (dirs map[string]struct{}, files map[circuit.WorkerID]*File, err error) {
	dirs = make(map[string]struct{})
	files = make(map[circuit.WorkerID]*File)
	for _, name := range children {
		id, err := circuit.ParseWorkerID(name)
		if err != nil {
			// Node names that are not files are ok.
			// We treat them as subdirectories.
			dirs[name] = struct{}{}
			continue
		}
		znode := path.Join(zdir, name)
		data, _, err := z.Get(znode)
		if err != nil {
			// If this is a Zookeeper connection error, we should bail out
			log.Printf("Problem getting node `%s` from Zookeeper (%s)", znode, err)
			continue
		}
		zfile := &ZFile{}
		r := bytes.NewBufferString(data)
		if err := gob.NewDecoder(r).Decode(zfile); err != nil {
			log.Printf("anchor file cannot be parsed: (%s)", err)
			continue
		}

		if zfile.Addr.WorkerID() != id {
			log.Printf("anchor file name vs addr mismatch: %s vs %s\n", id, zfile.Addr.WorkerID())
			continue
		}
		file := &File{owner: zfile.Addr}
		files[id] = file
	}
	return dirs, files, nil
}