Является ли в облаке gsutil cp атомарной операцией?

Предположим, что я скопировал один объект в корзину Google Cloud Storage, используя следующую команду:

gsutil -h "Cache-Control:public,max-age=3600" cp -a public-read a.html gs://some-bucket/

Теперь я хочу скопировать этот файл «в облако», сохранив общедоступный ACL и одновременно обновив заголовок Cache-Control:

gsutil -h "Cache-Control:no-store" cp -p gs://some-bucket/a.html gs://some-bucket/b.html

Является ли эта операция атомарной? т.е. могу ли я быть уверен, что объект gs://some-bucket/b.html станет изначально доступен с измененным заголовком Cache-Control:no-store?

Причина моего вопроса: я использую корзину Google Cloud Storage в качестве серверной части CDN. Хотя я хочу, чтобы CDN кэшировала большинство объектов в корзине в соответствии с max-age, представленным в заголовке Cache-Control, я хочу убедиться, что несколько определенных файлов, которые на самом деле являются копиями кэшируемых версий, никогда не будут кэшируется CDN. Поэтому очень важно, чтобы эти объекты при копировании никогда не отображались с заголовком Cache-Control:public,max-age=XXX, а сразу появлялись с заголовком Cache-Control:no-store, чтобы исключить вероятность того, что запрос, исходящий из CDN, будет читать скопированный объект в момент времени, когда max-age будет все еще присутствует и, следовательно, кэширует объект, который, как предполагается, никогда не кэшируется.


person ctavan    schedule 02.03.2017    source источник


Ответы (1)


Да, копирование в новый объект с установленным Cache-Control будет атомарным. Вы можете убедиться в этом, взглянув на свойство метагенерации объекта.

Например, загрузить объект:

$ BUCKET=mybucket
$ echo foo | ./gsutil cp - gs://$BUCKET/foo.txt
Copying from <STDIN>...
/ [1 files][    0.0 B/    0.0 B]                                                
Operation completed over 1 objects.

и вы увидите, что его начальная метагенерация равна 1:

$ ./gsutil ls -L gs://$BUCKET/foo.txt | grep Meta
    Metageneration:         1

Всякий раз, когда метаданные объекта изменяются, метагенерация изменяется. Например, если элемент управления кешем обновляется позже, например, так:

$ ./gsutil setmeta -h "Cache-Control:no-store" gs://$BUCKET/foo.txt
Setting metadata on gs://mybucket/foo.txt...
/ [1 objects]                                                                   
Operation completed over 1 objects.  

Новое метапоколение 2:

$ ./gsutil ls -L gs://$BUCKET/foo.txt | grep Meta
    Metageneration:         2

Теперь, если мы запустим команду копирования:

$ ./gsutil -h "Cache-Control:no-store" cp -p gs://$BUCKET/foo.txt gs://$BUCKET/bar.txt
Copying gs://mybucket/foo.txt [Content-Type=application/octet-stream]...
- [1 files][    4.0 B/    4.0 B]                                                
Operation completed over 1 objects/4.0 B. 

Метагенерация нового объекта равна 1:

$ ./gsutil ls -L gs://$BUCKET/bar.txt | grep Meta
    Metageneration:         1

Это означает, что объект был написан один раз и с тех пор не изменялся.

person jterrace    schedule 02.03.2017