// Send segments for the specified file to r.toGet. Send a *cfReader // to rdrChan if the specified file is found (even if it's empty). // Then, close rdrChan. func (kc *KeepClient) queueSegmentsToGet(m manifest.Manifest, filename string, rdrChan chan *cfReader) { defer close(rdrChan) // q is a queue of FileSegments that we have received but // haven't yet been able to send to toGet. var q []*manifest.FileSegment var r *cfReader for seg := range m.FileSegmentIterByName(filename) { if r == nil { // We've just discovered that the requested // filename does appear in the manifest, so we // can return a real reader (not nil) from // CollectionFileReader(). r = newCFReader(kc) rdrChan <- r } q = append(q, seg) r.totalSize += uint64(seg.Len) // Send toGet as many segments as we can until it // blocks. Q: for len(q) > 0 { select { case r.toGet <- q[0]: q = q[1:] default: break Q } } } if r == nil { // File not found. return } close(r.countDone) for _, seg := range q { r.toGet <- seg } close(r.toGet) }