Moved the hack for triggering sendfile in bufio.ReadFrom from FSHandler to Response.Write, so all response body streams may benefit from sendfile optimization

This commit is contained in:
Aliaksandr Valialkin
2015-12-08 10:47:50 +02:00
parent 5c8ab236b8
commit b6c230a0fb
2 changed files with 9 additions and 9 deletions
+2 -9
View File
@@ -1,7 +1,6 @@
package fasthttp
import (
"bufio"
"bytes"
"errors"
"fmt"
@@ -124,6 +123,7 @@ func (ff *fsFile) smallFileReader() io.Reader {
return r
}
// files bigger than this size are sent with sendfile
const maxSmallFileSize = 2 * 4096
func (ff *fsFile) isBig() bool {
@@ -194,15 +194,8 @@ func (r *bigFileReader) Read(p []byte) (int, error) {
}
func (r *bigFileReader) WriteTo(w io.Writer) (int64, error) {
// fast path
if rf, ok := w.(io.ReaderFrom); ok {
// This is a hack for triggering sendfile path in bufio.Writer:
// the buffer must be empty before calling ReadFrom.
if bw, ok := w.(*bufio.Writer); ok && bw.Buffered() > 0 {
if err := bw.Flush(); err != nil {
return 0, err
}
}
// fast path. Senfile must be triggered
return rf.ReadFrom(r.f)
}
+7
View File
@@ -452,6 +452,13 @@ func (resp *Response) Write(w *bufio.Writer) error {
if err = resp.Header.Write(w); err != nil {
return err
}
if contentLength > maxSmallFileSize {
// w buffer must be empty for triggering
// sendfile path in bufio.Writer.
if err = w.Flush(); err != nil {
return err
}
}
if err = writeBodyFixedSize(w, resp.bodyStream, contentLength); err != nil {
return err
}