Override spanner_admin::InstanceAdminClient Retry Policies

This shows how to override the retry policies for spanner_admin::InstanceAdminClient:

  namespace spanner = ::google::cloud::spanner;
 
[](std::string const& project_id) {
   
// An instance 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::InstanceAdminLimitedTimeRetryPolicy(
           
/*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::InstanceAdminClient(
        google
::cloud::spanner_admin::MakeInstanceAdminConnection(),
        google
::cloud::Options{}
           
.set<google::cloud::spanner_admin::InstanceAdminRetryPolicyOption>(
                std
::move(retry_policy))
           
.set<
                google
::cloud::spanner_admin::InstanceAdminBackoffPolicyOption>(
                std
::move(backoff_policy))
           
.set<
                google
::cloud::spanner_admin::InstanceAdminPollingPolicyOption>(
                std
::move(polling_policy)));

   
// Use the client as usual.
    std
::cout << "Available configs for project " << project_id << "\n";
   
auto project = google::cloud::Project(project_id);
   
for (auto& cfg : client.ListInstanceConfigs(project.FullName())) {
     
if (!cfg) throw std::move(cfg).status();
      std
::cout << cfg->name() << "\n";
   
}
    std
::cout << "End of available configs\n";
 
}

This shows how to create a custom idempotency policy:

class CustomIdempotencyPolicy : public google::cloud::spanner_admin::
                                   
InstanceAdminConnectionIdempotencyPolicy {
 
public:
 
~CustomIdempotencyPolicy() override = default;
  std
::unique_ptr<
      google
::cloud::spanner_admin::InstanceAdminConnectionIdempotencyPolicy>
  clone
() const override {
   
return std::make_unique<CustomIdempotencyPolicy>(*this);
 
}
 
// Override inherited functions to define as needed.
};