From 7b349ad0494fd9fa7c2a061f5974543da3d6f52a Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Thu, 17 Oct 2019 17:48:19 +0100 Subject: [PATCH] Pre-generate Corda classes for DJVM sandbox when node boots in production mode. --- core-deterministic/build.gradle | 1 + .../src/main/resources/META-INF/DJVM-preload | 0 node/djvm/src/main/resources/META-INF/DJVM-preload | 0 .../main/kotlin/net/corda/node/internal/AbstractNode.kt | 8 +++++++- .../transactions/DeterministicVerifierFactoryService.kt | 8 ++++++++ serialization-deterministic/build.gradle | 1 + .../src/main/resources/META-INF/DJVM-preload | 0 7 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 core-deterministic/src/main/resources/META-INF/DJVM-preload create mode 100644 node/djvm/src/main/resources/META-INF/DJVM-preload create mode 100644 serialization-deterministic/src/main/resources/META-INF/DJVM-preload diff --git a/core-deterministic/build.gradle b/core-deterministic/build.gradle index 4b84f32d7e..c1f65ebfa0 100644 --- a/core-deterministic/build.gradle +++ b/core-deterministic/build.gradle @@ -56,6 +56,7 @@ task patchCore(type: Zip, dependsOn: coreJarTask) { archiveExtension = 'jar' from(compileKotlin) + from(processResources) from(zipTree(originalJar)) { exclude 'net/corda/core/internal/*ToggleField*.class' exclude 'net/corda/core/serialization/*SerializationFactory*.class' diff --git a/core-deterministic/src/main/resources/META-INF/DJVM-preload b/core-deterministic/src/main/resources/META-INF/DJVM-preload new file mode 100644 index 0000000000..e69de29bb2 diff --git a/node/djvm/src/main/resources/META-INF/DJVM-preload b/node/djvm/src/main/resources/META-INF/DJVM-preload new file mode 100644 index 0000000000..e69de29bb2 diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index 7dbbbd99c4..05cf9cf79a 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -216,7 +216,13 @@ abstract class AbstractNode(val configuration: NodeConfiguration, @Suppress("LeakingThis") val transactionVerifierService = InMemoryTransactionVerifierService(transactionVerifierWorkerCount).tokenize() val verifierFactoryService: VerifierFactoryService = if (djvmCordaSource != null) { - DeterministicVerifierFactoryService(djvmBootstrapSource, djvmCordaSource).tokenize() + DeterministicVerifierFactoryService(djvmBootstrapSource, djvmCordaSource).apply { + if (!configuration.devMode) { + log.info("Generating Corda classes for DJVM sandbox.") + generateSandbox() + } + tokenize() + } } else { BasicVerifierFactoryService() } diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/DeterministicVerifierFactoryService.kt b/node/src/main/kotlin/net/corda/node/services/transactions/DeterministicVerifierFactoryService.kt index c0ff4605f8..a2a0415eec 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/DeterministicVerifierFactoryService.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/DeterministicVerifierFactoryService.kt @@ -46,6 +46,14 @@ class DeterministicVerifierFactoryService( ) } + /** + * Generate sandbox classes for every Corda jar with META-INF/DJVM-preload. + */ + fun generateSandbox(): DeterministicVerifierFactoryService { + baseSandboxConfiguration.preload() + return this + } + override fun apply(ledgerTransaction: LedgerTransaction): LedgerTransaction { // Specialise the LedgerTransaction here so that // contracts are verified inside the DJVM! diff --git a/serialization-deterministic/build.gradle b/serialization-deterministic/build.gradle index c63daa7726..7a17efd6a8 100644 --- a/serialization-deterministic/build.gradle +++ b/serialization-deterministic/build.gradle @@ -54,6 +54,7 @@ task patchSerialization(type: Zip, dependsOn: serializationJarTask) { archiveExtension = 'jar' from(compileKotlin) + from(processResources) from(zipTree(originalJar)) { exclude 'net/corda/serialization/internal/AttachmentsClassLoaderBuilder*' exclude 'net/corda/serialization/internal/ByteBufferStreams*' diff --git a/serialization-deterministic/src/main/resources/META-INF/DJVM-preload b/serialization-deterministic/src/main/resources/META-INF/DJVM-preload new file mode 100644 index 0000000000..e69de29bb2