diff --git a/manifests/zcloud-prod2/hpautoscaler.yaml b/manifests/zcloud-prod2/hpautoscaler.yaml
index 479a9a642..a8177268d 100644
--- a/manifests/zcloud-prod2/hpautoscaler.yaml
+++ b/manifests/zcloud-prod2/hpautoscaler.yaml
@@ -4,4 +4,5 @@ metadata:
name: delta-sharing-server-hpa
namespace: default
spec:
+ minReplicas: 3
maxReplicas: 8
diff --git a/server/src/main/resources/logback.xml b/server/src/main/resources/logback.xml
index 8972ea1dc..37a0a8db8 100644
--- a/server/src/main/resources/logback.xml
+++ b/server/src/main/resources/logback.xml
@@ -7,6 +7,11 @@
+
+
+
diff --git a/server/src/main/scala/io/delta/sharing/server/DeltaSharingService.scala b/server/src/main/scala/io/delta/sharing/server/DeltaSharingService.scala
index 65640d78f..cbcd00cfe 100644
--- a/server/src/main/scala/io/delta/sharing/server/DeltaSharingService.scala
+++ b/server/src/main/scala/io/delta/sharing/server/DeltaSharingService.scala
@@ -1252,6 +1252,7 @@ object DeltaSharingService {
.defaultHostname(serverConfig.getHost)
.disableDateHeader()
.disableServerHeader()
+ .idleTimeout(java.time.Duration.ofSeconds(serverConfig.idleTimeoutSeconds))
.requestTimeout(java.time.Duration.ofSeconds(serverConfig.requestTimeoutSeconds))
.annotatedService(serverConfig.endpoint, service: Any)
if (serverConfig.ssl == null) {
diff --git a/server/src/main/scala/io/delta/sharing/server/config/ServerConfig.scala b/server/src/main/scala/io/delta/sharing/server/config/ServerConfig.scala
index f1a6b2811..e7949c303 100644
--- a/server/src/main/scala/io/delta/sharing/server/config/ServerConfig.scala
+++ b/server/src/main/scala/io/delta/sharing/server/config/ServerConfig.scala
@@ -68,6 +68,10 @@ case class ServerConfig(
@BeanProperty var refreshTokenTtlMs: Int,
// Whether to emit performance/timing log lines for table queries and CDF requests.
@BeanProperty var perfLoggingEnabled: Boolean,
+ // The idle connection timeout in seconds. Connections idle for longer than this are closed.
+ // Should be greater than the proxy's IdleConnTimeout to avoid stale-connection EOF errors.
+ // Set to 0 to use Armeria's built-in default (15 seconds).
+ @BeanProperty var idleTimeoutSeconds: Long,
// Access logging configuration for tracking share data egress via structured logs.
@BeanProperty var accessLogging: AccessLoggingConfig
) extends ConfigItem {
@@ -94,6 +98,7 @@ case class ServerConfig(
queryTablePageTokenTtlMs = 259200000, // 3 days
refreshTokenTtlMs = 3600000, // 1 hour
perfLoggingEnabled = true,
+ idleTimeoutSeconds = 120,
accessLogging = null
)
}