“在云中”gsutil cp是一个原子操作吗?

时间:2017-03-02 08:36:22

标签: google-cloud-storage gsutil

假设我使用以下命令将一个对象复制到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云存储桶作为CDN后端。虽然我希望CDN根据max-age标题中提供的Cache-Control缓存存储桶中的大多数对象,但我想确保一些特定的文件,实际上是可缓存的版本,永远不会被CDN缓存。因此,重要的是这些对象 - 在被复制时 - 永远不会出现Cache-Control:public,max-age=XXX,但会立即出现Cache-Control:no-store标题,以消除来自CDN的请求读取复制对象的可能性。 max-age仍然存在的时间点,因此缓存应该永远不会被缓存的对象。

1 个答案:

答案 0 :(得分:2)

是的,使用Cache-Control设置复制到新对象将是原子的。您可以通过查看对象的metageneration属性来验证这一点。

例如,上传一个对象:

$ 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

这意味着该对象被编写一次,并且自那以后一直没有被修改过。