diff --git a/node/src/integration-test/kotlin/net/corda/node/services/TimedFlowMultiThreadedSMMTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/TimedFlowMultiThreadedSMMTests.kt index 4a3e8064d0..54cc843808 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/TimedFlowMultiThreadedSMMTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/TimedFlowMultiThreadedSMMTests.kt @@ -182,4 +182,4 @@ class TimedFlowMultiThreadedSMMTests : IntegrationTest() { } } } -} \ No newline at end of file +} diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/MultiThreadedStateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/MultiThreadedStateMachineManager.kt index bdd6e2b5bc..87eb777a9c 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/MultiThreadedStateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/MultiThreadedStateMachineManager.kt @@ -602,10 +602,11 @@ class MultiThreadedStateMachineManager( private fun scheduleTimeoutException(flow: Flow, retryCount: Int): ScheduledFuture<*> { return with(serviceHub.configuration.flowTimeout) { val timeoutDelaySeconds = timeout.seconds * Math.pow(backoffBase, retryCount.toDouble()).toLong() + val jitteredDelaySeconds = maxOf(1L ,timeoutDelaySeconds/2 + (Random().nextDouble() * timeoutDelaySeconds/2).toLong()) timeoutScheduler.schedule({ val event = Event.Error(FlowTimeoutException(maxRestartCount)) flow.fiber.scheduleEvent(event) - }, timeoutDelaySeconds, TimeUnit.SECONDS) + }, jitteredDelaySeconds, TimeUnit.SECONDS) } } diff --git a/node/src/main/resources/reference.conf b/node/src/main/resources/reference.conf index de036401ec..a11783b91f 100644 --- a/node/src/main/resources/reference.conf +++ b/node/src/main/resources/reference.conf @@ -46,6 +46,6 @@ rpcSettings = { } flowTimeout { timeout = 30 seconds - maxRestartCount = 5 + maxRestartCount = 6 backoffBase = 1.8 }