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:
-7
@@ -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) {
|
||||
|
||||
-42
@@ -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"
|
||||
}
|
||||
}
|
||||
-1
@@ -13,7 +13,6 @@ abstract class AbstractKotlinAndroidGradleTests(
|
||||
|
||||
override fun defaultBuildOptions() =
|
||||
BuildOptions(withDaemon = true,
|
||||
assertThreadLeaks = false,
|
||||
androidHome = File("../../../dependencies/android-sdk-for-tests"),
|
||||
androidGradlePluginVersion = androidGradlePluginVersion)
|
||||
|
||||
|
||||
-8
@@ -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
-3
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user