This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 1e13c2a1e93e CAMEL-24243: camel-aws2-athena - do not relaunch a
still-running query when waitTimeout expires
1e13c2a1e93e is described below
commit 1e13c2a1e93ef1be3c3a6e804b34bd9885f09b75
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Jul 24 10:45:59 2026 +0200
CAMEL-24243: camel-aws2-athena - do not relaunch a still-running query when
waitTimeout expires
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 the same SQL.
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();