diff --git a/CHANGELOG.md b/CHANGELOG.md index 05ec47bce635d..7dd1752f2699d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Data node side change([#4204](https://github.com/opensearch-project/OpenSearch/pull/4204)) - on-boarding of tasks([#4542](https://github.com/opensearch-project/OpenSearch/pull/4542)) - Integs ([4588](https://github.com/opensearch-project/OpenSearch/pull/4588)) +- Update to Gradle 7.6 and JDK-19 ([#4973](https://github.com/opensearch-project/OpenSearch/pull/4973)) ### Dependencies - Bumps `log4j-core` from 2.18.0 to 2.19.0 diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 498edaf057a34..c533bcc992395 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -114,7 +114,7 @@ dependencies { api 'gradle.plugin.com.github.johnrengelman:shadow:7.1.2' api 'org.jdom:jdom2:2.0.6.1' api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${props.getProperty('kotlin')}" - api 'de.thetaphi:forbiddenapis:3.3' + api 'de.thetaphi:forbiddenapis:3.4' api 'com.avast.gradle:gradle-docker-compose-plugin:0.15.2' api "org.yaml:snakeyaml:${props.getProperty('snakeyaml')}" api 'org.apache.maven:maven-model:3.6.2' diff --git a/buildSrc/src/main/java/org/opensearch/gradle/info/GlobalBuildInfoPlugin.java b/buildSrc/src/main/java/org/opensearch/gradle/info/GlobalBuildInfoPlugin.java index 62e743d513193..7708e4583ed7a 100644 --- a/buildSrc/src/main/java/org/opensearch/gradle/info/GlobalBuildInfoPlugin.java +++ b/buildSrc/src/main/java/org/opensearch/gradle/info/GlobalBuildInfoPlugin.java @@ -45,12 +45,15 @@ import org.gradle.internal.jvm.Jvm; import org.gradle.internal.jvm.inspection.JvmInstallationMetadata; import org.gradle.internal.jvm.inspection.JvmMetadataDetector; +import org.gradle.jvm.toolchain.internal.InstallationLocation; import org.gradle.util.GradleVersion; import javax.inject.Inject; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -195,7 +198,29 @@ private JavaVersion determineJavaVersion(String description, File javaHome, Java } private JvmInstallationMetadata getJavaInstallation(File javaHome) { - return jvmMetadataDetector.getMetadata(javaHome); + final InstallationLocation location = new InstallationLocation(javaHome, "Java home"); + + try { + try { + // The getMetadata(File) is used by Gradle pre-7.6 + return (JvmInstallationMetadata) MethodHandles.publicLookup() + .findVirtual(JvmMetadataDetector.class, "getMetadata", MethodType.methodType(JvmInstallationMetadata.class, File.class)) + .bindTo(jvmMetadataDetector) + .invokeExact(location.getLocation()); + } catch (NoSuchMethodException | IllegalAccessException ex) { + // The getMetadata(InstallationLocation) is used by Gradle post-7.6 + return (JvmInstallationMetadata) MethodHandles.publicLookup() + .findVirtual( + JvmMetadataDetector.class, + "getMetadata", + MethodType.methodType(JvmInstallationMetadata.class, InstallationLocation.class) + ) + .bindTo(jvmMetadataDetector) + .invokeExact(location); + } + } catch (Throwable ex) { + throw new IllegalStateException("Unable to find suitable JvmMetadataDetector::getMetadata", ex); + } } private List getAvailableJavaVersions(JavaVersion minimumCompilerVersion) { @@ -205,7 +230,7 @@ private List getAvailableJavaVersions(JavaVersion minimumCompilerVersi String javaHomeEnvVarName = getJavaHomeEnvVarName(Integer.toString(version)); if (System.getenv(javaHomeEnvVarName) != null) { File javaHomeDirectory = new File(findJavaHome(Integer.toString(version))); - JvmInstallationMetadata javaInstallation = jvmMetadataDetector.getMetadata(javaHomeDirectory); + JvmInstallationMetadata javaInstallation = getJavaInstallation(javaHomeDirectory); JavaHome javaHome = JavaHome.of(version, providers.provider(() -> { int actualVersion = Integer.parseInt(javaInstallation.getLanguageVersion().getMajorVersion()); if (actualVersion != version) { diff --git a/buildSrc/version.properties b/buildSrc/version.properties index a42faa4a62080..d137e36d520c9 100644 --- a/buildSrc/version.properties +++ b/buildSrc/version.properties @@ -2,8 +2,7 @@ opensearch = 3.0.0 lucene = 9.5.0-snapshot-a4ef70f bundled_jdk_vendor = adoptium -bundled_jdk = 17.0.5+8 - +bundled_jdk = 19.0.1+10 # optional dependencies diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 58e9a16f424db..6f1a82fe04e4c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -11,7 +11,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-rc-1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=db9c8211ed63f61f60292c69e80d89196f9eb36665e369e7f00ac4cc841c2219 +distributionSha256Sum=82bad5b2c988d77a6f627db770b0fceb62ac9d2631ae68abe9123c464282fe48 diff --git a/test/framework/build.gradle b/test/framework/build.gradle index 096e8c1e58243..4f99513c220e5 100644 --- a/test/framework/build.gradle +++ b/test/framework/build.gradle @@ -88,6 +88,10 @@ test { systemProperty 'tests.gradle_index_compat_versions', BuildParams.bwcVersions.indexCompatible.join(',') systemProperty 'tests.gradle_wire_compat_versions', BuildParams.bwcVersions.wireCompatible.join(',') systemProperty 'tests.gradle_unreleased_versions', BuildParams.bwcVersions.unreleased.join(',') + + if (BuildParams.runtimeJavaVersion > JavaVersion.VERSION_17) { + jvmArgs += ["-Djava.security.manager=allow"] + } } tasks.register("integTest", Test) { diff --git a/test/framework/src/main/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutor.java b/test/framework/src/main/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutor.java index 10a6ec791ec66..7f581a941517f 100644 --- a/test/framework/src/main/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutor.java +++ b/test/framework/src/main/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutor.java @@ -44,26 +44,23 @@ public class MockSinglePrioritizingExecutor extends PrioritizedOpenSearchThreadPoolExecutor { public MockSinglePrioritizingExecutor(String name, DeterministicTaskQueue deterministicTaskQueue, ThreadPool threadPool) { - super(name, 0, 1, 0L, TimeUnit.MILLISECONDS, r -> new Thread() { - @Override - public void start() { - deterministicTaskQueue.scheduleNow(new Runnable() { - @Override - public void run() { - try { - r.run(); - } catch (KillWorkerError kwe) { - // hacks everywhere - } + super(name, 0, 1, 0L, TimeUnit.MILLISECONDS, r -> new Thread(() -> { + deterministicTaskQueue.scheduleNow(new Runnable() { + @Override + public void run() { + try { + r.run(); + } catch (KillWorkerError kwe) { + // hacks everywhere } + } - @Override - public String toString() { - return r.toString(); - } - }); - } - }, threadPool.getThreadContext(), threadPool.scheduler()); + @Override + public String toString() { + return r.toString(); + } + }); + }), threadPool.getThreadContext(), threadPool.scheduler()); } @Override diff --git a/test/framework/src/test/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutorTests.java b/test/framework/src/test/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutorTests.java index c7980eb74906d..1de6dc6ded315 100644 --- a/test/framework/src/test/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutorTests.java +++ b/test/framework/src/test/java/org/opensearch/cluster/coordination/MockSinglePrioritizingExecutorTests.java @@ -36,11 +36,15 @@ import org.opensearch.common.util.concurrent.PrioritizedRunnable; import org.opensearch.test.OpenSearchTestCase; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.LockSupport; +import java.util.function.Supplier; public class MockSinglePrioritizingExecutorTests extends OpenSearchTestCase { - public void testPrioritizedEsThreadPoolExecutor() { + public void testPrioritizedEsThreadPoolExecutor() throws InterruptedException, TimeoutException { final DeterministicTaskQueue taskQueue = DeterministicTaskQueueTests.newTaskQueue(); final PrioritizedOpenSearchThreadPoolExecutor executor = new MockSinglePrioritizingExecutor( "test", @@ -64,13 +68,44 @@ public void run() { }); assertFalse(called1.get()); assertFalse(called2.get()); + + // There should be 2 tasks scheduled in the executor's queue + await(() -> executor.getQueue().size() == 2, 500, TimeUnit.MILLISECONDS); + await(() -> taskQueue.hasRunnableTasks(), 500, TimeUnit.MILLISECONDS); + taskQueue.runRandomTask(); assertFalse(called1.get()); assertTrue(called2.get()); + + // There should be 1 task scheduled in the executor's queue now (one was already run) + await(() -> executor.getQueue().size() == 1, 500, TimeUnit.MILLISECONDS); + await(() -> taskQueue.hasRunnableTasks(), 500, TimeUnit.MILLISECONDS); + taskQueue.runRandomTask(); assertTrue(called1.get()); assertTrue(called2.get()); + + // There should be 0 task scheduled in the executor's queue now (both were already run) + await(() -> executor.getQueue().isEmpty(), 500, TimeUnit.MILLISECONDS); + await(() -> taskQueue.hasRunnableTasks(), 500, TimeUnit.MILLISECONDS); + taskQueue.runRandomTask(); assertFalse(taskQueue.hasRunnableTasks()); } + + private void await(Supplier awaiter, int timeout, TimeUnit unit) throws TimeoutException { + final long slice = TimeUnit.NANOSECONDS.convert(timeout, unit) / 10L; + final long limit = unit.toNanos(timeout); + + int attempt = 0; + while (!awaiter.get() && attempt < limit) { + final long started = System.nanoTime(); + LockSupport.parkNanos(Math.min(slice, limit - attempt)); + attempt += (System.nanoTime() - started); + } + + if (!awaiter.get()) { + throw new TimeoutException("Timeout reached while awaiting for condition to be met"); + } + } }