From 56dbf1e8445bba8493a6f4d50e3a26b1b5914141 Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Thu, 2 Feb 2017 18:21:00 +0000 Subject: [PATCH] Prevent node from starting across upgrades (until we support it better) (#199) * Prevent node from starting across upgrades (until we support it better). On first run a version file is created in the node dir, and on subsequent runs the node version is matched against it. * Move version check from caplet to node. --- node/capsule/build.gradle | 2 ++ .../kotlin/net/corda/node/internal/Node.kt | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/node/capsule/build.gradle b/node/capsule/build.gradle index 039639535e..e6f1ddc61f 100644 --- a/node/capsule/build.gradle +++ b/node/capsule/build.gradle @@ -54,9 +54,11 @@ task buildCordaJAR(type: FatCapsule, dependsOn: ['buildCertSigningRequestUtility applicationSource = files(project.tasks.findByName('jar'), '../build/classes/main/CordaCaplet.class', 'config/dev/log4j2.xml') capsuleManifest { + applicationVersion = corda_version appClassPath = ["jolokia-agent-war-${project.rootProject.ext.jolokia_version}.war"] javaAgents = ["quasar-core-${quasar_version}-jdk8.jar"] systemProperties['visualvm.display.name'] = 'Corda' + systemProperties['corda.version'] = corda_version minJavaVersion = '1.8.0' // This version is known to work and avoids earlier 8u versions that have bugs. minUpdateVersion['1.8'] = '102' diff --git a/node/src/main/kotlin/net/corda/node/internal/Node.kt b/node/src/main/kotlin/net/corda/node/internal/Node.kt index b4b48d0101..b7bbb6f491 100644 --- a/node/src/main/kotlin/net/corda/node/internal/Node.kt +++ b/node/src/main/kotlin/net/corda/node/internal/Node.kt @@ -31,6 +31,8 @@ import org.jetbrains.exposed.sql.Database import java.io.RandomAccessFile import java.lang.management.ManagementFactory import java.nio.channels.FileLock +import java.nio.file.Files +import java.nio.file.Paths import java.time.Clock import javax.management.ObjectName import javax.servlet.* @@ -100,6 +102,27 @@ class Node(override val configuration: FullNodeConfiguration, private lateinit var userService: RPCUserService + init { + checkVersionUnchanged() + } + + /** + * Abort starting the node if an existing deployment with a different version is detected in the current directory. + * The current version is expected to be specified as a system property. If not provided, the check will be ignored. + */ + private fun checkVersionUnchanged() { + val currentVersion = System.getProperty("corda.version") ?: return + val versionFile = Paths.get("version") + if (Files.exists(versionFile)) { + val existingVersion = Files.readAllLines(versionFile)[0] + check(existingVersion == currentVersion) { + "Version change detected - current: $currentVersion, existing: $existingVersion. Node upgrades are not yet supported." + } + } else { + Files.write(versionFile, currentVersion.toByteArray()) + } + } + override fun makeMessagingService(): MessagingServiceInternal { userService = RPCUserServiceImpl(configuration)