This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new 841250db7c Allow more time for startup to fix jenkins failures (#2903)
841250db7c is described below
commit 841250db7caafe0416615560974b1e043c279014
Author: Tim Allison <[email protected]>
AuthorDate: Wed Jun 24 19:32:16 2026 -0400
Allow more time for startup to fix jenkins failures (#2903)
---
.../java/org/apache/tika/pipes/core/PipesClient.java | 8 ++++++--
.../java/org/apache/tika/pipes/core/PipesConfig.java | 18 ++++++++++++++++++
.../org/apache/tika/pipes/core/PipesClientTest.java | 8 ++++----
3 files changed, 28 insertions(+), 6 deletions(-)
diff --git
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesClient.java
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesClient.java
index e274117564..1df7caec4b 100644
---
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesClient.java
+++
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesClient.java
@@ -304,8 +304,10 @@ public class PipesClient implements Closeable {
int port = serverManager.getPort();
LOG.debug("pipesClientId={}: connecting to server", pipesClientId);
- // Connect to server
- Socket socket = serverManager.connect((int)
pipesConfig.getSocketTimeoutMs());
+ // Connect to server. Use the generous startup timeout as the read
SO_TIMEOUT so the
+ // server's post-connect initialization and READY handshake aren't
bounded by the
+ // (possibly tight) per-request socketTimeoutMs.
+ Socket socket = serverManager.connect((int)
pipesConfig.getStartupTimeoutMs());
synchronized (connectionLock) {
connectionTuple = new ConnectionTuple(socket,
@@ -314,6 +316,8 @@ public class PipesClient implements Closeable {
}
waitForStartup();
+ // Server is ready; subsequent reads use the normal per-request socket
timeout.
+ socket.setSoTimeout((int) pipesConfig.getSocketTimeoutMs());
}
private void writeTask(FetchEmitTuple t) throws IOException {
diff --git
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
index fd1d19d566..c0dd1247ea 100644
---
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
+++
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
@@ -37,6 +37,8 @@ public class PipesConfig {
public static final long DEFAULT_SOCKET_TIMEOUT_MS = 60000;
+ public static final long DEFAULT_STARTUP_TIMEOUT_MS = 60000;
+
public static final long DEFAULT_HEARTBEAT_INTERVAL_MS = 1000;
public static final boolean DEFAULT_USE_SHARED_SERVER = false;
@@ -55,6 +57,7 @@ public class PipesConfig {
private boolean useSharedServer = DEFAULT_USE_SHARED_SERVER;
private long socketTimeoutMs = DEFAULT_SOCKET_TIMEOUT_MS;
+ private long startupTimeoutMs = DEFAULT_STARTUP_TIMEOUT_MS;
private long heartbeatIntervalMs = DEFAULT_HEARTBEAT_INTERVAL_MS;
private long shutdownClientAfterMillis =
DEFAULT_SHUTDOWN_CLIENT_AFTER_MILLS;
@@ -161,6 +164,21 @@ public class PipesConfig {
this.socketTimeoutMs = socketTimeoutMs;
}
+ public long getStartupTimeoutMs() {
+ return startupTimeoutMs;
+ }
+
+ /**
+ * Timeout in milliseconds for the forked server to start up and send its
READY handshake.
+ * Distinct from {@link #getSocketTimeoutMs()}: cold-starting the forked
JVM (loading config,
+ * parsers and plugins) can take far longer than a normal per-read
timeout, so the handshake
+ * gets its own generous budget. Once the server is ready, reads switch to
{@code socketTimeoutMs}.
+ * @param startupTimeoutMs
+ */
+ public void setStartupTimeoutMs(long startupTimeoutMs) {
+ this.startupTimeoutMs = startupTimeoutMs;
+ }
+
public long getHeartbeatIntervalMs() {
return heartbeatIntervalMs;
}
diff --git
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
index d3189f0bf1..011d1688e5 100644
---
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
+++
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
@@ -396,13 +396,13 @@ public class PipesClientTest {
PipesResult pipesResult = pipesClient.process(tuple);
long elapsed = System.currentTimeMillis() - startTime;
- // Should timeout due to socket timeout (no heartbeats received
within socketTimeoutMs)
- // fails with FAILED_TO_INITIALIZE when using mchange-commons-java
0.5.0
+ // Should timeout due to socket timeout (no heartbeats received
within socketTimeoutMs).
+ // Startup/handshake is bounded by startupTimeoutMs (not
socketTimeoutMs), so a slow
+ // fork cold-start no longer misfires here as FAILED_TO_INITIALIZE.
assertEquals(PipesResult.RESULT_STATUS.TIMEOUT,
pipesResult.status(),
"Should timeout when socket times out");
- // Socket timeout is 3 seconds; allow generous headroom for slow
CI runners
- // where the server may need multiple startup attempts before
connecting.
+ // Socket timeout is 3 seconds; allow generous headroom for slow
CI runners.
assertTrue(elapsed < 60000,
"Socket timeout should occur within 60s (elapsed: " +
elapsed + "ms)");