This is an automated email from the ASF dual-hosted git repository. jiriondrusek pushed a commit to branch camel-main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit a97aeb453324cde0f4a225ce38eb3ac9eb75ed51 Author: James Netherton <[email protected]> AuthorDate: Mon Sep 22 11:17:10 2025 +0100 Add configuration support for FileLockClusterService heartbeat-timeout-multiplier option --- .../ROOT/pages/reference/extensions/file-cluster-service.adoc | 10 ++++++++++ .../FileLockClusterServiceConfigDefaultEnabledTest.java | 1 + .../FileLockClusterServiceConfigNonDefaultEnabledTest.java | 3 +++ .../component/file/cluster/FileLockClusterServiceConfig.java | 11 +++++++++++ .../file/cluster/FileLockClusterServiceRecorder.java | 1 + 5 files changed, 26 insertions(+) diff --git a/docs/modules/ROOT/pages/reference/extensions/file-cluster-service.adoc b/docs/modules/ROOT/pages/reference/extensions/file-cluster-service.adoc index 0142a5d0d0..38668db7d8 100644 --- a/docs/modules/ROOT/pages/reference/extensions/file-cluster-service.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/file-cluster-service.adoc @@ -115,6 +115,16 @@ a|icon:lock[title=Fixed at build time] [[quarkus-camel-cluster-file-acquire-lock The time to wait between attempts to try to acquire lock (defaults to 10000ms). | `string` | + +a|icon:lock[title=Fixed at build time] [[quarkus-camel-cluster-file-heartbeat-timeout-multiplier]]`link:#quarkus-camel-cluster-file-heartbeat-timeout-multiplier[quarkus.camel.cluster.file.heartbeat-timeout-multiplier]` + +Multiplier applied to the cluster leader `acquireLockInterval` to determine how long followers should wait +before considering the leader "stale". + +For example, if the leader updates its heartbeat every 2 seconds and the `heartbeatTimeoutMultiplier` is `3`, +followers will tolerate up to `2s * 3 = 6s` of silence before declaring the leader unavailable. +| `int` +| |=== [.configuration-legend] diff --git a/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigDefaultEnabledTest.java b/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigDefaultEnabledTest.java index 211b7993e8..b2de259b96 100644 --- a/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigDefaultEnabledTest.java +++ b/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigDefaultEnabledTest.java @@ -84,5 +84,6 @@ public class FileLockClusterServiceConfigDefaultEnabledTest { assertEquals(TimeUnit.SECONDS, service.getAcquireLockDelayUnit()); assertEquals(10L, service.getAcquireLockInterval()); assertEquals(TimeUnit.SECONDS, service.getAcquireLockIntervalUnit()); + assertEquals(5, service.getHeartbeatTimeoutMultiplier()); } } diff --git a/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigNonDefaultEnabledTest.java b/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigNonDefaultEnabledTest.java index 9104fda388..caf22d25de 100644 --- a/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigNonDefaultEnabledTest.java +++ b/extensions/file-cluster-service/deployment/src/test/java/org/apache/camel/quarkus/component/file/cluster/deployment/FileLockClusterServiceConfigNonDefaultEnabledTest.java @@ -55,6 +55,7 @@ public class FileLockClusterServiceConfigNonDefaultEnabledTest { props.setProperty("quarkus.camel.cluster.file.attributes.key2", "value2"); props.setProperty("quarkus.camel.cluster.file.acquire-lock-delay", "5"); props.setProperty("quarkus.camel.cluster.file.acquire-lock-interval", "1h"); + props.setProperty("quarkus.camel.cluster.file.heartbeat-timeout-multiplier", "1"); try { props.store(writer, ""); @@ -93,5 +94,7 @@ public class FileLockClusterServiceConfigNonDefaultEnabledTest { assertEquals(TimeUnit.MILLISECONDS, service.getAcquireLockDelayUnit()); assertEquals(3600000, service.getAcquireLockInterval()); assertEquals(TimeUnit.MILLISECONDS, service.getAcquireLockIntervalUnit()); + + assertEquals(1, service.getHeartbeatTimeoutMultiplier()); } } diff --git a/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceConfig.java b/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceConfig.java index ba989998b3..4805140c07 100644 --- a/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceConfig.java +++ b/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceConfig.java @@ -82,6 +82,17 @@ public interface FileLockClusterServiceConfig { */ Optional<String> acquireLockInterval(); + /** + * Multiplier applied to the cluster leader `acquireLockInterval` to determine how long followers should wait + * before considering the leader "stale". + * + * For example, if the leader updates its heartbeat every 2 seconds and the `heartbeatTimeoutMultiplier` is `3`, + * followers will tolerate up to `2s * 3 = 6s` of silence before declaring the leader unavailable. + * + * @asciidoclet + */ + Optional<Integer> heartbeatTimeoutMultiplier(); + final class Enabled implements BooleanSupplier { FileLockClusterServiceConfig config; diff --git a/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceRecorder.java b/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceRecorder.java index c9636063b8..0f61bbaa1b 100644 --- a/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceRecorder.java +++ b/extensions/file-cluster-service/runtime/src/main/java/org/apache/camel/quarkus/component/file/cluster/FileLockClusterServiceRecorder.java @@ -37,6 +37,7 @@ public class FileLockClusterServiceRecorder { config.acquireLockInterval().ifPresent(interval -> { flcs.setAcquireLockInterval(TimePatternConverter.toMilliSeconds(interval), TimeUnit.MILLISECONDS); }); + config.heartbeatTimeoutMultiplier().ifPresent(flcs::setHeartbeatTimeoutMultiplier); config.attributes().forEach(flcs::setAttribute);
