func (w *protoResponseWriter) Done() error { defer p.PutBlock(w.encBuf) defer p.PutBlock(w.rowBuf) if (w.scanType == ScanReq || w.scanType == ScanAllReq) && w.rowSize > 0 { res := &protobuf.ResponseStream{IndexEntries: w.rowEntries} err := protobuf.EncodeAndWrite(w.conn, *w.encBuf, res) if err != nil { return err } } return nil }
func (d *IndexScanDecoder) Routine() error { defer d.CloseWrite() defer d.CloseRead() var sk, docid []byte tmpBuf := p.GetBlock() defer p.PutBlock(tmpBuf) loop: for { row, err := d.ReadItem() switch err { case nil: case p.ErrNoMoreItem, p.ErrSupervisorKill: break loop default: d.CloseWithError(err) break loop } t := (*tmpBuf)[:0] if d.p.req.isPrimary { sk, docid = piSplitEntry(row, t) } else { sk, docid = siSplitEntry(row, t) } d.p.bytesRead += uint64(len(sk) + len(docid)) err = d.WriteItem(sk, docid) if err != nil { break } } return nil }
func (s *scanCoordinator) respondWithError(conn net.Conn, req *ScanRequest, err error) { var res interface{} buf := p.GetBlock() defer p.PutBlock(buf) protoErr := &protobuf.Error{Error: proto.String(err.Error())} switch req.ScanType { case StatsReq: res = &protobuf.StatisticsResponse{ Err: protoErr, } case CountReq: res = &protobuf.CountResponse{ Count: proto.Int64(0), Err: protoErr, } case ScanAllReq, ScanReq: res = &protobuf.ResponseStream{ Err: protoErr, } } err2 := protobuf.EncodeAndWrite(conn, *buf, res) if err2 != nil { err = fmt.Errorf("%s, %s", err, err2) goto finish } err2 = protobuf.EncodeAndWrite(conn, *buf, &protobuf.StreamEndResponse{}) if err2 != nil { err = fmt.Errorf("%s, %s", err, err2) } finish: logging.Errorf("%s RESPONSE Failed with error (%s)", req.LogPrefix, err) }