diff --git a/java/google/registry/dns/writer/clouddns/CloudDnsModule.java b/java/google/registry/dns/writer/clouddns/CloudDnsModule.java index 4811220fc..2fa990dc5 100644 --- a/java/google/registry/dns/writer/clouddns/CloudDnsModule.java +++ b/java/google/registry/dns/writer/clouddns/CloudDnsModule.java @@ -20,6 +20,7 @@ import com.google.api.client.json.JsonFactory; import com.google.api.services.dns.Dns; import com.google.api.services.dns.DnsScopes; import com.google.common.base.Function; +import com.google.common.util.concurrent.RateLimiter; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; @@ -58,4 +59,13 @@ public final class CloudDnsModule { static String provideWriterName() { return CloudDnsWriter.NAME; } + + @Provides + @Named("cloudDns") + static RateLimiter provideRateLimiter() { + // This is the default max QPS for Cloud DNS. It can be increased by contacting the team + // via the Quotas page on the Cloud Console. + int cloudDnsMaxQps = 20; + return RateLimiter.create(cloudDnsMaxQps); + } } diff --git a/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java b/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java index 7eed00518..4f83c8155 100644 --- a/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java +++ b/java/google/registry/dns/writer/clouddns/CloudDnsWriter.java @@ -50,6 +50,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Callable; import javax.inject.Inject; +import javax.inject.Named; import org.joda.time.Duration; /** @@ -66,16 +67,11 @@ class CloudDnsWriter implements DnsWriter { public static final String NAME = "CloudDnsWriter"; private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); - - // This is the default max QPS for Cloud DNS. It can be increased by contacting the team - // via the Quotas page on the Cloud Console. - // TODO(shikhman): inject the RateLimiter - private static final int CLOUD_DNS_MAX_QPS = 20; - private static final RateLimiter rateLimiter = RateLimiter.create(CLOUD_DNS_MAX_QPS); private static final ImmutableSet RETRYABLE_EXCEPTION_REASONS = ImmutableSet.of("preconditionFailed", "notFound", "alreadyExists"); private final Clock clock; + private final RateLimiter rateLimiter; // TODO(shikhman): This uses @Config("transientFailureRetries") which may not be tuned for this // application. private final Retrier retrier; @@ -92,12 +88,14 @@ class CloudDnsWriter implements DnsWriter { @Config("projectId") String projectId, @DnsWriterZone String zoneName, @Config("dnsDefaultTtl") Duration defaultTtl, + @Named("cloudDns") RateLimiter rateLimiter, Clock clock, Retrier retrier) { this.dnsConnection = dnsConnection; this.projectId = projectId; this.zoneName = zoneName; this.defaultTtl = defaultTtl; + this.rateLimiter = rateLimiter; this.clock = clock; this.retrier = retrier; } diff --git a/javatests/google/registry/dns/writer/clouddns/BUILD b/javatests/google/registry/dns/writer/clouddns/BUILD index caca6172b..84697b27b 100644 --- a/javatests/google/registry/dns/writer/clouddns/BUILD +++ b/javatests/google/registry/dns/writer/clouddns/BUILD @@ -17,6 +17,7 @@ java_library( "//java/com/google/common/collect", "//java/com/google/common/io", "//java/com/google/common/net", + "//java/com/google/common/util/concurrent", "//third_party/java/joda_time", "//third_party/java/jsr305_annotations", "//third_party/java/jsr330_inject", diff --git a/javatests/google/registry/dns/writer/clouddns/CloudDnsWriterTest.java b/javatests/google/registry/dns/writer/clouddns/CloudDnsWriterTest.java index f5e7d1441..c0bea3660 100644 --- a/javatests/google/registry/dns/writer/clouddns/CloudDnsWriterTest.java +++ b/javatests/google/registry/dns/writer/clouddns/CloudDnsWriterTest.java @@ -37,6 +37,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.common.net.InetAddresses; +import com.google.common.util.concurrent.RateLimiter; import com.googlecode.objectify.Key; import google.registry.dns.writer.clouddns.CloudDnsWriter.ZoneStateException; import google.registry.model.domain.DomainResource; @@ -101,6 +102,7 @@ public class CloudDnsWriterTest { "projectId", "zoneName", DEFAULT_TTL, + RateLimiter.create(20), new SystemClock(), new Retrier(new SystemSleeper(), 5));