Retry, Backoff, and Idempotency Policies.

Application developers can override the default retry and backoff policies.

The default policies are to continue retrying for up to 15 minutes, and to use truncated (at 5 minutes) exponential backoff, doubling the maximum backoff period between retries.

  namespace spanner = ::google::cloud::spanner;
 
using ::google::cloud::StatusOr;
 
[](std::string const& project_id, std::string const& instance_id,
     std
::string const& database_id) {
   
// Use a truncated exponential backoff with jitter to wait between
   
// retries:
   
//   https://en.wikipedia.org/wiki/Exponential_backoff
   
//   https://cloud.google.com/storage/docs/exponential-backoff
   
auto client = spanner::Client(spanner::MakeConnection(
        spanner
::Database(project_id, instance_id, database_id),
        google
::cloud::Options{}
           
.set<spanner::SpannerRetryPolicyOption>(
                std
::make_shared<spanner::LimitedTimeRetryPolicy>(
                   
/*maximum_duration=*/std::chrono::seconds(60)))
           
.set<spanner::SpannerBackoffPolicyOption>(
                std
::make_shared<spanner::ExponentialBackoffPolicy>(
                   
/*initial_delay=*/std::chrono::milliseconds(500),
                   
/*maximum_delay=*/std::chrono::seconds(64),
                   
/*scaling=*/1.5))));

    std
::int64_t rows_inserted;
   
auto commit_result = client.Commit(
       
[&client, &rows_inserted](
            spanner
::Transaction txn) -> StatusOr<spanner::Mutations> {
         
auto insert = client.ExecuteDml(
              std
::move(txn),
              spanner
::SqlStatement(
                 
"INSERT INTO Singers (SingerId, FirstName, LastName)"
                 
"  VALUES (20, 'George', 'Washington')"));
         
if (!insert) return std::move(insert).status();
          rows_inserted
= insert->RowsModified();
         
return spanner::Mutations{};
       
});
   
if (!commit_result) throw std::move(commit_result).status();
    std
::cout << "Rows inserted: " << rows_inserted;
 
}
See Also

LimitedTimeRetryPolicy and LimitedErrorCountRetryPolicy for alternative retry policies.

See Also

ExponentialBackoffPolicy to configure different parameters for the exponential backoff policy.