Remove ThreadTracker from gradle plugin

ThreadTracker was introduced to detect memory leaks
when using gradle daemon. However, it makes
quite strong assumption about build lifecycle:
there should not be any builds started after
kotlin plugin is configured that are alive when
buildFinished callback is called.

This assumption can be broken by some gradle configurations
namely our android tests and gradle 2.13-rc.

Since we already have daemon memory leak test (KotlinGradlePluginIT#testKotlinOnlyDaemonMemory),
after some discussion it was decided to remove ThreadTracker
This commit is contained in:
Alexey Tsvetkov
2016-04-11 21:53:31 +03:00
parent 2df8e56b94
commit d446e60e70
5 changed files with 1 additions and 61 deletions
@@ -21,9 +21,7 @@ import org.gradle.BuildAdapter
import org.gradle.BuildResult
import org.gradle.api.Project
import org.gradle.api.logging.Logging
import org.gradle.api.tasks.compile.AbstractCompile
import java.util.concurrent.ScheduledExecutorService
import kotlin.properties.Delegates
private fun comparableVersionStr(version: String) =
@@ -42,7 +40,6 @@ class CleanUpBuildListener(pluginClassLoader: ClassLoader, private val project:
}
private val log = Logging.getLogger(this.javaClass)
private var threadTracker: ThreadTracker? = ThreadTracker()
private val cleanup = CompilerServicesCleanup(pluginClassLoader)
private var startMemory: Long? = null
@@ -65,15 +62,11 @@ class CleanUpBuildListener(pluginClassLoader: ClassLoader, private val project:
log.kotlinDebug("Cleanup after kotlin")
cleanup(gradle.gradleVersion)
// checking thread leaks only then cleaning up
threadTracker?.checkThreadLeak(gradle)
}
else {
log.kotlinDebug("Skipping kotlin cleanup since compiler wasn't called")
}
threadTracker = null
gradle.removeListener(this)
if (kotlinCompilerCalled) {
@@ -1,42 +0,0 @@
package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logging
import java.util.*
class ThreadTracker {
val log = Logging.getLogger(this.javaClass)
private var before: Collection<Thread>? = getThreads()
private fun getThreads(): Collection<Thread> = Thread.getAllStackTraces().keys
fun checkThreadLeak(gradle: Gradle?) {
try {
val testThreads = gradle != null && gradle.rootProject.hasProperty(ASSERT_THREAD_LEAKS_PROPERTY)
Thread.sleep(if (testThreads) 200L else 50L)
val after = HashSet(getThreads())
after.removeAll(before!!)
for (thread in after) {
if (thread == Thread.currentThread()) continue
val name = thread.name
if (testThreads) {
throw RuntimeException("Thread leaked: $thread: $name\n ${thread.stackTrace.joinToString(separator = "\n", prefix = " at ")}")
}
else {
log.info("Thread leaked: $thread: $name")
}
}
} finally {
before = null
}
}
companion object {
const val ASSERT_THREAD_LEAKS_PROPERTY = "kotlin.gradle.test.assertThreadLeaks"
}
}
@@ -13,7 +13,6 @@ abstract class AbstractKotlinAndroidGradleTests(
override fun defaultBuildOptions() =
BuildOptions(withDaemon = true,
assertThreadLeaks = false,
androidHome = File("../../../dependencies/android-sdk-for-tests"),
androidGradlePluginVersion = androidGradlePluginVersion)
@@ -3,7 +3,6 @@ package org.jetbrains.kotlin.gradle
import com.google.common.io.Files
import com.intellij.openapi.util.io.FileUtil
import org.gradle.api.logging.LogLevel
import org.jetbrains.kotlin.gradle.plugin.ThreadTracker
import org.jetbrains.kotlin.gradle.util.createGradleCommand
import org.jetbrains.kotlin.gradle.util.runProcess
import org.junit.After
@@ -71,10 +70,6 @@ abstract class BaseGradleIT {
val withDaemon: Boolean = false,
val daemonOptionSupported: Boolean = true,
val incremental: Boolean? = null,
/**
* @see [ThreadTracker]
*/
val assertThreadLeaks: Boolean = true,
val androidHome: File? = null,
val androidGradlePluginVersion: String? = null)
@@ -212,9 +207,6 @@ abstract class BaseGradleIT {
}
add("-PpathToKotlinPlugin=" + File("local-repo").absolutePath)
if (options.assertThreadLeaks) {
add("-P${ThreadTracker.ASSERT_THREAD_LEAKS_PROPERTY}=true")
}
options.incremental?.let { add("-Pkotlin.incremental=$it") }
options.androidGradlePluginVersion?.let { add("-PandroidToolsVersion=$it")}
}
@@ -1,15 +1,13 @@
package org.jetbrains.kotlin.gradle
import org.junit.Test
import org.jetbrains.kotlin.gradle.BaseGradleIT.Project
class Kotlin2JsGradlePluginIT : BaseGradleIT() {
@Test
fun testBuildAndClean() {
val project = Project("kotlin2JsProject", "1.6")
project.build("build", "-Pkotlin.gradle.noThreadTest=true") {
project.build("build") {
assertSuccessful()
assertReportExists()