A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://cloud.google.com/storage/docs/retry-strategy below:

Retry strategy | Cloud Storage

Skip to main content Retry strategy

Stay organized with collections Save and categorize content based on your preferences.

This page describes how Cloud Storage tools retry failed requests and how to customize the behavior of retries. It also describes considerations for retrying requests.

Overview

There are two factors that determine whether or not a request is safe to retry:

Response

The response that you receive from your request indicates whether or not it's useful to retry the request. Responses related to transient problems are generally retryable. On the other hand, response related to permanent errors indicate you need to make changes, such as authorization or configuration changes, before it's useful to try the request again. The following responses indicate transient problems that are useful to retry:

For more information, see the status and error codes for JSON and XML.

Idempotency

Requests that are idempotent can be executed repeatedly without changing the final state of the targeted resource, resulting in the same end state each time. For example, list operations are always idempotent, because such requests don't modify resources. On the other hand, creating a new Pub/Sub notification is never idempotent, because it creates a new notification ID each time the request succeeds.

The following are examples of conditions that make an operation idempotent:

When you receive a retryable response, you should consider the idempotency of the request, because retrying requests that are not idempotent can lead to race conditions and other conflicts.

Conditional idempotency

A subset of requests are conditionally idempotent, which means they are only idempotent if they include specific optional arguments. Operations that are conditionally safe to retry should only be retried by default if the condition case passes. Cloud Storage accepts preconditions and ETags as condition cases for requests.

Idempotency of operations

The following table lists the Cloud Storage operations that fall into each category of idempotency.

Idempotency Operations Always idempotent Conditionally idempotent Never idempotent

1This field is available for use in the JSON API. For fields available for use in the client libraries, see the relevant client library documentation.

Console

The Google Cloud console sends requests to Cloud Storage on your behalf and handles any necessary backoff.

Command line

gcloud storage commands retry the errors listed in the Response section without requiring you to take additional action. You might have to take action for other errors, such as the following:

For retryable errors, the gcloud CLI retries requests using a truncated binary exponential backoff strategy. The default number of maximum retries is 32 for the gcloud CLI.

Client libraries C++

By default, operations support retries for the following HTTP error codes, as well as any socket errors that indicate the connection was lost or never successfully established.

All exponential backoff and retry settings in the C++ library are configurable. If the algorithms implemented in the library don't support your needs, you can provide custom code to implement your own strategies.

Setting Default value Auto retry True Maximum time retrying a request 15 minutes Initial wait (backoff) time 1 second Wait time multiplier per iteration 2 Maximum amount of wait time 5 minutes

By default, the C++ library retries all operations with retryable errors, even those that are never idempotent and can delete or create multiple resources when repeatedly successful. To only retry idempotent operations, use the google::cloud::storage::StrictIdempotencyPolicy class.

C#

The C# client library uses exponential backoff by default.

Go

By default, operations support retries for the following errors:

All exponential backoff settings in the Go library are configurable. By default, operations in Go use the following settings for exponential backoff (defaults are taken from gax):

Setting Default value (in seconds) Auto retry True if idempotent Max number of attempts No limit Initial retry delay 1 second Retry delay multiplier 2.0 Maximum retry delay 30 seconds Total timeout (resumable upload chunk) 32 seconds Total timeout (all other operations) No limit

In general, retrying continues indefinitely unless the controlling context is canceled, the client is closed, or a non-transient error is received. To stop retries from continuing, use context timeouts or cancellation. The only exception to this behavior is when performing resumable uploads using Writer, where the data is large enough that it requires multiple requests. In this scenario, each chunk times out and stops retrying after 32 seconds by default. You can adjust the default timeout by changing Writer.ChunkRetryDeadline.

There is a subset of Go operations that are conditionally idempotent (conditionally safe to retry). These operations only retry if they meet specific conditions:

RetryPolicy is set to RetryPolicy.RetryIdempotent by default. See Customize retries for examples on how to modify the default retry behavior.

Java

By default, operations support retries for the following errors:

All exponential backoff settings in the Java library are configurable. By default, operations through Java use the following settings for exponential backoff:

Setting Default value (in seconds) Auto retry True if idempotent Max number of attempts 6 Initial retry delay 1 second Retry delay multiplier 2.0 Maximum retry delay 32 seconds Total Timeout 50 seconds Initial RPC Timeout 50 seconds RPC Timeout Multiplier 1.0 Max RPC Timeout 50 seconds Connect Timeout 20 seconds Read Timeout 20 seconds

For more information about the settings, see the Java reference documentation for RetrySettings.Builder and HttpTransportOptions.Builder.

