Add gating checks to fail gracefully between incompatible versions

This commit is contained in:
Dimos Raptis 2020-09-15 14:42:08 +01:00
parent 086a406fc5
commit aa74ae69c1
3 changed files with 10 additions and 0 deletions

View File

@ -17,4 +17,5 @@ object PlatformVersionSwitches {
const val BATCH_DOWNLOAD_COUNTERPARTY_BACKCHAIN = 6
const val ENABLE_P2P_COMPRESSION = 7
const val CERTIFICATE_ROTATION = 9
const val NEW_MESSAGE_ID_STRUCTURE = 9
}

View File

@ -12,4 +12,6 @@ open class SessionRejectException(message: String) : CordaException(message) {
class NotAFlow(val initiatorClass: Class<*>) : SessionRejectException("${initiatorClass.name} is not a flow")
class NotRegistered(val initiatorFlowClass: Class<out FlowLogic<*>>) : SessionRejectException("${initiatorFlowClass.name} is not registered")
class IncompatibleVersions(counterpartyPlatformVersion: Int, minRequiredVersion: Int) : SessionRejectException("The minimum platform version this node can communicate with ($minRequiredVersion) is larger than the platform version of your node ($counterpartyPlatformVersion)")
}

View File

@ -17,6 +17,7 @@ import net.corda.core.flows.StateMachineRunId
import net.corda.core.identity.Party
import net.corda.core.internal.FlowStateMachine
import net.corda.core.internal.FlowStateMachineHandle
import net.corda.core.internal.PlatformVersionSwitches.NEW_MESSAGE_ID_STRUCTURE
import net.corda.core.internal.VisibleForTesting
import net.corda.core.internal.bufferUntilSubscribed
import net.corda.core.internal.castIfPossible
@ -756,6 +757,12 @@ internal class SingleThreadedStateMachineManager(
}
private fun onSessionInit(sessionMessage: InitialSessionMessage, sender: Party, event: ExternalEvent.ExternalMessageEvent) {
if (event.receivedMessage.platformVersion < NEW_MESSAGE_ID_STRUCTURE) {
val error = SessionRejectException.IncompatibleVersions(event.receivedMessage.platformVersion, NEW_MESSAGE_ID_STRUCTURE)
flowHospital.sessionInitErrored(sessionMessage, sender, event, error)
return
}
try {
val initiatedFlowFactory = getInitiatedFlowFactory(sessionMessage)
val initiatedSessionId = event.receivedMessage.uniqueMessageId.sessionIdentifier