From c473c7cb5318afec171d6470ff08f3a10584df6d Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 17 Sep 2018 08:46:06 +0100 Subject: [PATCH] ftp: add a small pause after failed upload before deleting file #2517 This fixes the integration tests for `serve ftp` which uses the ftp backend tests. --- backend/ftp/ftp.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/ftp/ftp.go b/backend/ftp/ftp.go index 21b7f5e71..fafe6b702 100644 --- a/backend/ftp/ftp.go +++ b/backend/ftp/ftp.go @@ -704,6 +704,11 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOptio path := path.Join(o.fs.root, o.remote) // remove the file if upload failed remove := func() { + // Give the FTP server a chance to get its internal state in order after the error. + // The error may have been local in which case we closed the connection. The server + // may still be dealing with it for a moment. A sleep isn't ideal but I haven't been + // able to think of a better method to find out if the server has finished - ncw + time.Sleep(1 * time.Second) removeErr := o.Remove() if removeErr != nil { fs.Debugf(o, "Failed to remove: %v", removeErr) @@ -717,7 +722,7 @@ func (o *Object) Update(in io.Reader, src fs.ObjectInfo, options ...fs.OpenOptio } err = c.Stor(path, in) if err != nil { - _ = c.Quit() + _ = c.Quit() // toss this connection to avoid sync errors remove() return errors.Wrap(err, "update stor") }