// 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 }