【问题标题】:Is "in the cloud" gsutil cp an atomic operation?“在云端” gsutil cp 是原子操作吗?
【发布时间】:2017-07-21 21:13:06
【问题描述】:

假设我已使用以下命令将一个对象复制到 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

这个操作是原子的吗? IE。我可以确定,gs://some-bucket/b.html 对象最初将通过修改后的Cache-Control:no-store 标头可用吗?

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

【问题讨论】:

    标签: google-cloud-storage gsutil


    【解决方案1】:

    是的,复制到带有缓存控制集的新对象将是原子的。您可以通过查看对象的元生成属性来验证这一点。

    例如上传一个对象:

    $ 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2018-08-05
      相关资源
      最近更新 更多