// Fetch sends given fetch request to kafka node and returns related response. // Calling this method on closed connection will always return ErrClosed. func (c *connection) Fetch(req *proto.FetchReq) (*proto.FetchResp, error) { var ok bool if req.CorrelationID, ok = <-c.nextID; !ok { return nil, c.stopErr } if _, err := req.WriteTo(c.conn); err != nil { return nil, err } b, ok := <-c.respc[req.CorrelationID] if !ok { return nil, c.stopErr } return proto.ReadFetchResp(bytes.NewReader(b)) }
// Fetch sends given fetch request to kafka node and returns related response. // Calling this method on closed connection will always return ErrClosed. func (c *connection) Fetch(req *proto.FetchReq) (*proto.FetchResp, error) { var ok bool if req.CorrelationID, ok = <-c.nextID; !ok { return nil, c.stopErr } respc, err := c.respWaiter(req.CorrelationID) if err != nil { c.logger.Error("msg", "failed waiting for response", "error", err) return nil, fmt.Errorf("wait for response: %s", err) } if _, err := req.WriteTo(c.rw); err != nil { c.logger.Error("msg", "cannot write", "error", err) c.releaseWaiter(req.CorrelationID) return nil, err } b, ok := <-respc if !ok { return nil, c.stopErr } resp, err := proto.ReadFetchResp(bytes.NewReader(b)) if err != nil { return nil, err } // Compressed messages are returned in full batches for efficiency // (the broker doesn't need to decompress). // This means that it's possible to get some leading messages // with a smaller offset than requested. Trim those. for ti := range resp.Topics { topic := &resp.Topics[ti] reqTopic := &req.Topics[ti] for pi := range topic.Partitions { partition := &topic.Partitions[pi] reqPartition := &reqTopic.Partitions[pi] i := 0 for _, msg := range partition.Messages { if msg.Offset >= reqPartition.FetchOffset { break } i++ } partition.Messages = partition.Messages[i:] } } return resp, nil }
// Fetch sends given fetch request to kafka node and returns related response. // Calling this method on closed connection will always return ErrClosed. func (c *connection) Fetch(req *proto.FetchReq) (*proto.FetchResp, error) { var ok bool if req.CorrelationID, ok = <-c.nextID; !ok { return nil, c.stopErr } respc, err := c.respWaiter(req.CorrelationID) if err != nil { return nil, fmt.Errorf("wait for response: %s", err) } if _, err := req.WriteTo(c.rw); err != nil { c.releaseWaiter(req.CorrelationID) return nil, err } b, ok := <-respc if !ok { return nil, c.stopErr } return proto.ReadFetchResp(bytes.NewReader(b)) }