Removed LimitedReader wrapper in writeBodyFixedSize, since it prevents sendfile triggering for FSHandler

This commit is contained in:
Aliaksandr Valialkin
2015-12-08 11:48:31 +02:00
parent 1e4e9fe9e6
commit ff63733774
2 changed files with 13 additions and 22 deletions
+10 -19
View File
@@ -100,8 +100,8 @@ func (req *Request) SetConnectionClose() {
// SetBodyStream sets response body stream and, optionally body size.
//
// If bodySize is >= 0, then bodySize bytes are read from bodyStream
// and used as response body.
// If bodySize is >= 0, then the bodyStream must provide exactly bodySize bytes
// before returning io.EOF.
//
// If bodySize < 0, then bodyStream is read until io.EOF.
//
@@ -559,12 +559,6 @@ func writeBodyChunked(w *bufio.Writer, r io.Reader) error {
return err
}
var limitedReaderPool = sync.Pool{
New: func() interface{} {
return &io.LimitedReader{}
},
}
func limitedReaderSize(r io.Reader) int64 {
lr, ok := r.(*io.LimitedReader)
if !ok {
@@ -576,26 +570,23 @@ func limitedReaderSize(r io.Reader) int64 {
func writeBodyFixedSize(w *bufio.Writer, r io.Reader, size int64) error {
if size > maxSmallFileSize {
// w buffer must be empty for triggering
// sendfile path in bufio.Writer.
// sendfile path in bufio.Writer.ReadFrom.
if err := w.Flush(); err != nil {
return err
}
}
var lrv interface{}
// Unwrap a single limited reader for triggering sendfile path
// in net.TCPConn.ReadFrom.
lr, ok := r.(*io.LimitedReader)
if !ok || lr.N > size {
lrv = limitedReaderPool.Get()
lr = lrv.(*io.LimitedReader)
lr.R = r
lr.N = size
if ok {
r = lr.R
}
n, err := copyZeroAlloc(w, lr)
n, err := copyZeroAlloc(w, r)
if !ok {
lr.R = nil
limitedReaderPool.Put(lrv)
if ok {
lr.N -= n
}
if n != size && err == nil {
+3 -3
View File
@@ -664,11 +664,11 @@ func (ctx *RequestCtx) PostBody() []byte {
// SetBodyStream sets response body stream and, optionally body size.
//
// bodyStream.Close() will be called after finishing reading all body data
// bodyStream.Close() is called after finishing reading all body data
// if it implements io.Closer.
//
// If bodySize is >= 0, then bodySize bytes are read from bodyStream
// and used as response body.
// If bodySize is >= 0, then bodySize bytes must be provided by bodyStream
// before returning io.EOF.
//
// If bodySize < 0, then bodyStream is read until io.EOF.
func (ctx *RequestCtx) SetBodyStream(bodyStream io.Reader, bodySize int) {