in spanner_prober/prober/proberlib.go [456:500]
func createCloudSpannerInstanceIfMissing(ctx context.Context, instanceClient *instance.InstanceAdminClient, opt ProberOptions) error {
// Skip instance creation requests if the instance already exists.
if checkInstancePresence(ctx, instanceClient, opt) {
return nil
}
op, err := instanceClient.CreateInstance(ctx, &instancepb.CreateInstanceRequest{
Parent: opt.projectURI(),
InstanceId: opt.instanceName(),
Instance: &instancepb.Instance{
Name: opt.instanceURI(),
Config: opt.instanceConfigURI(),
DisplayName: opt.instanceName(),
NodeCount: int32(opt.NodeCount),
ProcessingUnits: int32(opt.ProcessingUnits),
},
})
// If instance create operations fails, check if the instance was already created. If no, return error.
if err != nil {
if status.Code(err) != codes.AlreadyExists {
return err
}
} else if _, err := op.Wait(ctx); err != nil {
return err
}
// Wait for instance to be ready.
var retries int
for {
var resp *instancepb.Instance
resp, err = instanceClient.GetInstance(ctx, &instancepb.GetInstanceRequest{
Name: opt.instanceURI(),
})
if err != nil || resp.State == instancepb.Instance_READY {
return err
}
select {
case <-time.After(backoff(baseLRORetryDelay, maxLRORetryDelay, retries)):
case <-ctx.Done():
return ctx.Err()
}
retries++
}
}