This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch camel-4.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.18.x by this push:
new 49f6cbee16f3 CAMEL-24243: camel-aws2-athena - do not relaunch a
still-running query when waitTimeout expires
49f6cbee16f3 is described below
commit 49f6cbee16f313c21b8e814e8d0bad4617983917
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Jul 24 10:48:57 2026 +0200
CAMEL-24243: camel-aws2-athena - do not relaunch a still-running query when
waitTimeout expires
Backport to camel-4.18.x: when the waitTimeout expires and the Athena query
is still running, the helper no longer treats it as retryable. This prevents
orphaning the running query and double-billing.
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---
.../component/aws2/athena/Athena2QueryHelper.java | 21 +++++++++
.../aws2/athena/Athena2QueryHelperTest.java | 54 ++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2QueryHelper.java
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2QueryHelper.java
index 9bfa3c48f051..0f188e0a9220 100644
---
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2QueryHelper.java
+++
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2QueryHelper.java
@@ -125,11 +125,32 @@ class Athena2QueryHelper {
return false;
}
+ if (isWaitTimeoutExceeded()) {
+ LOG.trace("AWS Athena start query execution exceeded the wait
timeout of {} while the query was still"
+ + " running, will not relaunch it",
+ this.waitTimeout);
+ return false;
+ }
+
// if this.isRetry, return true
return true;
}
+ /**
+ * Did the wait window elapse while the query was still running? Only a
completed-and-retryable query is meant to
+ * consume another attempt, so a query that is merely slow must not be
relaunched.
+ * <p>
+ * Called from {@link #shouldAttempt()} once success and failure have been
ruled out, so {@code isRetry} is the only
+ * completion state left to exclude here.
+ */
+ private boolean isWaitTimeoutExceeded() {
+ if (this.attempts == 0 || this.isRetry) {
+ return false;
+ }
+ return now() - this.startMs >= this.waitTimeout;
+ }
+
/**
* Should there be a wait for the query to complete?
*/
diff --git
a/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2QueryHelperTest.java
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2QueryHelperTest.java
index 2d668168f85d..5d9152dee711 100644
---
a/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2QueryHelperTest.java
+++
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2QueryHelperTest.java
@@ -186,6 +186,60 @@ public class Athena2QueryHelperTest {
}
}
+ @Test
+ void aStillRunningQueryIsNotRelaunchedWhenTheWaitTimeoutExpires() {
+ Athena2Configuration configuration = new Athena2Configuration();
+ configuration.setMaxAttempts(3);
+ configuration.setWaitTimeout(1);
+ configuration.setInitialDelay(1);
+ configuration.setDelay(1);
+ configuration.setRetry("always");
+
+ Athena2QueryHelper helper = new Athena2QueryHelper(
+ new DefaultExchange(new DefaultCamelContext()),
+ configuration);
+
+ assertThat(helper.shouldAttempt()).isTrue();
+ helper.markAttempt();
+
+ // the query is still running when the wait window elapses, so no
completion state gets set
+ helper.doWait();
+
helper.setStatusFrom(newGetQueryExecutionResponse(QueryExecutionState.RUNNING));
+
+ assertThat(helper.shouldWait()).isFalse();
+ assertThat(helper.isSuccess()).isFalse();
+ assertThat(helper.isFailure()).isFalse();
+ assertThat(helper.isRetry()).isFalse();
+
+ // attempts are reserved for retrying completed-and-retryable queries;
relaunching here would
+ // orphan the running query and bill the same SQL twice
+ assertThat(helper.shouldAttempt()).isFalse();
+ assertThat(helper.getAttempts()).isEqualTo(1);
+ }
+
+ @Test
+ void aRetryableFailureStillConsumesAnotherAttemptAfterTheWaitTimeout() {
+ Athena2Configuration configuration = new Athena2Configuration();
+ configuration.setMaxAttempts(3);
+ configuration.setWaitTimeout(1);
+ configuration.setInitialDelay(1);
+ configuration.setDelay(1);
+ configuration.setRetry("always");
+
+ Athena2QueryHelper helper = new Athena2QueryHelper(
+ new DefaultExchange(new DefaultCamelContext()),
+ configuration);
+
+ assertThat(helper.shouldAttempt()).isTrue();
+ helper.markAttempt();
+
+ helper.doWait();
+
helper.setStatusFrom(newGetQueryExecutionResponse(QueryExecutionState.FAILED,
"GENERIC_INTERNAL_ERROR"));
+
+ assertThat(helper.isRetry()).isTrue();
+ assertThat(helper.shouldAttempt()).isTrue();
+ }
+
@Test
public void isComplete() {
Athena2QueryHelper helper = defaultAthena2QueryHelper();