gsutil rsyn c ошибка в файле .gstmp после продолжения прерванной rsync - PullRequest
0 голосов
/ 30 января 2020

Мне нужно выполнить gsutil rsync из хранилища облачного хранилища Google в локальный каталог, который может быть прерван / не выполнен из-за плохого соединения. Поэтому я проверил, что произойдет, если я просто попытаюсь снова выполнить rsyn c и продолжить с того места, где остановился, и выдает ошибку, удаляющую файл .gstmp, оставленный первым прерванным rsyn c.

Допустим, у меня есть корзина с этими файлами:

test1.txt
test2.txt
test3.txt

И я запускаю команду gsutil rsyn c:

user@machine:~/$ gsutil rsync -C -d -r gs://bucket_name ~/tmp/

, которую я прерываю во время копирование test2.txt. Это оставит test2.txt_.gstmp в целевом каталоге. Теперь, когда я снова делаю тот же rsyn c, это происходит:

user@machine:~/$ gsutil rsync -C -d -r gs://bucket_name ~/tmp/
Building synchronization state...
Starting synchronization...
Copying gs://bucket_name/test3.txt...
Removing file:///home/user/tmp/test2.txt_.gstmp
OSError: No such file or directory.

Таким образом, он определяет, где он был прерван в последний раз, но также помечает файл .gstmp для удаления, что очень хорошо. , Но когда он на самом деле пытается удалить его, он как-то уже исчез, и я получаю OSError (как будто он пытается удалить его дважды). Теперь, если я снова запускаю ту же команду, все работает нормально, потому что файла .gstmp больше нет.

Кто-нибудь знает, что может вызвать это и как этого избежать?

РЕДАКТИРОВАТЬ:

Похоже, что это происходит, потому что gsutil очищает файлы .gstmp независимо от того, поэтому, если файл .gstmp также является частью создаваемого состояния синхронизации, он пытается удалить это дважды (сначала как часть очистки, а затем снова как часть синхронизации), что вызывает ошибку OSError. Мое текущее исправление заключается в добавлении игнорирующего регулярного выражения в команду rsyn c:

gsutil rsync -C -d -r -x ".*gstmp$" gs://bucket_name ~/tmp/

Теперь он игнорирует .gstmp в процессе rsyn c, но все равно удаляет его как часть очистки

1 Ответ

0 голосов
/ 31 января 2020

Я попытался воспроизвести ваш вариант использования:

 gsutil rsync -C -d -r gs://syncbucket  temp/
 #Building synchronization state...
 #Starting synchronization...
 #Copying gs://syncbucket/test1.txt...
 #Copying gs://syncbucket/test2.txt...
 #Copying gs://syncbucket/test3.txt...
 #CCaught CTRL-C (signal 2) - exiting

 ls temp/
 #test1.txt  test2.txt  test3.txt_.gstmp

 gsutil rsync -C -d -r gs://syncbucket  temp/
 #Building synchronization state...
 #Starting synchronization...
 #Copying gs://syncbucket/test3.txt...
 #Removing file://temp/test3.txt_.gstmp
 #OSError: No such file or directory.

 ls temp/
 #test1.txt  test2.txt  test3.txt

Я не уверен, что означает сообщение OSError, но команда выполнена успешно, и я вижу все свои файлы из GCS локально. Мне не нужно запускать gsutil rsync три раза.

...