From 0e8d605e2d46b5dd380382af0b13cac3442d9bd3 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 17 Nov 2015 15:37:26 -0800 Subject: [PATCH 1/2] Build: Add --debug-jvm option to run and integTest tasks Sometimes when running elasticsearch, it is useful to attach a remote debugger. This change adds a --debug-jvm option (the same name gradle uses for its tests debug option), which adds java agent config for a remote debugger. The configuration is set to hava java suspend until the remove debugger is attached. closes #14772 --- TESTING.asciidoc | 8 ++++++-- build.gradle | 15 ++++++++++++++- .../gradle/test/ClusterConfiguration.groovy | 3 +++ .../gradle/test/ClusterFormationTasks.groovy | 9 ++++++++- .../gradle/test/RestIntegTestTask.groovy | 9 +++++++++ .../org/elasticsearch/gradle/test/RunTask.groovy | 9 +++++++++ 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/TESTING.asciidoc b/TESTING.asciidoc index c1b17e7b31a..141d58066b8 100644 --- a/TESTING.asciidoc +++ b/TESTING.asciidoc @@ -455,5 +455,9 @@ mvn -Dtests.coverage verify jacoco:report == Debugging from an IDE -If you want to run elasticsearch from your IDE, you should execute gradle run -It opens a remote debugging port that you can connect with your IDE. +If you want to run elasticsearch from your IDE, the `gradle run` task +supports a remote debugging option: + +--------------------------------------------------------------------------- +gradle run --debug-jvm +--------------------------------------------------------------------------- diff --git a/build.gradle b/build.gradle index 78818dec951..af0fa12917b 100644 --- a/build.gradle +++ b/build.gradle @@ -171,7 +171,20 @@ task clean(type: GradleBuild) { tasks = ['clean'] } -task run() { +// we need to add the same --debug-jvm option as +// the real RunTask has, so we can pass it through +class Run extends DefaultTask { + boolean debug = false + + @org.gradle.api.internal.tasks.options.Option( + option = "debug-jvm", + description = "Enable debugging configuration, to allow attaching a debugger to elasticsearch." + ) + public void setDebug(boolean enabled) { + project.project(':distribution').run.clusterConfig.debug = enabled + } +} +task run(type: Run) { dependsOn ':distribution:run' description = 'Runs elasticsearch in the foreground' group = 'Verification' diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterConfiguration.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterConfiguration.groovy index b4b08bf4160..c8a37a8ec57 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterConfiguration.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterConfiguration.groovy @@ -39,6 +39,9 @@ class ClusterConfiguration { @Input boolean daemonize = true + @Input + boolean debug = false + @Input String jvmArgs = System.getProperty('tests.jvm.argline', '') diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy index 35811a832a2..205579f169c 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy @@ -212,7 +212,7 @@ class ClusterFormationTasks { static Task configureStartTask(String name, Project project, Task setup, File cwd, ClusterConfiguration config, String clusterName, File pidFile, File home) { Map esEnv = [ 'JAVA_HOME' : project.javaHome, - 'ES_GC_OPTS': config.jvmArgs + 'JAVA_OPTS': config.jvmArgs ] List esProps = config.systemProperties.collect { key, value -> "-D${key}=${value}" } for (Map.Entry property : System.properties.entrySet()) { @@ -235,6 +235,13 @@ class ClusterFormationTasks { // this closure is converted into ant nodes by groovy's AntBuilder Closure antRunner = { + // we must add debug options inside the closure so the config is read at execution time, as + // gradle task options are not processed until the end of the configuration phase + if (config.debug) { + println 'Running elasticsearch in debug mode, connect on port 8000' + esEnv['JAVA_OPTS'] += ' -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000' + } + exec(executable: executable, spawn: config.daemonize, dir: cwd, taskname: 'elasticsearch') { esEnv.each { key, value -> env(key: key, value: value) } (esArgs + esProps).each { arg(value: it) } diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RestIntegTestTask.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RestIntegTestTask.groovy index 262826a5c23..c68a6744237 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RestIntegTestTask.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RestIntegTestTask.groovy @@ -22,6 +22,7 @@ import com.carrotsearch.gradle.junit4.RandomizedTestingTask import org.elasticsearch.gradle.BuildPlugin import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.internal.tasks.options.Option import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.Input import org.gradle.util.ConfigureUtil @@ -79,6 +80,14 @@ class RestIntegTestTask extends RandomizedTestingTask { } } + @Option( + option = "debug-jvm", + description = "Enable debugging configuration, to allow attaching a debugger to elasticsearch." + ) + public void setDebug(boolean enabled) { + clusterConfig.debug = enabled; + } + @Input void cluster(Closure closure) { ConfigureUtil.configure(closure, clusterConfig) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RunTask.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RunTask.groovy index 3abc4283304..6116ecf4ce2 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RunTask.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/RunTask.groovy @@ -2,6 +2,7 @@ package org.elasticsearch.gradle.test import org.gradle.api.DefaultTask import org.gradle.api.Project +import org.gradle.api.internal.tasks.options.Option class RunTask extends DefaultTask { @@ -13,6 +14,14 @@ class RunTask extends DefaultTask { } } + @Option( + option = "debug-jvm", + description = "Enable debugging configuration, to allow attaching a debugger to elasticsearch." + ) + public void setDebug(boolean enabled) { + clusterConfig.debug = enabled; + } + static void configure(Project project) { RunTask task = project.tasks.create( name: 'run', From 9f59ba5abf40be0be32ddf2c056ec41052c814ef Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 17 Nov 2015 17:18:44 -0800 Subject: [PATCH 2/2] Tweak debug startup message for run command, per PR comment --- .../org/elasticsearch/gradle/test/ClusterFormationTasks.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy index 205579f169c..c2fe7d8929f 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy @@ -238,7 +238,7 @@ class ClusterFormationTasks { // we must add debug options inside the closure so the config is read at execution time, as // gradle task options are not processed until the end of the configuration phase if (config.debug) { - println 'Running elasticsearch in debug mode, connect on port 8000' + println 'Running elasticsearch in debug mode, suspending until connected on port 8000' esEnv['JAVA_OPTS'] += ' -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000' }