From 9ed17b64f0dd071afaa4f2e9c507937c4e9571d2 Mon Sep 17 00:00:00 2001 From: Vadim Mishenev Date: Sat, 26 Nov 2022 01:11:53 +0200 Subject: Fix OOME: Metaspace (#2678) * Fix OOME: Metaspace * Add stress test * Run sample analysis from `Dispatchers.Default` --- .../gradle/SequentialTasksExecutionStressTest.kt | 45 ++++++++++++++++++++++ .../jetbrains/dokka/it/gradle/TestedVersions.kt | 1 + .../it/gradle/AbstractGradleIntegrationTest.kt | 7 ++-- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/SequentialTasksExecutionStressTest.kt (limited to 'integration-tests/gradle/src') diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/SequentialTasksExecutionStressTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/SequentialTasksExecutionStressTest.kt new file mode 100644 index 00000000..32ed27f4 --- /dev/null +++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/SequentialTasksExecutionStressTest.kt @@ -0,0 +1,45 @@ +package org.jetbrains.dokka.it.gradle + +import org.gradle.testkit.runner.TaskOutcome +import org.junit.runners.Parameterized.Parameters +import java.io.File +import kotlin.test.* + +/** + * Creates 100 tasks for the test project and runs them sequentially under low memory settings. + * + * If the test passes, it's likely there are no noticeable memory leaks. + * If it fails, it's likely that memory is leaking somewhere. + */ +class SequentialTasksExecutionStressTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest() { + + companion object { + @get:JvmStatic + @get:Parameters(name = "{0}") + val versions = listOf(TestedVersions.LATEST) + } + + @BeforeTest + fun prepareProjectFiles() { + val templateProjectDir = File("projects", "it-sequential-tasks-execution-stress") + + templateProjectDir.listFiles().orEmpty() + .filter { it.isFile } + .forEach { topLevelFile -> topLevelFile.copyTo(File(projectDir, topLevelFile.name)) } + + File(templateProjectDir, "src").copyRecursively(File(projectDir, "src")) + } + + @Test + fun execute() { + val result = createGradleRunner( + "runTasks", + "--info", + "--stacktrace", + "-Ptask_number=100", + jvmArgs = listOf("-Xmx1G", "-XX:MaxMetaspaceSize=350m") + ).buildRelaxed() + + assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":runTasks")).outcome) + } +} diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/TestedVersions.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/TestedVersions.kt index b6f2abd3..2b8e5b3c 100644 --- a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/TestedVersions.kt +++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/TestedVersions.kt @@ -2,6 +2,7 @@ package org.jetbrains.dokka.it.gradle internal object TestedVersions { + val LATEST = BuildVersions("7.4.2", "1.7.20") val BASE = BuildVersions.permutations( gradleVersions = listOf("7.4.2", "6.9"), diff --git a/integration-tests/gradle/src/main/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleIntegrationTest.kt b/integration-tests/gradle/src/main/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleIntegrationTest.kt index 9998f3fd..84efac93 100644 --- a/integration-tests/gradle/src/main/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleIntegrationTest.kt +++ b/integration-tests/gradle/src/main/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleIntegrationTest.kt @@ -6,8 +6,6 @@ import org.gradle.testkit.runner.internal.DefaultGradleRunner import org.gradle.tooling.GradleConnectionException import org.gradle.util.GradleVersion import org.jetbrains.dokka.it.AbstractIntegrationTest -import org.junit.Assume -import org.junit.Assume.assumeFalse import org.junit.AssumptionViolatedException import org.junit.runner.RunWith import org.junit.runners.Parameterized @@ -29,7 +27,8 @@ abstract class AbstractGradleIntegrationTest : AbstractIntegrationTest() { } fun createGradleRunner( - vararg arguments: String + vararg arguments: String, + jvmArgs: List = listOf("-Xmx4G", "-XX:MaxMetaspaceSize=2G") ): GradleRunner { return GradleRunner.create() .withProjectDir(projectDir) @@ -46,7 +45,7 @@ abstract class AbstractGradleIntegrationTest : AbstractIntegrationTest() { * arguments ) ).run { this as DefaultGradleRunner } - .withJvmArguments("-Xmx4G", "-XX:MaxMetaspaceSize=2G") + .withJvmArguments(jvmArgs) } fun GradleRunner.buildRelaxed(): BuildResult { -- cgit