From ee460686d670dba839ef79bf934af55243f1862c Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Wed, 30 Sep 2020 21:47:42 -0700 Subject: [PATCH] Make delete more synchronous --- server/filesystem/filesystem.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server/filesystem/filesystem.go b/server/filesystem/filesystem.go index dbe4363..76714cd 100644 --- a/server/filesystem/filesystem.go +++ b/server/filesystem/filesystem.go @@ -182,7 +182,7 @@ func (fs *Filesystem) Chown(path string) error { if err != nil { return errors.WithStack(err) } - + if fs.isTest { return nil } @@ -321,6 +321,7 @@ func (fs *Filesystem) Copy(p string) error { // Deletes a file or folder from the system. Prevents the user from accidentally // (or maliciously) removing their root server data directory. func (fs *Filesystem) Delete(p string) error { + wg := sync.WaitGroup{} // This is one of the few (only?) places in the codebase where we're explicitly not using // the SafePath functionality when working with user provided input. If we did, you would // not be able to delete a file that is a symlink pointing to a location outside of the data @@ -348,14 +349,18 @@ func (fs *Filesystem) Delete(p string) error { if !st.IsDir() { fs.addDisk(-st.Size()) } else { - go func(st os.FileInfo, resolved string) { + wg.Add(1) + go func(wg *sync.WaitGroup, st os.FileInfo, resolved string) { + defer wg.Done() if s, err := fs.DirectorySize(resolved); err == nil { fs.addDisk(-s) } - }(st, resolved) + }(&wg, st, resolved) } } + wg.Wait() + return os.RemoveAll(resolved) }