Conditional Requests Via Generation / Metageneration Preconditions

Preconditions tell Cloud Storage to only perform a request if the generation or metageneration number of the affected object meets your precondition criteria. These checks of the 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

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_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.