This shows how to override the retry policies for spanner_admin::DatabaseAdminClient:
namespace spanner = ::google::cloud::spanner;
[](std::string const& project_id, std::string const& instance_id) {
// A database admin client is controlled by three policies. The retry
// policy determines for how long the client will retry transient failures.
auto retry_policy =
google::cloud::spanner_admin::DatabaseAdminLimitedTimeRetryPolicy(
/*maximum_duration=*/std::chrono::minutes(25))
.clone();
// The backoff policy controls how long does the client waits to retry after
// a transient failure. Here we configure a truncated exponential backoff
// with jitter:
// https://en.wikipedia.org/wiki/Exponential_backoff
// https://cloud.google.com/storage/docs/exponential-backoff
auto backoff_policy = spanner::ExponentialBackoffPolicy(
/*initial_delay=*/std::chrono::seconds(2),
/*maximum_delay=*/std::chrono::minutes(10),
/*scaling=*/2.0)
.clone();
// The polling policy controls how the client waits for long-running
// operations (such as creating new instances). `GenericPollingPolicy<>`
// combines existing policies. In this case, keep polling until the
// operation completes (with success or error) or 45 minutes, whichever
// happens first. Initially pause for 10 seconds between polling requests,
// increasing the pause by a factor of 4 until it becomes 2 minutes.
auto polling_policy =
spanner::GenericPollingPolicy<>(
spanner::LimitedTimeRetryPolicy(
/*maximum_duration=*/std::chrono::minutes(45)),
spanner::ExponentialBackoffPolicy(
/*initial_delay=*/std::chrono::seconds(10),
/*maximum_delay=*/std::chrono::minutes(2),
/*scaling=*/4.0))
.clone();
auto client = google::cloud::spanner_admin::DatabaseAdminClient(
google::cloud::spanner_admin::MakeDatabaseAdminConnection(),
google::cloud::Options{}
.set<google::cloud::spanner_admin::DatabaseAdminRetryPolicyOption>(
std::move(retry_policy))
.set<
google::cloud::spanner_admin::DatabaseAdminBackoffPolicyOption>(
std::move(backoff_policy))
.set<
google::cloud::spanner_admin::DatabaseAdminPollingPolicyOption>(
std::move(polling_policy)));
// Use the client as usual.
spanner::Instance instance(project_id, instance_id);
std::cout << "Available databases for instance " << instance << "\n";
for (auto& db : client.ListDatabases(instance.FullName())) {
if (!db) throw std::move(db).status();
std::cout << db->name() << "\n";
}
std::cout << "End of available databases\n";
}
This shows how to create a custom idempotency policy:
class CustomIdempotencyPolicy : public google::cloud::spanner_admin::
DatabaseAdminConnectionIdempotencyPolicy {
public:
~CustomIdempotencyPolicy() override = default;
std::unique_ptr<
google::cloud::spanner_admin::DatabaseAdminConnectionIdempotencyPolicy>
clone() const override {
return std::make_unique<CustomIdempotencyPolicy>(*this);
}
// Override inherited functions to define as needed.
};
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-22 UTC."],[[["\u003cp\u003eThis page provides documentation for various versions of the Spanner DatabaseAdminClient, ranging from version 2.11.0 up to the latest release candidate, 2.37.0-rc.\u003c/p\u003e\n"],["\u003cp\u003eThe content demonstrates how to override the default retry policies for the \u003ccode\u003espanner_admin::DatabaseAdminClient\u003c/code\u003e, allowing for custom configurations of retry duration, backoff strategies, and polling intervals.\u003c/p\u003e\n"],["\u003cp\u003eThe documentation includes a code example showing how to set a custom retry policy, backoff policy, and polling policy when creating a \u003ccode\u003eDatabaseAdminClient\u003c/code\u003e, and then how to use this client to list available databases.\u003c/p\u003e\n"],["\u003cp\u003eThe page also includes an example of creating a custom idempotency policy by creating a custom \u003ccode\u003eCustomIdempotencyPolicy\u003c/code\u003e class derived from the base class.\u003c/p\u003e\n"]]],[],null,["Version 2.28.0keyboard_arrow_down\n\n- [2.42.0-rc (latest)](/cpp/docs/reference/spanner/latest/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.41.0](/cpp/docs/reference/spanner/2.41.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.40.0](/cpp/docs/reference/spanner/2.40.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.39.0](/cpp/docs/reference/spanner/2.39.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.38.0](/cpp/docs/reference/spanner/2.38.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.37.0](/cpp/docs/reference/spanner/2.37.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.36.0](/cpp/docs/reference/spanner/2.36.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.35.0](/cpp/docs/reference/spanner/2.35.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.34.0](/cpp/docs/reference/spanner/2.34.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.33.0](/cpp/docs/reference/spanner/2.33.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.32.0](/cpp/docs/reference/spanner/2.32.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.31.0](/cpp/docs/reference/spanner/2.31.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.30.0](/cpp/docs/reference/spanner/2.30.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.29.0](/cpp/docs/reference/spanner/2.29.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.28.0](/cpp/docs/reference/spanner/2.28.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.27.0](/cpp/docs/reference/spanner/2.27.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.26.0](/cpp/docs/reference/spanner/2.26.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.25.1](/cpp/docs/reference/spanner/2.25.1/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.24.0](/cpp/docs/reference/spanner/2.24.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.23.0](/cpp/docs/reference/spanner/2.23.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.22.1](/cpp/docs/reference/spanner/2.22.1/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.21.0](/cpp/docs/reference/spanner/2.21.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.20.0](/cpp/docs/reference/spanner/2.20.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.19.0](/cpp/docs/reference/spanner/2.19.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.18.0](/cpp/docs/reference/spanner/2.18.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.17.0](/cpp/docs/reference/spanner/2.17.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.16.0](/cpp/docs/reference/spanner/2.16.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.15.1](/cpp/docs/reference/spanner/2.15.1/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.14.0](/cpp/docs/reference/spanner/2.14.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.13.0](/cpp/docs/reference/spanner/2.13.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.12.0](/cpp/docs/reference/spanner/2.12.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet)\n- [2.11.0](/cpp/docs/reference/spanner/2.11.0/spanner_admin_1_1DatabaseAdminClient-retry-snippet) \n\nOverride spanner_admin::DatabaseAdminClient Retry Policies\n==========================================================\n\nThis shows how to override the retry policies for `spanner_admin::DatabaseAdminClient`: \n\n namespace spanner = ::google::cloud::spanner;\n [](std::string const& project_id, std::string const& instance_id) {\n // A database admin client is controlled by three policies. The retry\n // policy determines for how long the client will retry transient failures.\n auto retry_policy =\n google::cloud::spanner_admin::DatabaseAdminLimitedTimeRetryPolicy(\n /*maximum_duration=*/std::chrono::minutes(25))\n .clone();\n // The backoff policy controls how long does the client waits to retry after\n // a transient failure. Here we configure a truncated exponential backoff\n // with jitter:\n // https://en.wikipedia.org/wiki/Exponential_backoff\n // https://cloud.google.com/storage/docs/exponential-backoff\n auto backoff_policy = spanner::ExponentialBackoffPolicy(\n /*initial_delay=*/std::chrono::seconds(2),\n /*maximum_delay=*/std::chrono::minutes(10),\n /*scaling=*/2.0)\n .clone();\n // The polling policy controls how the client waits for long-running\n // operations (such as creating new instances). `GenericPollingPolicy\u003c\u003e`\n // combines existing policies. In this case, keep polling until the\n // operation completes (with success or error) or 45 minutes, whichever\n // happens first. Initially pause for 10 seconds between polling requests,\n // increasing the pause by a factor of 4 until it becomes 2 minutes.\n auto polling_policy =\n spanner::GenericPollingPolicy\u003c\u003e(\n spanner::LimitedTimeRetryPolicy(\n /*maximum_duration=*/std::chrono::minutes(45)),\n spanner::ExponentialBackoffPolicy(\n /*initial_delay=*/std::chrono::seconds(10),\n /*maximum_delay=*/std::chrono::minutes(2),\n /*scaling=*/4.0))\n .clone();\n auto client = google::cloud::spanner_admin::DatabaseAdminClient(\n google::cloud::spanner_admin::MakeDatabaseAdminConnection(),\n google::cloud::Options{}\n .set\u003cgoogle::cloud::spanner_admin::DatabaseAdminRetryPolicyOption\u003e(\n std::move(retry_policy))\n .set\u003c\n google::cloud::spanner_admin::DatabaseAdminBackoffPolicyOption\u003e(\n std::move(backoff_policy))\n .set\u003c\n google::cloud::spanner_admin::DatabaseAdminPollingPolicyOption\u003e(\n std::move(polling_policy)));\n\n // Use the client as usual.\n spanner::Instance instance(project_id, instance_id);\n std::cout \u003c\u003c \"Available databases for instance \" \u003c\u003c instance \u003c\u003c \"\\n\";\n for (auto& db : client.ListDatabases(instance.FullName())) {\n if (!db) throw std::move(db).status();\n std::cout \u003c\u003c db-\u003ename() \u003c\u003c \"\\n\";\n }\n std::cout \u003c\u003c \"End of available databases\\n\";\n }\n\nThis shows how to create a custom idempotency policy: \n\n class CustomIdempotencyPolicy : public google::cloud::spanner_admin::\n DatabaseAdminConnectionIdempotencyPolicy {\n public:\n ~CustomIdempotencyPolicy() override = default;\n std::unique_ptr\u003c\n google::cloud::spanner_admin::DatabaseAdminConnectionIdempotencyPolicy\u003e\n clone() const override {\n return std::make_unique\u003cCustomIdempotencyPolicy\u003e(*this);\n }\n // Override inherited functions to define as needed.\n };"]]