From ac1dfec1ffc961c17c1cad06ae80c89803baa331 Mon Sep 17 00:00:00 2001 From: Mat Rizzo Date: Thu, 26 Oct 2017 11:16:16 +0100 Subject: [PATCH] CORDA-742 Refactored back to more parallel execution --- .../main/kotlin/net/corda/plugins/Cordform.kt | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt index fa79a40755..ec9e07f22b 100644 --- a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt +++ b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt @@ -148,42 +148,48 @@ open class Cordform : DefaultTask() { installNodeInfos() } - private fun generateNodeInfos() { project.logger.info("Generating node infos") - val generateTimeoutSeconds = 60L - for (node in nodes) { - project.logger.info("Generating node info for ${fullNodePath(node)}") - var logDir = File(fullNodePath(node).toFile(), "logs") - logDir.mkdirs() - var process = buildNodeProcess(node, logDir) - try { - if (!process.waitFor(generateTimeoutSeconds, TimeUnit.SECONDS)) { - throw GradleException("Node took longer $generateTimeoutSeconds seconds than too to generate node info - see node log at ${fullNodePath(node)}/logs") - } - if (process.exitValue() != 0) { - throw GradleException("Node exited with ${process.exitValue()} when generating node infos - see node log at ${fullNodePath(node)}/logs") - } - } - finally { - if (process.isAlive()) { - process.destroyForcibly() - } - } + var nodeProcesses = buildNodeProcesses() + try { + nodeProcesses.forEach { (node, process) -> validateNodeProcess(node, process) } + } + finally { + nodeProcesses.forEach { it.second.destroyForcibly() } } } - private fun buildNodeProcess(node: Node, logDir: File): Process { - val javaPathString = Paths.get(System.getProperty("java.home"), "bin", "java").toString() - val command = listOf(javaPathString, "-Dcapsule.log=verbose", "-Dcapsule.dir=./cache", "-jar", Node.nodeJarName, "--just-generate-node-info") - var pb = ProcessBuilder(command) + private fun buildNodeProcesses(): List> { + return nodes.map { buildNodeProcess(it, makeLogDirectory(it)) } + } + + private fun makeLogDirectory(node: Node): File { + var logDir = File(fullNodePath(node).toFile(), "logs") + logDir.mkdirs() + return logDir + } + + private fun buildNodeProcess(node: Node, logDir: File): Pair { + val command = listOf("java", "-Dcapsule.log=verbose", "-Dcapsule.dir=./cache", "-jar", Node.nodeJarName, "--just-generate-node-info") + var builder = ProcessBuilder(command) .directory(fullNodePath(node).toFile()) .redirectErrorStream(true) // InheritIO causes hangs on windows due the gradle buffer also not being flushed. // Must redirect to output or logger (node log is still written, this is just startup banner) .redirectOutput(File(logDir, "generate-info.log")) - pb.environment().put("CAPSULE_CACHE_DIR", "./cache") - return pb.start() + builder.environment().put("CAPSULE_CACHE_DIR", "./cache") + return Pair(node, builder.start()) + } + + private fun validateNodeProcess(node: Node, process: Process) { + val generateTimeoutSeconds = 60L + if (!process.waitFor(generateTimeoutSeconds, TimeUnit.SECONDS)) { + throw GradleException("Node took longer $generateTimeoutSeconds seconds than too to generate node info - see node log at ${fullNodePath(node)}/logs") + } + if (process.exitValue() != 0) { + throw GradleException("Node exited with ${process.exitValue()} when generating node infos - see node log at ${fullNodePath(node)}/logs") + } + project.logger.info("Generated node info for ${fullNodePath(node)}") } private fun installNodeInfos() {