2017-03-02 78 views
1

假設我已經使用下面的命令複製一個對象到谷歌雲存儲桶:是「雲中」gsutil cp的一個原子操作嗎?

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

我現在想「在雲中」複製該文件,同時保持公共ACL,並同時更新緩存控制標題:

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後端。雖然我希望根據Cache-Control標頭中提供的max-age緩存CDN中的大部分對象,但我想確保一些特定文件(實際上是可緩存版本的副本)是從不緩存由CDN提供。因此,至關重要的是,這些對象在複製時不會以Cache-Control:public,max-age=XXX出現,而會立即以Cache-Control:no-store標題出現,以消除來自CDN的請求在某個時間點讀取複製對象的可能性,其中max-age會仍然存在,因此緩存應該永遠不會被緩存的對象。

回答

2

是的,使用緩存控制集複製到新對象將是原子的。您可以通過查看對象的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. 

,你會看到它的初始metageneration爲1:

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

當一個對象的元數據被修改時,metageneration改變。例如,如果緩存控制以後,像這樣更新:

$ ./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. 

新metageneration爲2:現在

​​3210

,如果我們運行的複製命令:

$ ./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 

這意味着該對象只寫了一次,並且自此以後未被修改。