From 414efbf59763903475a133d813225b11216003bc Mon Sep 17 00:00:00 2001 From: criyle Date: Sat, 12 Feb 2022 09:05:10 +0000 Subject: [PATCH] envexec: performance improvements for content copyIn --- cmd/executorserver/grpc_executor/grpc.go | 4 +++- cmd/executorserver/rest_executor/file_handler.go | 5 ++++- cmd/ffi/cinterface.go | 4 +++- envexec/file.go | 8 +++++--- envexec/file_copyin.go | 4 +++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cmd/executorserver/grpc_executor/grpc.go b/cmd/executorserver/grpc_executor/grpc.go index 0d6fb9a..e248142 100644 --- a/cmd/executorserver/grpc_executor/grpc.go +++ b/cmd/executorserver/grpc_executor/grpc.go @@ -81,7 +81,9 @@ func (e *execServer) FileGet(c context.Context, f *pb.FileID) (*pb.FileContent, if err != nil { return nil, err } - defer r.Close() + if f, ok := r.(*os.File); ok { + defer f.Close() + } content, err := io.ReadAll(r) if err != nil { diff --git a/cmd/executorserver/rest_executor/file_handler.go b/cmd/executorserver/rest_executor/file_handler.go index 4bb73e0..e4eae67 100644 --- a/cmd/executorserver/rest_executor/file_handler.go +++ b/cmd/executorserver/rest_executor/file_handler.go @@ -5,6 +5,7 @@ import ( "io" "mime" "net/http" + "os" "path" "github.com/criyle/go-judge/envexec" @@ -72,7 +73,9 @@ func (f *fileHandle) fileIDGet(c *gin.Context) { c.AbortWithError(http.StatusInternalServerError, err) return } - defer r.Close() + if f, ok := r.(*os.File); ok { + defer f.Close() + } content, err := io.ReadAll(r) if err != nil { diff --git a/cmd/ffi/cinterface.go b/cmd/ffi/cinterface.go index 8f968cd..47d398a 100644 --- a/cmd/ffi/cinterface.go +++ b/cmd/ffi/cinterface.go @@ -192,7 +192,9 @@ func FileGet(e *C.char) *C.char { if err != nil { return nil } - defer r.Close() + if f, ok := r.(*os.File); ok { + defer f.Close() + } c, err := io.ReadAll(r) if err != nil { diff --git a/envexec/file.go b/envexec/file.go index 0064dbd..aa8daff 100644 --- a/envexec/file.go +++ b/envexec/file.go @@ -83,14 +83,16 @@ func NewFileOpened(f *os.File) File { return &FileOpened{File: f} } -// FileToReader get a ReadCloser from underlying file -func FileToReader(f File) (io.ReadCloser, error) { +// FileToReader get a Reader from underlying file +// if the return value is *os.File, the file need to be closed +// by caller +func FileToReader(f File) (io.Reader, error) { switch f := f.(type) { case *FileOpened: return f.File, nil case *FileReader: - return io.NopCloser(f.Reader), nil + return f.Reader, nil case *FileInput: file, err := os.Open(f.Path) diff --git a/envexec/file_copyin.go b/envexec/file_copyin.go index 1bcd985..bd62feb 100644 --- a/envexec/file_copyin.go +++ b/envexec/file_copyin.go @@ -39,7 +39,9 @@ func copyIn(m Environment, copyIn map[string]File) ([]FileError, error) { if err != nil { return fmt.Errorf("failed to copyIn %v", err) } - defer hf.Close() + if f, ok := hf.(*os.File); ok { + defer f.Close() + } cf, err := m.Open(n, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0777) if err != nil {