"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
这意味着该对象被写入一次,此后没有被修改过。
假设我使用以下命令将一个 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
这意味着该对象被写入一次,此后没有被修改过。