diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt index 7fc71e37c7..b1d6c8b6be 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt @@ -147,6 +147,19 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, } } + internal fun rollbackTransaction() { + val transaction = contextTransaction + try { + logger.trace { "Rolling back transaction $transaction on ${Strand.currentStrand()}." } + transaction.rollback() + } catch (e: SQLException) { + logger.error("Transaction rollback failed: ${e.message}", e) + System.exit(1) + } finally { + transaction.close() + } + } + @Suspendable override fun initiateFlow(otherParty: Party, sessionFlow: FlowLogic<*>): FlowSession { val sessionKey = Pair(sessionFlow, otherParty) diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManagerImpl.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManagerImpl.kt index fd116454a8..8a258b7baf 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManagerImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/StateMachineManagerImpl.kt @@ -452,10 +452,14 @@ class StateMachineManagerImpl( } endAllFiberSessions(fiber, result, propagated) } finally { - fiber.commitTransaction() + if (result.isSuccess) { + fiber.commitTransaction() + totalFinishedFlows.inc() + unfinishedFibers.countDown() + } else { + fiber.rollbackTransaction() + } decrementLiveFibers() - totalFinishedFlows.inc() - unfinishedFibers.countDown() } } mutex.locked { diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt index 55d7073e5b..7a0c0e4fe2 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/FlowFrameworkTests.kt @@ -375,7 +375,7 @@ class FlowFrameworkTests { .withMessage("Nothing useful") .withStackTraceContaining(ReceiveFlow::class.java.name) // Make sure the stack trace is that of the receiving flow bobNode.database.transaction { - assertThat(bobNode.checkpointStorage.checkpoints()).isEmpty() + assertThat(bobNode.checkpointStorage.checkpoints()).isNotEmpty() } assertThat(receivingFiber.isTerminated).isTrue()