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.