Skip to content

Commit d27f2a6

Browse files
authored
fix: Use guava rate limiter instead of dev.failsafe (#1393)
For simplicity, we are removing the library dev.failsafe and using a rate limiter already included in the Guava library instead.
1 parent 4817660 commit d27f2a6

File tree

5 files changed

+15
-24
lines changed

5 files changed

+15
-24
lines changed

core/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,6 @@
129129
</dependencyManagement>
130130

131131
<dependencies>
132-
<dependency>
133-
<groupId>dev.failsafe</groupId>
134-
<artifactId>failsafe</artifactId>
135-
<version>3.3.2</version>
136-
</dependency>
137-
138132
<dependency>
139133
<groupId>junit</groupId>
140134
<artifactId>junit</artifactId>

core/src/main/java/com/google/cloud/sql/core/CloudSqlInstance.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
import com.google.common.util.concurrent.Futures;
2424
import com.google.common.util.concurrent.ListenableFuture;
2525
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
26+
import com.google.common.util.concurrent.RateLimiter;
2627
import com.google.common.util.concurrent.Uninterruptibles;
2728
import com.google.errorprone.annotations.concurrent.GuardedBy;
28-
import dev.failsafe.RateLimiter;
2929
import java.io.IOException;
3030
import java.security.KeyPair;
3131
import java.time.Instant;
@@ -56,7 +56,7 @@ class CloudSqlInstance {
5656
private final ListenableFuture<KeyPair> keyPair;
5757
private final Object instanceDataGuard = new Object();
5858
// Limit forced refreshes to 1 every minute.
59-
private final RateLimiter<Object> forcedRenewRateLimiter;
59+
private final RateLimiter forcedRenewRateLimiter;
6060

6161
private final RefreshCalculator refreshCalculator = new RefreshCalculator();
6262

@@ -84,7 +84,7 @@ class CloudSqlInstance {
8484
CredentialFactory tokenSourceFactory,
8585
ListeningScheduledExecutorService executor,
8686
ListenableFuture<KeyPair> keyPair,
87-
RateLimiter<Object> forcedRenewRateLimiter) {
87+
RateLimiter forcedRenewRateLimiter) {
8888
this.instanceName = new CloudSqlInstanceName(connectionName);
8989
this.instanceDataSupplier = instanceDataSupplier;
9090
this.authType = authType;
@@ -189,7 +189,7 @@ private InstanceData performRefresh() throws InterruptedException, ExecutionExce
189189
logger.fine(
190190
String.format("[%s] Refresh Operation: Acquiring rate limiter permit.", instanceName));
191191
// To avoid unreasonable SQL Admin API usage, use a rate limit to throttle our usage.
192-
forcedRenewRateLimiter.acquirePermit();
192+
forcedRenewRateLimiter.acquire();
193193
logger.fine(
194194
String.format(
195195
"[%s] Refresh Operation: Acquired rate limiter permit. Starting refresh...",

core/src/main/java/com/google/cloud/sql/core/CoreSocketFactory.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@
2424
import com.google.common.util.concurrent.ListenableFuture;
2525
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
2626
import com.google.common.util.concurrent.MoreExecutors;
27-
import dev.failsafe.RateLimiter;
27+
import com.google.common.util.concurrent.RateLimiter;
2828
import java.io.File;
2929
import java.io.IOException;
3030
import java.net.InetSocketAddress;
3131
import java.net.Socket;
3232
import java.security.KeyPair;
3333
import java.security.KeyPairGenerator;
3434
import java.security.NoSuchAlgorithmException;
35-
import java.time.Duration;
3635
import java.util.ArrayList;
3736
import java.util.List;
3837
import java.util.Properties;
@@ -359,6 +358,6 @@ CloudSqlInstance getCloudSqlInstance(String instanceName, AuthType authType) {
359358
credentialFactory,
360359
executor,
361360
localKeyPair,
362-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build()));
361+
RateLimiter.create(1.0 / 30.0))); // 1 refresh attempt every 30 seconds
363362
}
364363
}

