func (s *scanCoordinator) handleScanRequest(req *ScanRequest, w ScanResponseWriter, is IndexSnapshot, t0 time.Time) { waitTime := time.Now().Sub(t0) scanPipeline := NewScanPipeline(req, w, is) cancelCb := NewCancelCallback(req, func(e error) { scanPipeline.Cancel(e) }) cancelCb.Run() defer cancelCb.Done() err := scanPipeline.Execute() scanTime := time.Now().Sub(t0) req.Stats.numRowsReturned.Add(int64(scanPipeline.RowsRead())) req.Stats.scanBytesRead.Add(int64(scanPipeline.BytesRead())) req.Stats.scanDuration.Add(scanTime.Nanoseconds()) req.Stats.scanWaitDuration.Add(waitTime.Nanoseconds()) logging.LazyVerbose(func() string { var status string if err != nil { status = fmt.Sprintf("(error = %s)", err) } else { status = "ok" } return fmt.Sprintf("%s RESPONSE rows:%d, waitTime:%v, totalTime:%v, status:%s", req.LogPrefix, scanPipeline.RowsRead(), waitTime, scanTime, status) }) }
func (s *scanCoordinator) serverCallback(protoReq interface{}, conn net.Conn, cancelCh <-chan interface{}) { req, err := s.newRequest(protoReq, cancelCh) w := NewProtoWriter(req.ScanType, conn) defer func() { s.handleError(req.LogPrefix, w.Done()) req.Done() }() logging.Verbosef("%s REQUEST %s", req.LogPrefix, req) if req.Consistency != nil { logging.LazyVerbose(func() string { return fmt.Sprintf("%s requested timestamp: %s => %s Crc64 => %v", req.LogPrefix, strings.ToLower(req.Consistency.String()), ScanTStoString(req.Ts), req.Ts.GetCrc64()) }) } if s.tryRespondWithError(w, req, err) { return } req.Stats.numRequests.Add(1) t0 := time.Now() is, err := s.getRequestedIndexSnapshot(req) if s.tryRespondWithError(w, req, err) { return } defer DestroyIndexSnapshot(is) logging.LazyVerbose(func() string { return fmt.Sprintf("%s snapshot timestamp: %s", req.LogPrefix, ScanTStoString(is.Timestamp())) }) s.processRequest(req, w, is, t0) }