"in the cloud" gsutil cp 是原子操作吗?

Is "in the cloud" gsutil cp an atomic operation?

假设我使用以下命令将一个 object 复制到 Google Cloud Storage 存储桶中:

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

我现在想复制此文件 "in the cloud",同时保留 public ACL 并同时更新 Cache-Control header:

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

这个操作是原子的吗? IE。我可以确定 object gs://some-bucket/b.html 最初会在修改后的 Cache-Control:no-store header 中可用吗?

我提出问题的原因是:我正在使用 Google Cloud Storage 存储桶作为 CDN-backend。虽然我希望存储桶中的大部分 object 根据 Cache-Control header 中提供的 max-age 由 CDN 缓存,但我想确保一些特定文件,实际上是可缓存版本的副本,从不 由 CDN 缓存。因此,至关重要的是这些 object 在被复制时永远不会与 Cache-Control:public,max-age=XXX 一起出现,而是立即与 Cache-Control:no-store header 一起出现,以消除请求到来的可能性来自 CDN 的 object 会在 max-age 仍然存在的时间点读取复制的 object 并因此缓存应该永远不会被缓存的 object。

是的,复制到设置了 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.

你会看到它的初始 metageneration 是 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

这意味着该对象被写入一次,此后没有被修改过。