Skip to content

Commit 467c5bd

Browse files
committed
Make http timeouts configurable
1 parent c56bf1c commit 467c5bd

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/main/java/org/radarbase/output/config/AzureConfig.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package org.radarbase.output.config
22

33
import com.azure.core.credential.BasicAuthenticationCredential
4+
import com.azure.core.util.HttpClientOptions
45
import com.azure.storage.blob.BlobServiceClient
56
import com.azure.storage.blob.BlobServiceClientBuilder
67
import com.azure.storage.common.StorageSharedKeyCredential
78
import org.radarbase.output.config.RestructureConfig.Companion.copyEnv
89
import org.slf4j.LoggerFactory
10+
import java.time.Duration
911

1012
data class AzureConfig(
1113
/** URL to reach object store at. */
@@ -24,7 +26,15 @@ data class AzureConfig(
2426
val accountKey: String?,
2527
/** Azure SAS token for a configured service. */
2628
val sasToken: String?,
27-
) {
29+
/** HTTP connect timeout. */
30+
val connectTimeout: Long? = null,
31+
/** HTTP response timeout. */
32+
val responseTimeout: Long? = null,
33+
/** HTTP write timeout. */
34+
val writeTimeout: Long? = null,
35+
/** HTTP read timeout. */
36+
val readTimeout: Long? = null,
37+
) {
2838
fun createAzureClient(): BlobServiceClient = BlobServiceClientBuilder().apply {
2939
endpoint(endpoint)
3040
when {
@@ -35,6 +45,12 @@ data class AzureConfig(
3545
!sasToken.isNullOrEmpty() -> sasToken(sasToken)
3646
else -> logger.warn("No Azure credentials supplied. Assuming a public blob storage.")
3747
}
48+
clientOptions(HttpClientOptions().apply {
49+
connectTimeout = this@AzureConfig.connectTimeout.toDurationOrNull()
50+
responseTimeout = this@AzureConfig.responseTimeout.toDurationOrNull()
51+
writeTimeout = this@AzureConfig.writeTimeout.toDurationOrNull()
52+
readTimeout = this@AzureConfig.readTimeout.toDurationOrNull()
53+
})
3854
}.buildClient()
3955

4056
fun withEnv(prefix: String): AzureConfig = this
@@ -46,5 +62,8 @@ data class AzureConfig(
4662

4763
companion object {
4864
private val logger = LoggerFactory.getLogger(AzureConfig::class.java)
65+
private fun Long?.toDurationOrNull(): Duration? = this
66+
?.takeIf { it > 0 }
67+
?.let { Duration.ofSeconds(it) }
4968
}
5069
}

src/main/java/org/radarbase/output/config/S3Config.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package org.radarbase.output.config
22

33
import io.minio.MinioClient
44
import io.minio.credentials.IamAwsProvider
5+
import io.minio.http.HttpUtils
56
import org.radarbase.output.config.RestructureConfig.Companion.copyEnv
7+
import java.util.concurrent.TimeUnit
68

79
data class S3Config(
810
/** URL to reach object store at. */
@@ -15,6 +17,12 @@ data class S3Config(
1517
val bucket: String,
1618
/** If no endOffset is in the filename, read it from object tags. */
1719
val endOffsetFromTags: Boolean = false,
20+
/** HTTP connect timeout. */
21+
val connectTimeout: Long? = null,
22+
/** HTTP write timeout. */
23+
val writeTimeout: Long? = null,
24+
/** HTTP read timeout. */
25+
val readTimeout: Long? = null,
1826
) {
1927
fun createS3Client(): MinioClient = MinioClient.Builder().apply {
2028
endpoint(endpoint)
@@ -23,11 +31,24 @@ data class S3Config(
2331
} else {
2432
credentials(accessToken, secretKey)
2533
}
34+
httpClient(HttpUtils.newDefaultHttpClient(
35+
connectTimeout.toMillisOrDefault(),
36+
writeTimeout.toMillisOrDefault(),
37+
readTimeout.toMillisOrDefault(),
38+
))
2639
}.build()
2740

2841
fun withEnv(prefix: String): S3Config = this
2942
.copyEnv("${prefix}S3_ACCESS_TOKEN") { copy(accessToken = it) }
3043
.copyEnv("${prefix}S3_SECRET_KEY") { copy(secretKey = it) }
3144
.copyEnv("${prefix}S3_BUCKET") { copy(bucket = it) }
3245
.copyEnv("${prefix}S3_ENDPOINT") { copy(endpoint = it) }
46+
47+
companion object {
48+
private val DEFAULT_CONNECTION_TIMEOUT: Long = TimeUnit.MINUTES.toMillis(1)
49+
private fun Long?.toMillisOrDefault(): Long = this
50+
?.takeIf { it > 0 }
51+
?.let { TimeUnit.SECONDS.toMillis(it) }
52+
?: DEFAULT_CONNECTION_TIMEOUT
53+
}
3354
}

0 commit comments

Comments
 (0)