func (s *server) doSearch(ctx context.Context, backend *Backend, q *client.Query) (*api.ReplySearch, error) { var cl client.Client var search client.Search var err error select { case cl = <-backend.Clients: case <-ctx.Done(): return nil, ErrTimedOut } defer backend.CheckIn(cl) search, err = cl.Query(q) if err != nil { log.Printf(ctx, "error talking to backend err=%s", err) return nil, err } reply := &api.ReplySearch{Results: make([]*client.Result, 0)} for r := range search.Results() { reply.Results = append(reply.Results, r) } reply.Info, err = search.Close() if err != nil { return nil, err } return reply, nil }
func (bk *Backend) CheckIn(c client.Client) { if c.Err() != nil { c.Close() bk.pending <- struct{}{} return } bk.Clients <- c }