У меня есть Perl-скрипт, который вызывает gsutil cp для копирования выбранного из GCS в локальную папку:
$cmd = "[bin-path]/gsutil cp -n gs://[gcs-file-path] [local-folder]";
$output = `$cmd 2>&1`;
Сценарий вызывается через HTTP и, следовательно, может быть запущен несколько раз (например, двойным щелчком по ссылке). Когда это происходит, локальный файл может оказаться в два раза больше правильного размера и, следовательно, явно поврежден. Три вещи кажутся странными:
Похоже, что gsutil не блокирует локальный файл во время записи в него, позволяя другому потоку (в данном случае другому экземпляру gsutil) записывать в тот же файл.
Кажется, что «-n» не имеет никакого эффекта. Я ожидал, что это предотвратит попытку копирования вторым экземпляром gsutil.
Проверка подписи MD5 дает сбой: обычно gsutil удаляет целевой файл, если есть несоответствие подписи, но это явно происходит не всегда.
Файлы, о которых идет речь, больше 2 МБ (обычно около 5 МБ), поэтому может возникнуть некоторое взаимодействие с функцией автоматического возобновления. Сценарий Perl вызывает gsutil только в том случае, если локальный файл еще не существует, но он не фиксирует двойной щелчок (из-за временной задержки для аутентификации передачи GCS).
версия gsutil: 3.42 для FreeBSD 8.2
Кто-нибудь испытывает подобную проблему? У кого-нибудь есть идеи?
Эдвард Ли