// Lookup looks up packets that match a given query within the files owned by a // single stenotype thread. func (t *Thread) Lookup(ctx context.Context, q query.Query) *base.PacketChan { t.mu.RLock() inputs := make(chan *base.PacketChan, concurrentBlockfileReadsPerThread) out := base.ConcatPacketChans(ctx, inputs) var files []*blockfile.BlockFile for _, file := range t.getSortedFiles() { files = append(files, t.files[file]) } t.mu.RUnlock() go func() { defer func() { close(inputs) <-out.Done() }() for _, file := range files { packets := base.NewPacketChan(100) select { case inputs <- packets: go file.Lookup(ctx, q, packets) case <-ctx.Done(): return } } }() return out }
// AllPackets returns a packet channel to which all packets in the blockfile are // sent. func (b *BlockFile) AllPackets() *base.PacketChan { b.mu.RLock() c := base.NewPacketChan(100) go func() { defer b.mu.RUnlock() pkts := &allPacketsIter{BlockFile: b} for pkts.Next() { c.Send(pkts.Packet()) } c.Close(pkts.Err()) }() return c }