core/src/test/java/com/google/cloud/sql/core/CloudSqlInstanceConcurrencyTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@
2525
import com.google.common.util.concurrent.Futures;
2626
import com.google.common.util.concurrent.ListenableFuture;
2727
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
28-
import dev.failsafe.RateLimiter;
28+
import com.google.common.util.concurrent.RateLimiter;
2929
import java.io.IOException;
3030
import java.security.KeyPair;
31-
import java.time.Duration;
3231
import java.util.ArrayList;
3332
import java.util.List;
3433
import java.util.concurrent.ExecutionException;
@@ -214,7 +213,7 @@ private Thread startForceRefreshThread(CloudSqlInstance inst) {
214213
return t;
215214
}
216215

217-
private RateLimiter<Object> newRateLimiter() {
218-
return RateLimiter.burstyBuilder(2, Duration.ofMillis(50)).build();
216+
private RateLimiter newRateLimiter() {
217+
return RateLimiter.create(20.0); // 20/sec = every 50 ms
219218
}
220219
}

core/src/test/java/com/google/cloud/sql/core/CloudSqlInstanceTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@
2323
import com.google.common.util.concurrent.ListenableFuture;
2424
import com.google.common.util.concurrent.ListeningScheduledExecutorService;
2525
import com.google.common.util.concurrent.MoreExecutors;
26-
import dev.failsafe.RateLimiter;
26+
import com.google.common.util.concurrent.RateLimiter;
2727
import java.security.KeyPair;
2828
import java.sql.Date;
29-
import java.time.Duration;
3029
import java.time.Instant;
3130
import java.time.temporal.ChronoUnit;
3231
import java.util.Arrays;
@@ -77,7 +76,7 @@ public void testCloudSqlInstanceDataRetrievedSuccessfully() throws Exception {
7776
stubCredentialFactory,
7877
executorService,
7978
keyPairFuture,
80-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build());
79+
RateLimiter.create(1.0 / 30.0));
8180

8281
SslData gotSslData = instance.getSslData();
8382
assertThat(gotSslData).isSameInstanceAs(instanceDataSupplier.response.getSslData());
@@ -111,7 +110,7 @@ public void testInstanceFailsOnConnectionError() throws Exception {
111110
stubCredentialFactory,
112111
executorService,
113112
keyPairFuture,
114-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build());
113+
RateLimiter.create(1.0 / 30.0));
115114

116115
RuntimeException ex = Assert.assertThrows(RuntimeException.class, instance::getSslData);
117116
assertThat(ex).hasMessageThat().contains("always fails");
@@ -139,7 +138,7 @@ public void testCloudSqlInstanceForcesRefresh() throws Exception {
139138
stubCredentialFactory,
140139
executorService,
141140
keyPairFuture,
142-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build());
141+
RateLimiter.create(1.0 / 30.0));
143142

144143
SslData gotSslData = instance.getSslData();
145144
assertThat(gotSslData).isSameInstanceAs(sslData);
@@ -179,7 +178,7 @@ public void testGetPreferredIpTypes() throws Exception {
179178
stubCredentialFactory,
180179
executorService,
181180
keyPairFuture,
182-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build());
181+
RateLimiter.create(1.0 / 30.0));
183182

184183
assertThat(instance.getPreferredIp(Arrays.asList("PUBLIC", "PRIVATE"))).isEqualTo("10.1.2.3");
185184
assertThat(instance.getPreferredIp(Arrays.asList("PUBLIC"))).isEqualTo("10.1.2.3");
@@ -216,7 +215,7 @@ public void testGetPreferredIpTypesThrowsException() throws Exception {
216215
stubCredentialFactory,
217216
executorService,
218217
keyPairFuture,
219-
RateLimiter.burstyBuilder(2, Duration.ofSeconds(30)).build());
218+
RateLimiter.create(1.0 / 30.0));
220219
Assert.assertThrows(
221220
IllegalArgumentException.class, () -> instance.getPreferredIp(Arrays.asList("PRIVATE")));
222221
}

0 commit comments

Comments
 (0)