func (s *localBlockAPIServer) PutBlock(putBlockServer pfsclient.BlockAPI_PutBlockServer) (retErr error) { result := &pfsclient.BlockRefs{} defer func(start time.Time) { s.Log(nil, result, retErr, time.Since(start)) }(time.Now()) defer drainBlockServer(putBlockServer) putBlockRequest, err := putBlockServer.Recv() if err != nil { if err != io.EOF { return err } // Allow empty PutBlock requests, in this case we don't create any actual blockRefs return putBlockServer.SendAndClose(result) } reader := bufio.NewReader(&putBlockReader{ server: putBlockServer, buffer: bytes.NewBuffer(putBlockRequest.Value), }) decoder := json.NewDecoder(reader) for { blockRef, err := s.putOneBlock(putBlockRequest.Delimiter, reader, decoder) if err != nil { return err } result.BlockRef = append(result.BlockRef, blockRef) if (blockRef.Range.Upper - blockRef.Range.Lower) < uint64(blockSize) { break } } return putBlockServer.SendAndClose(result) }
func drainBlockServer(putBlockServer pfsclient.BlockAPI_PutBlockServer) { for { if _, err := putBlockServer.Recv(); err != nil { break } } }