func (s *Service) processCreateIteratorRequest(conn net.Conn) { defer conn.Close() var itr influxql.Iterator if err := func() error { // Parse request. var req CreateIteratorRequest if err := DecodeLV(conn, &req); err != nil { return err } // Collect iterator creators for each shard. ics := make([]influxql.IteratorCreator, 0, len(req.ShardIDs)) for _, shardID := range req.ShardIDs { ic := s.TSDBStore.ShardIteratorCreator(shardID) if ic == nil { return nil } ics = append(ics, ic) } // Generate a single iterator from all shards. i, err := influxql.IteratorCreators(ics).CreateIterator(req.Opt) if err != nil { return err } itr = i return nil }(); err != nil { itr.Close() s.Logger.Printf("error reading CreateIterator request: %s", err) EncodeTLV(conn, createIteratorResponseMessage, &CreateIteratorResponse{Err: err}) return } // Encode success response. if err := EncodeTLV(conn, createIteratorResponseMessage, &CreateIteratorResponse{}); err != nil { s.Logger.Printf("error writing CreateIterator response: %s", err) return } // Exit if no iterator was produced. if itr == nil { return } // Stream iterator to connection. if err := influxql.NewIteratorEncoder(conn).EncodeIterator(itr); err != nil { s.Logger.Printf("error encoding CreateIterator iterator: %s", err) return } }
func (s *Service) processCreateIteratorRequest(conn net.Conn) { defer conn.Close() var itr influxql.Iterator if err := func() error { // Parse request. var req CreateIteratorRequest if err := DecodeLV(conn, &req); err != nil { return err } sh, ok := s.TSDBStore.(ShardIteratorCreator) if !ok { return errors.New("unable to access a specific shard with this tsdb store") } // Collect iterator creators for each shard. ics := make([]influxql.IteratorCreator, 0, len(req.ShardIDs)) for _, shardID := range req.ShardIDs { ic := sh.ShardIteratorCreator(shardID) if ic == nil { continue } ics = append(ics, ic) } // Return immediately if there are no iterator creators. if len(ics) == 0 { return nil } // Generate a single iterator from all shards. i, err := influxql.IteratorCreators(ics).CreateIterator(req.Opt) if err != nil { return err } itr = i return nil }(); err != nil { s.Logger.Printf("error reading CreateIterator request: %s", err) EncodeTLV(conn, createIteratorResponseMessage, &CreateIteratorResponse{Err: err}) return } resp := CreateIteratorResponse{} if itr != nil { switch itr.(type) { case influxql.FloatIterator: resp.Type = influxql.Float case influxql.IntegerIterator: resp.Type = influxql.Integer case influxql.StringIterator: resp.Type = influxql.String case influxql.BooleanIterator: resp.Type = influxql.Boolean } resp.Stats = itr.Stats() } // Encode success response. if err := EncodeTLV(conn, createIteratorResponseMessage, &resp); err != nil { s.Logger.Printf("error writing CreateIterator response: %s", err) return } // Exit if no iterator was produced. if itr == nil { return } // Stream iterator to connection. if err := influxql.NewIteratorEncoder(conn).EncodeIterator(itr); err != nil { s.Logger.Printf("error encoding CreateIterator iterator: %s", err) return } }