There is a subset of Java operations that are conditionally idempotent (conditionally safe to retry). These operations only retry if they include specific arguments:

StorageOptions.setStorageRetryStrategy is set to StorageRetryStrategy#getDefaultStorageRetryStrategy by default. See Customize retries for examples on how to modify the default retry behavior.

Node.js

By default, operations support retries for the following error codes:

All exponential backoff settings in the Node.js library are configurable. By default, operations through Node.js use the following settings for exponential backoff:

Setting Default value (in seconds) Auto retry True if idempotent Maximum number of retries 3 Initial wait time 1 second Wait time multiplier per iteration 2 Maximum amount of wait time 64 seconds Default deadline 600 seconds

There is a subset of Node.js operations that are conditionally idempotent (conditionally safe to retry). These operations only retry if they include specific arguments:

retryOptions.idempotencyStrategy is set to IdempotencyStrategy.RetryConditional by default. See Customize retries for examples on how to modify the default retry behavior.

PHP

The PHP client library uses exponential backoff by default.

By default, operations support retries for the following error codes:

Some exponential backoff settings in the PHP library are configurable. By default, operations through PHP use the following settings for exponential backoff:

Setting Default value (in seconds) Auto retry True if idempotent Initial retry delay 1 second Retry delay multiplier 2.0 Maximum retry delay 60 seconds Request timeout 0 with REST, 60 with gRPC Default number of retries 3

There is a subset of PHP operations that are conditionally idempotent (conditionally safe to retry). These operations only retry if they include specific arguments:

When creating StorageClient the StorageClient::RETRY_IDEMPOTENT strategy is used by default. See Customize retries for examples on how to modify the default retry behavior.

Python

By default, operations support retries for the following error codes:

Operations through Python use the following default settings for exponential backoff:

Setting Default value (in seconds) Auto retry True if idempotent Initial wait time 1 Wait time multiplier per iteration 2 Maximum amount of wait time 60 Default deadline 120

In addition to Cloud Storage operations that are always idempotent, the Python client library automatically retries Objects: insert, Objects: delete, and Objects: patch by default.

There is a subset of Python operations that are conditionally idempotent (conditionally safe to retry) when they include specific arguments. These operations only retry if a condition case passes:

Ruby

By default, operations support retries for the following error codes:

All exponential backoff settings in the Ruby client library are configurable. By default, operations through the Ruby client library use the following settings for exponential backoff:

Setting Default value Auto retry True Max number of retries 3 Initial wait time 1 second Wait time multiplier per iteration 2 Maximum amount of wait time 60 seconds Default deadline 900 seconds

There is a subset of Ruby operations that are conditionally idempotent (conditionally safe to retry) when they include specific arguments:

By default, all idempotent operations are retried, and conditionally idempotent operations are retried only if the condition case passes. Non-idempotent operations are not retried. See Customize retries for examples on how to modify the default retry behavior.

REST APIs

When calling the JSON or XML API directly, you should use the exponential backoff algorithm to implement your own retry strategy.

Customizing retries Console

You cannot customize the behavior of retries using the Google Cloud console.

Command line

For gcloud storage commands, you can control the retry strategy by creating a named configuration and setting some or all of the following properties:

Setting Default value (in seconds) base_retry_delay 1 exponential_sleep_multiplier 2 max_retries 32 max_retry_delay 32

You then apply the defined configuration either on a per-command basis by using the --configuration project-wide flag or for all Google Cloud CLI commands by using the gcloud config set command.

Client libraries C++

To customize the retry behavior, provide values for the following options when you initialize the google::cloud::storage::Client object:

For more information, see the C++ client library reference documentation.

C#

You cannot customize the default retry strategy used by the C# client library.

Go

When you initialize a storage client, a default retry configuration will be set. Unless they're overridden, the options in the config are set to the default values. Users can configure non-default retry behavior for a single library call (using BucketHandle.Retryer and ObjectHandle.Retryer) or for all calls made by a client (using Client.SetRetry). To modify retry behavior, pass in the relevant RetryOptions to one of these methods.

See the following code sample to learn how to customize your retry behavior.

Java

When you initialize Storage, an instance of RetrySettings is initialized as well. Unless they are overridden, the options in the RetrySettings are set to the default values. To modify the default automatic retry behavior, pass the custom StorageRetryStrategy into the StorageOptions used to construct the Storage instance. To modify any of the other scalar parameters, pass a custom RetrySettings into the StorageOptions used to construct the Storage instance.

See the following example to learn how to customize your retry behavior:

Node.js

