GCS - Глобальная согласованность с удалением + переименованием

Моя проблема может быть результатом моего недопонимания с глобальной согласованностью в хранилище Google, но так как я не сталкивался с этой проблемой до недавнего времени (середина ноября) и теперь, кажется, ее легко воспроизвести, я хотел получить некоторые пояснения. Эта проблема начала возникать в коде искры, работающем на вычислительном движке с использованием bdutil, но я могу воспроизвести его из командной строки с помощью gsutil.

Мой код удаляет путь назначения, а затем сразу же переименовывает исходный путь в качестве пути назначения. С глобальной согласованностью я бы ожидал, так как путь назначения больше не существует, src будет переименован в место назначения, но вместо этого src будет вложен в место назначения, как если бы место назначения все еще существует, и это не согласовано.

Код hadoop для воспроизведения выглядит следующим образом:

fs.delete(new Path(dest), true)
fs.rename(new Path(src), new Path(dest))

Из командной строки я могу воспроизвести с:

gsutil -m rm -r gs://mybucket/dest
gsutil -m cp -r gs://mybucket/src gs://mybucket/dest

Если причина в том, что операции со списками в конечном итоге непротиворечивы, а реализация FileSystem использует операции над списками, чтобы определить, существует ли место назначения, тогда я понимаю, и есть ли рекомендуемое решение, чтобы гарантировать, что место назначения больше не существует до переименования?

Спасибо Люк

2 ответа

Решение

Операции чтения после записи (включая удаление) строго согласованы, например, если вы сделали:

gsutil -m rm -r gs://mybucket/dest
# Command output shows it removed gs://mybucket/dest/file1
gsutil cp gs://mybucket/dest/file1 my_local_dir/file1

Это всегда будет неудачей.

Однако, чтобы определить, существует ли "каталог", gsutil должен выполнить в конечном итоге непротиворечивую операцию листинга, чтобы выяснить, есть ли у какого-либо объекта в плоском пространстве имен Google Cloud Storage префикс с именем этого "каталога". Это может привести к проблеме, которую вы описали, и я ожидаю, что код hadoop ведет себя аналогично.

Для этой проблемы не существует строго согласованного обходного пути, поскольку нет способа проверить наличие префикса строго согласованным образом.

Тревису ответ уже пару лет, и он больше не соответствует действительности. Операция со списком объектов сейчас строго согласована. Прочитайте пост Google.

Другие вопросы по тегам