mirror of https://github.com/rclone/rclone.git
cache: clean remaining empty folders from temp upload path
This commit is contained in:
parent
c0f772bc14
commit
4e8e5fed7d
|
@ -3,7 +3,6 @@
|
||||||
package cache_test
|
package cache_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
@ -105,8 +104,8 @@ func TestInternalUploadMoveExistingFile(t *testing.T) {
|
||||||
require.Len(t, de1, 1)
|
require.Len(t, de1, 1)
|
||||||
|
|
||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
_ = os.Remove(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "one/test")))
|
//_ = os.Remove(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "one/test")))
|
||||||
require.NoError(t, err)
|
//require.NoError(t, err)
|
||||||
|
|
||||||
err = runInstance.dirMove(t, rootFs, "one/test", "second/test")
|
err = runInstance.dirMove(t, rootFs, "one/test", "second/test")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -117,6 +116,49 @@ func TestInternalUploadMoveExistingFile(t *testing.T) {
|
||||||
require.Len(t, de1, 1)
|
require.Len(t, de1, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInternalUploadTempPathCleaned(t *testing.T) {
|
||||||
|
id := fmt.Sprintf("tiutpc%v", time.Now().Unix())
|
||||||
|
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, true, true,
|
||||||
|
nil,
|
||||||
|
map[string]string{"cache-tmp-upload-path": path.Join(runInstance.tmpUploadDir, id), "cache-tmp-wait-time": "5s"})
|
||||||
|
defer runInstance.cleanupFs(t, rootFs, boltDb)
|
||||||
|
|
||||||
|
err := rootFs.Mkdir("one")
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = rootFs.Mkdir("one/test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = rootFs.Mkdir("second")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// create some rand test data
|
||||||
|
testSize := int64(1048576)
|
||||||
|
testReader := runInstance.randomReader(t, testSize)
|
||||||
|
testReader2 := runInstance.randomReader(t, testSize)
|
||||||
|
runInstance.writeObjectReader(t, rootFs, "one/test/data.bin", testReader)
|
||||||
|
runInstance.writeObjectReader(t, rootFs, "second/data.bin", testReader2)
|
||||||
|
|
||||||
|
runInstance.completeAllBackgroundUploads(t, rootFs, "one/test/data.bin")
|
||||||
|
_, err = os.Stat(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "one/test")))
|
||||||
|
require.True(t, os.IsNotExist(err))
|
||||||
|
_, err = os.Stat(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "one")))
|
||||||
|
require.True(t, os.IsNotExist(err))
|
||||||
|
_, err = os.Stat(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "second")))
|
||||||
|
require.False(t, os.IsNotExist(err))
|
||||||
|
|
||||||
|
runInstance.completeAllBackgroundUploads(t, rootFs, "second/data.bin")
|
||||||
|
_, err = os.Stat(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "second/data.bin")))
|
||||||
|
require.True(t, os.IsNotExist(err))
|
||||||
|
|
||||||
|
de1, err := runInstance.list(t, rootFs, "one/test")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, de1, 1)
|
||||||
|
|
||||||
|
// check if it can be read
|
||||||
|
de1, err = runInstance.list(t, rootFs, "second")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, de1, 1)
|
||||||
|
}
|
||||||
|
|
||||||
func TestInternalUploadQueueMoreFiles(t *testing.T) {
|
func TestInternalUploadQueueMoreFiles(t *testing.T) {
|
||||||
id := fmt.Sprintf("tiuqmf%v", time.Now().Unix())
|
id := fmt.Sprintf("tiuqmf%v", time.Now().Unix())
|
||||||
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, true, true,
|
rootFs, boltDb := runInstance.newCacheFs(t, remoteName, id, true, true,
|
||||||
|
@ -158,9 +200,8 @@ func TestInternalUploadQueueMoreFiles(t *testing.T) {
|
||||||
runInstance.completeAllBackgroundUploads(t, rootFs, lastFile)
|
runInstance.completeAllBackgroundUploads(t, rootFs, lastFile)
|
||||||
|
|
||||||
// retry until we have no more temp files and fail if they don't go down to 0
|
// retry until we have no more temp files and fail if they don't go down to 0
|
||||||
tf, err := ioutil.ReadDir(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "test")))
|
_, err = os.Stat(path.Join(runInstance.tmpUploadDir, id, runInstance.encryptRemoteIfNeeded(t, "test")))
|
||||||
require.NoError(t, err)
|
require.True(t, os.IsNotExist(err))
|
||||||
require.Len(t, tf, 0)
|
|
||||||
|
|
||||||
// check if cache lists all files
|
// check if cache lists all files
|
||||||
de1, err = runInstance.list(t, rootFs, "test")
|
de1, err = runInstance.list(t, rootFs, "test")
|
||||||
|
|
|
@ -629,6 +629,23 @@ func (b *backgroundWriter) run() {
|
||||||
fs.Errorf(remote, "background upload: %v", err)
|
fs.Errorf(remote, "background upload: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// clean empty dirs up to root
|
||||||
|
thisDir := cleanPath(path.Dir(remote))
|
||||||
|
for thisDir != "" {
|
||||||
|
thisList, err := b.fs.tempFs.List(thisDir)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if len(thisList) > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = b.fs.tempFs.Rmdir(thisDir)
|
||||||
|
fs.Debugf(thisDir, "cleaned from temp path")
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
thisDir = cleanPath(path.Dir(thisDir))
|
||||||
|
}
|
||||||
fs.Infof(remote, "background upload: uploaded entry")
|
fs.Infof(remote, "background upload: uploaded entry")
|
||||||
err = b.fs.cache.removePendingUpload(absPath)
|
err = b.fs.cache.removePendingUpload(absPath)
|
||||||
if err != nil && !strings.Contains(err.Error(), "pending upload not found") {
|
if err != nil && !strings.Contains(err.Error(), "pending upload not found") {
|
||||||
|
|
Loading…
Reference in New Issue