1
0
mirror of https://github.com/gilbertchen/duplicacy synced 2025-12-06 00:03:38 +00:00

Check directory existence again when failing to create it to avoid erroring out on race condition

This commit is contained in:
Gilbert Chen
2017-06-20 14:38:09 -04:00
parent 169d6db544
commit 651d82e511
4 changed files with 27 additions and 3 deletions

View File

@@ -93,7 +93,6 @@ function add_file()
FILE_NAME=$1
pushd ${TEST_REPO}
dd if=/dev/urandom of=${FILE_NAME} bs=1000 count=20000
echo ${FILE_NAME} > "${FILE_NAME}"
popd
}

View File

@@ -0,0 +1,17 @@
#!/bin/bash
. ./test_functions.sh
fixture
pushd ${TEST_REPO}
${DUPLICACY} init integration-tests $TEST_STORAGE -c 1k
add_file file3
add_file file4
${DUPLICACY} backup -threads 16
${DUPLICACY} check --files -stats
popd

View File

@@ -158,7 +158,11 @@ func (storage *FileStorage) FindChunk(threadIndex int, chunkID string, isFossil
err = os.Mkdir(subDir, 0744)
if err != nil {
return "", false, 0, err
// The directory may have been created by other threads so check it again.
stat, _ := os.Stat(subDir)
if stat == nil || !stat.IsDir() {
return "", false, 0, err
}
}
dir = subDir

View File

@@ -215,7 +215,11 @@ func (storage *SFTPStorage) FindChunk(threadIndex int, chunkID string, isFossil
err = storage.client.Mkdir(subDir)
if err != nil {
return "", false, 0, fmt.Errorf("Failed to create the directory %s: %v", subDir, err)
// The directory may have been created by other threads so check it again.
stat, _ := storage.client.Stat(subDir)
if stat == nil || !stat.IsDir() {
return "", false, 0, fmt.Errorf("Failed to create the directory %s: %v", subDir, err)
}
}
dir = subDir