Conditional Requests Via ETag / Generation / Metageneration Preconditions

Preconditions tell Cloud Storage to only perform a request if the ETag, generation, or metageneration number of the affected object meets your precondition criteria. These checks of the ETag, generation, and metageneration numbers ensure that the object is in the expected state, allowing you to perform safe read-modify-write updates and conditional operations on objects

Concepts

ETag

An ETag is returned as part of the response header whenever a resource is returned, as well as included in the resource itself. Users should make no assumptions about the value used in an ETag except that it changes whenever the underlying data changes, per the specification

The ETag attribute is set by the GCS back-end, and is read-only in the client library.

Metageneration

When you create a Bucket, its metageneration is initialized to 1, representing the initial version of the bucket’s metadata.

When you first upload a Blob (“Object” in the GCS back-end docs), its metageneration is likewise initialized to 1. representing the initial version of the blob’s metadata.

The metageneration attribute is set by the GCS back-end, and is read-only in the client library.

Each time you patch or update the bucket’s / blob’s metadata, its metageneration is incremented.

Generation

Each time you upload a new version of a file to a Blob (“Object” in the GCS back-end docs), the Blob’s generation is changed, and its metageneration is reset to 1 (the first metadata version for that generation of the blob).

The generation attribute is set by the GCS back-end, and is read-only in the client library.

See also

Conditional Parameters

Using if_etag_match

Passing the if_etag_match parameter to a method which retrieves a blob resource (e.g., Blob.reload) makes the operation conditional on whether the blob’s current ETag matches the given value. This parameter is not supported for modification (e.g., Blob.update).

Using if_etag_not_match

Passing the if_etag_not_match parameter to a method which retrieves a blob resource (e.g., Blob.reload) makes the operation conditional on whether the blob’s current ETag matches the given value. This parameter is not supported for modification (e.g., Blob.update).

Using if_generation_match

Passing the if_generation_match parameter to a method which retrieves a blob resource (e.g., Blob.reload) or modifies the blob (e.g., Blob.update) makes the operation conditional on whether the blob’s current generation matches the given value.

As a special case, passing 0 as the value for if_generation_match makes the operation succeed only if there are no live versions of the blob.

Using if_generation_not_match

Passing the if_generation_not_match parameter to a method which retrieves a blob resource (e.g., Blob.reload) or modifies the blob (e.g., Blob.update) makes the operation conditional on whether the blob’s current generation does not match the given value.

If no live version of the blob exists, the precondition fails.

As a special case, passing 0 as the value for if_generation_not_match makes the operation succeed only if there is a live version of the blob.

Using if_metageneration_match

Passing the if_metageneration_match parameter to a method which retrieves a blob or bucket resource (e.g., Blob.reload, Bucket.reload) or modifies the blob or bucket (e.g., Blob.update Bucket.patch) makes the operation conditional on whether the resource’s current metageneration matches the given value.

Using if_metageneration_not_match

Passing the if_metageneration_not_match parameter to a method which retrieves a blob or bucket resource (e.g., Blob.reload, Bucket.reload) or modifies the blob or bucket (e.g., Blob.update Bucket.patch) makes the operation conditional on whether the resource’s current metageneration does not match the given value.