When you initialize Cloud Storage, a retryOptions config file is initialized as well. Unless they're overridden, the options in the config are set to the default values. To modify the default retry behavior, pass the custom retry configuration retryOptions into the storage constructor upon initialization. The Node.js client library can automatically use backoff strategies to retry requests with the autoRetry parameter.

See the following code sample to learn how to customize your retry behavior.

PHP

When you initialize a storage client, a default retry configuration will be set. Unless they're overridden, the options in the config are set to the default values. Users can configure non-default retry behavior for a client or a single operation call by passing override options in an array.

See the following code sample to learn how to customize your retry behavior.

Python

To modify the default retry behavior, create a copy of the google.cloud.storage.retry.DEFAULT_RETRY object by calling it with a with_BEHAVIOR method. The Python client library automatically uses backoff strategies to retry requests if you include the DEFAULT_RETRY parameter.

Note that with_predicate is not supported for operations that fetch or send payload data to objects, like uploads and downloads. It's recommended that you modify attributes one by one. For more information, see the google-api-core Retry reference.

To configure your own conditional retry, create a ConditionalRetryPolicy object and wrap your custom Retry object with DEFAULT_RETRY_IF_GENERATION_SPECIFIED, DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED, or DEFAULT_RETRY_IF_ETAG_IN_JSON.

See the following code sample to learn how to customize your retry behavior.

Ruby

When you initialize the storage client, all retry configurations are set to the values shown in the table above. To modify the default retry behavior, pass retry configurations while initializing the storage client.

To override the number of retries for a particular operation, pass retries in the options parameter of the operation.

REST APIs

Use the exponential backoff algorithm to implement your own retry strategy.

Exponential backoff algorithm

An exponential backoff algorithm retries requests using exponentially increasing waiting times between requests, up to a maximum backoff time. You should generally use exponential backoff with jitter to retry requests that meet both the response and idempotency criteria. For best practices implementing automatic retries with exponential backoff, see Addressing Cascading Failures.

Retry anti-patterns

It is recommended to use or customize the built-in retry mechanisms where applicable; see customizing retries. Whether you are using the default retry mechanisms, customizing them, or implementing your own retry logic, it's crucial to avoid the following common anti-patterns as they can exacerbate issues rather than resolve them.

Retrying without backoff

Retrying requests immediately or with very short delays can lead to cascading failures which are failures that might trigger other failures.

How to avoid this: Implement exponential backoff with jitter. This strategy progressively increases the wait time between retries and adds a random element to prevent retries from overwhelming the service.

Unconditionally retrying non-idempotent operations

Repeatedly executing operations that are not idempotent can lead to unintended side effects, such as unintended overwrites or deletions of data.

How to avoid this: Thoroughly understand the idempotency characteristics of each operation as detailed in the idempotency of operations section. For non-idempotent operations, ensure your retry logic can handle potential duplicates or avoid retrying them altogether. Be cautious with retries that may lead to race conditions.

Retrying unretryable errors

Treating all errors as able to be tried again can be problematic. Some errors for example, authorization failures or invalid requests are persistent and retrying them without addressing the underlying cause won't be successful and may result in applications getting caught in an infinite loop.

How to avoid this: Categorize errors into transient (retryable) and permanent (non-retryable). Only retry transient errors like 408, 429, and 5xx HTTP codes, or specific connection issues. For permanent errors, log them and handle the underlying cause appropriately.

Ignoring retry limits

Retrying indefinitely can lead to resource exhaustion in your application or continuously send requests to a service that won't recover without intervention.

How to avoid this: Tailor retry limits to the nature of your workload. For latency sensitive workloads, consider setting a total maximum retry duration to ensure a timely response or failure. For batch workloads, which might tolerate longer retry periods for transient server side errors, consider setting a higher total retry limit.

Unnecessarily layering retries

Adding custom application level retry logic on top of the existing retry mechanisms can lead to an excessive number of retry attempts. For example, if your application retries an operation three times, and the underlying client library also retries it three times for each of your application's attempts, you could end up with nine retry attempts. Sending high amounts of retries for errors that cannot be retried might lead to request throttling, limiting the throughput of all workloads. High numbers of retries might also increase latency of requests without improving the success rate.

How to avoid this: We recommend using and configuring the built-in retry mechanisms. If you must implement application-level retries, like for specific business logic that spans multiple operations, do so with a clear understanding of the underlying retry behavior. Consider disabling or significantly limiting retries in one of the layers to prevent multiplicative effects.

What's next

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025-10-02 UTC.

[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-10-02 UTC."],[],[]]


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.5