From f6ca5e55a58aa1fd72277882cff0e491e01ddc28 Mon Sep 17 00:00:00 2001 From: Ravi Khadiwala Date: Tue, 21 Jul 2026 17:23:14 -0500 Subject: [PATCH] Make timeout for storage usage queries configurable --- .../textsecuregcm/backup/Cdn3RemoteStorageManager.java | 3 +++ .../configuration/Cdn3StorageManagerConfiguration.java | 9 ++++++++- .../backup/Cdn3RemoteStorageManagerTest.java | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java index b49e847bc..2da875ea1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java @@ -42,6 +42,7 @@ public class Cdn3RemoteStorageManager implements RemoteStorageManager { private final String clientId; private final String clientSecret; private final Map sourceSchemes; + private final Duration usageRequestTimeout; static final String CLIENT_ID_HEADER = "CF-Access-Client-Id"; static final String CLIENT_SECRET_HEADER = "CF-Access-Client-Secret"; @@ -75,6 +76,7 @@ public class Cdn3RemoteStorageManager implements RemoteStorageManager { .withNumClients(configuration.numHttpClients()) .build(); this.sourceSchemes = configuration.sourceSchemes(); + this.usageRequestTimeout = configuration.usageRequestTimeout(); } @Override @@ -231,6 +233,7 @@ public class Cdn3RemoteStorageManager implements RemoteStorageManager { HttpUtils.queryParamString(Map.of("prefix", prefix).entrySet())))) .header(CLIENT_ID_HEADER, clientId) .header(CLIENT_SECRET_HEADER, clientSecret) + .timeout(usageRequestTimeout) .build(); return this.storageManagerHttpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()) .thenApply(response -> { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/Cdn3StorageManagerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/Cdn3StorageManagerConfiguration.java index b88f55da4..0ce25316a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/configuration/Cdn3StorageManagerConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/Cdn3StorageManagerConfiguration.java @@ -2,6 +2,7 @@ package org.whispersystems.textsecuregcm.configuration; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import java.time.Duration; import java.util.Collections; import java.util.Map; import org.whispersystems.textsecuregcm.configuration.secrets.SecretString; @@ -21,6 +22,8 @@ import javax.annotation.Nullable; * client; if `null`, uses the global default configuration * @param retryConfigurationName The name of a retry configuration for the storage-manager http client; if * `null`, uses the global default configuration + * @param usageRequestTimeout The per-attempt request timeout for usage requests to the storage-manager; if + * `null`, defaults to 5 minutes */ public record Cdn3StorageManagerConfiguration( @NotNull String baseUri, @@ -29,7 +32,8 @@ public record Cdn3StorageManagerConfiguration( @NotNull Map sourceSchemes, @NotNull Integer numHttpClients, @Nullable String circuitBreakerConfigurationName, - @Nullable String retryConfigurationName) { + @Nullable String retryConfigurationName, + @NotNull Duration usageRequestTimeout) { public Cdn3StorageManagerConfiguration { if (numHttpClients == null) { @@ -38,5 +42,8 @@ public record Cdn3StorageManagerConfiguration( if (sourceSchemes == null) { sourceSchemes = Collections.emptyMap(); } + if (usageRequestTimeout == null) { + usageRequestTimeout = Duration.ofMinutes(5); + } } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManagerTest.java index 7a0b85163..eaa05dd3f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManagerTest.java @@ -57,6 +57,7 @@ public class Cdn3RemoteStorageManagerTest { Map.of(2, "gcs", 3, "r2"), 2, null, + null, null)); }