From b6c230a0fb5c5ca3bda98a342efc5875ed28e50a Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 8 Dec 2015 10:47:50 +0200 Subject: [PATCH] Moved the hack for triggering sendfile in bufio.ReadFrom from FSHandler to Response.Write, so all response body streams may benefit from sendfile optimization --- fshandler.go | 11 ++--------- http.go | 7 +++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fshandler.go b/fshandler.go index 0b47161..3e1eae9 100644 --- a/fshandler.go +++ b/fshandler.go @@ -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) } diff --git a/http.go b/http.go index 5f3096b..a92e522 100644 --- a/http.go +++ b/http.go @@ -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 }