From 33cf37bbc0dce62ee6ff48c3b66d987c49fea8f4 Mon Sep 17 00:00:00 2001 From: Jesse Hallam Date: Thu, 19 Sep 2019 22:02:19 -0300 Subject: [PATCH] MM: 16479: ensure replacement file finishes io.Copy (#12249) * simplify FileWillBeUploaded * MM-16479: ensure replacement file finishes io.Copy --- plugin/client_rpc.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/plugin/client_rpc.go b/plugin/client_rpc.go index a43107c93c..1bf1f4e435 100644 --- a/plugin/client_rpc.go +++ b/plugin/client_rpc.go @@ -395,26 +395,31 @@ func (g *hooksRPCClient) FileWillBeUploaded(c *Context, info *model.FileInfo, fi serveIOReader(file, uploadedFileConnection) }() + replacementDone := make(chan bool) replacementFileStreamId := g.muxBroker.NextId() go func() { + defer close(replacementDone) + replacementFileConnection, err := g.muxBroker.Accept(replacementFileStreamId) if err != nil { g.log.Error("Plugin failed to serve replacement file stream. MuxBroker could not Accept connection", mlog.Err(err)) return } defer replacementFileConnection.Close() - if _, err := io.Copy(output, replacementFileConnection); err != nil && err != io.EOF { + if _, err := io.Copy(output, replacementFileConnection); err != nil { g.log.Error("Error reading replacement file.", mlog.Err(err)) } }() _args := &Z_FileWillBeUploadedArgs{c, info, uploadedFileStreamId, replacementFileStreamId} _returns := &Z_FileWillBeUploadedReturns{A: _args.B} - if g.implemented[FileWillBeUploadedId] { - if err := g.client.Call("Plugin.FileWillBeUploaded", _args, _returns); err != nil { - g.log.Error("RPC call FileWillBeUploaded to plugin failed.", mlog.Err(err)) - } + if err := g.client.Call("Plugin.FileWillBeUploaded", _args, _returns); err != nil { + g.log.Error("RPC call FileWillBeUploaded to plugin failed.", mlog.Err(err)) } + + // Ensure the io.Copy from the replacementFileConnection above completes. + <-replacementDone + return _returns.A, _returns.B }