From 88a205600d2a63ea4b13b8568c22828b434604a6 Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Tue, 22 Sep 2020 14:32:01 +0100 Subject: [PATCH] INFRA-749 Shut down and delete test H2 databases (#6739) --- .../corda/testing/node/DatabaseSnapshot.kt | 5 +++-- .../testing/node/internal/DriverDSLImpl.kt | 20 +++++++++++++++++-- .../node/internal/InternalMockNetwork.kt | 7 ++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/DatabaseSnapshot.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/DatabaseSnapshot.kt index bc1d7f7e90..810f38b2ed 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/DatabaseSnapshot.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/DatabaseSnapshot.kt @@ -13,11 +13,12 @@ object DatabaseSnapshot { return resourceUri.openStream() } + fun databaseFilename(baseDirectory: Path) = baseDirectory.resolve(databaseName) + fun copyDatabaseSnapshot(baseDirectory: Path) { getDatabaseSnapshotStream().use { stream -> Files.createDirectories(baseDirectory) - val path = baseDirectory.resolve(databaseName) - Files.copy(stream, path) + Files.copy(stream, databaseFilename(baseDirectory)) } } } \ No newline at end of file diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt index f97f7836ae..2471535c35 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt @@ -36,6 +36,7 @@ import net.corda.core.internal.cordapp.CordappImpl.Companion.MIN_PLATFORM_VERSIO import net.corda.core.internal.cordapp.CordappImpl.Companion.TARGET_PLATFORM_VERSION import net.corda.core.internal.cordapp.get import net.corda.core.internal.createDirectories +import net.corda.core.internal.deleteIfExists import net.corda.core.internal.div import net.corda.core.internal.isRegularFile import net.corda.core.internal.list @@ -57,6 +58,7 @@ import net.corda.core.utilities.toHexString import net.corda.coretesting.internal.stubs.CertificateStoreStubs import net.corda.node.NodeRegistrationOption import net.corda.node.VersionInfo +import net.corda.node.internal.DataSourceFactory import net.corda.node.internal.Node import net.corda.node.internal.NodeWithInfo import net.corda.node.internal.clientSslOptionsCompatibleWith @@ -272,14 +274,17 @@ class DriverDSLImpl( val name = parameters.providedName ?: CordaX500Name("${oneOf(names).organisation}-${p2pAddress.port}", "London", "GB") val config = createConfig(name, parameters, p2pAddress) - if (premigrateH2Database && isH2Database(config)) { - if (!inMemoryDB) { + if (isH2Database(config) && !inMemoryDB) { + if (premigrateH2Database) { try { DatabaseSnapshot.copyDatabaseSnapshot(config.corda.baseDirectory) } catch (ex: java.nio.file.FileAlreadyExistsException) { log.warn("Database already exists on disk, not attempting to pre-migrate database.") } } + shutdownManager.registerShutdown { + shutdownAndDeleteDatabase(config.corda) + } } val registrationFuture = if (compatibilityZone?.rootCert != null) { // We don't need the network map to be available to be able to register the node @@ -1142,6 +1147,17 @@ class DriverDSLImpl( private fun Map.removeResolvedClasspath(): Map { return filterNot { it.key == "java.class.path" } } + + private fun shutdownAndDeleteDatabase(config: NodeConfiguration) { + DataSourceFactory.createDataSource(config.dataSourceProperties).also { dataSource -> + dataSource.connection.use { connection -> + connection.createStatement().use { statement -> + statement.execute("SHUTDOWN") + } + } + } + DatabaseSnapshot.databaseFilename(config.baseDirectory).deleteIfExists() + } } } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt index eb66e98a40..6667fb212a 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt @@ -17,6 +17,7 @@ import net.corda.core.internal.NetworkParametersStorage import net.corda.core.internal.PLATFORM_VERSION import net.corda.core.internal.VisibleForTesting import net.corda.core.internal.createDirectories +import net.corda.core.internal.deleteIfExists import net.corda.core.internal.div import net.corda.core.internal.notary.NotaryService import net.corda.core.internal.uncheckedCast @@ -64,6 +65,7 @@ import net.corda.nodeapi.internal.network.NetworkParametersCopier import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.nodeapi.internal.persistence.DatabaseConfig import net.corda.testing.common.internal.testNetworkParameters +import net.corda.testing.node.DatabaseSnapshot import net.corda.testing.node.InMemoryMessagingNetwork import net.corda.testing.node.MockNetworkNotarySpec import net.corda.testing.node.MockNetworkParameters @@ -606,7 +608,10 @@ open class InternalMockNetwork(cordappPackages: List = emptyList(), cordappClassLoader.use { _ -> // Serialization env must be unset even if other parts of this method fail. serializationEnv.use { - nodes.forEach { it.started?.dispose() } + nodes.forEach { node -> + node.started?.dispose() + DatabaseSnapshot.databaseFilename(node.configuration.baseDirectory).deleteIfExists() + } } messagingNetwork.stop() }