# HG changeset patch # User sgehwolf # Date 1595593862 -7200 # Node ID edb84bd2f10f7a0fcc68dc5a27fc739403ce32f2 # Parent 8a367e717840eabc0d6332cef0842fe42f4fe74e 8250627: Use -XX:+/-UseContainerSupport for enabling/disabling Java container metrics Reviewed-by: aph, dholmes, bobv, shade diff -r 8a367e717840 -r edb84bd2f10f make/lib/CoreLibraries.gmk --- a/make/lib/CoreLibraries.gmk Wed Aug 19 18:01:24 2020 +0200 +++ b/make/lib/CoreLibraries.gmk Fri Jul 24 14:31:02 2020 +0200 @@ -154,6 +154,10 @@ LIBJAVA_SRC_DIRS += $(JDK_TOPDIR)/src/macosx/native/sun/util/locale/provider endif +ifeq ($(OPENJDK_TARGET_OS), linux) + LIBJAVA_SRC_DIRS += $(JDK_TOPDIR)/src/linux/native/jdk/internal/platform/cgroupv1 +endif + ifeq ($(OPENJDK_TARGET_OS), windows) LIBJAVA_SRC_DIRS += $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/security/provider \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/io diff -r 8a367e717840 -r edb84bd2f10f make/mapfiles/libjava/mapfile-vers --- a/make/mapfiles/libjava/mapfile-vers Wed Aug 19 18:01:24 2020 +0200 +++ b/make/mapfiles/libjava/mapfile-vers Fri Jul 24 14:31:02 2020 +0200 @@ -278,6 +278,7 @@ Java_sun_misc_VM_initialize; Java_sun_misc_VMSupport_initAgentProperties; Java_sun_misc_VMSupport_getVMTemporaryDirectory; + Java_jdk_internal_platform_cgroupv1_Metrics_isUseContainerSupport; # ZipFile.c needs this one throwFileNotFoundException; diff -r 8a367e717840 -r edb84bd2f10f src/linux/classes/jdk/internal/platform/cgroupv1/Metrics.java --- a/src/linux/classes/jdk/internal/platform/cgroupv1/Metrics.java Wed Aug 19 18:01:24 2020 +0200 +++ b/src/linux/classes/jdk/internal/platform/cgroupv1/Metrics.java Fri Jul 24 14:31:02 2020 +0200 @@ -57,6 +57,9 @@ } private static Metrics initContainerSubSystems() { + if (!isUseContainerSupport()) { + return null; + } Metrics metrics = new Metrics(); /** @@ -458,4 +461,6 @@ return SubSystem.getLongEntry(blkio, "blkio.throttle.io_serviced", "Total"); } + private static native boolean isUseContainerSupport(); + } diff -r 8a367e717840 -r edb84bd2f10f src/linux/native/jdk/internal/platform/cgroupv1/Metrics.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/linux/native/jdk/internal/platform/cgroupv1/Metrics.c Fri Jul 24 14:31:02 2020 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020, Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "jni.h" +#include "jvm.h" + +#include "jdk_internal_platform_cgroupv1_Metrics.h" + +JNIEXPORT jboolean JNICALL +Java_jdk_internal_platform_cgroupv1_Metrics_isUseContainerSupport(JNIEnv *env, jclass ignored) +{ + return JVM_IsUseContainerSupport(); +} diff -r 8a367e717840 -r edb84bd2f10f src/share/javavm/export/jvm.h --- a/src/share/javavm/export/jvm.h Wed Aug 19 18:01:24 2020 +0200 +++ b/src/share/javavm/export/jvm.h Fri Jul 24 14:31:02 2020 +0200 @@ -175,6 +175,9 @@ JNIEXPORT jint JNICALL JVM_ActiveProcessorCount(void); +JNIEXPORT jboolean JNICALL +JVM_IsUseContainerSupport(void); + JNIEXPORT void * JNICALL JVM_LoadLibrary(const char *name); diff -r 8a367e717840 -r edb84bd2f10f test/jdk/internal/platform/docker/CheckUseContainerSupport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/internal/platform/docker/CheckUseContainerSupport.java Fri Jul 24 14:31:02 2020 +0200 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020, Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.internal.platform.Metrics; + +public class CheckUseContainerSupport { + + // Usage: boolean value of -XX:+/-UseContainerSupport + // passed as the only argument + public static void main(String[] args) throws Exception { + if (args.length != 1) { + throw new RuntimeException("Expected only one boolean argument"); + } + boolean expectedContainerSupport = Boolean.parseBoolean(args[0]); + boolean actualContainerSupport = (Metrics.systemMetrics() != null); + if (expectedContainerSupport != actualContainerSupport) { + String msg = "-XX:" + ( expectedContainerSupport ? "+" : "-") + "UseContainerSupport, but got " + + "Metrics.systemMetrics() == " + (Metrics.systemMetrics() == null ? "null" : "non-null"); + System.out.println(msg); + System.out.println("TEST FAILED!!!"); + return; + } + System.out.println("TEST PASSED!!!"); + } + +} diff -r 8a367e717840 -r edb84bd2f10f test/jdk/internal/platform/docker/TestUseContainerSupport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/internal/platform/docker/TestUseContainerSupport.java Fri Jul 24 14:31:02 2020 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020, Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary UseContainerSupport flag should reflect Metrics being available + * @library /lib + * @build CheckUseContainerSupport + * @run main/timeout=360 TestUseContainerSupport + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.containers.docker.Common; +import jdk.test.lib.containers.docker.DockerRunOptions; +import jdk.test.lib.containers.docker.DockerTestUtils; + +public class TestUseContainerSupport { + private static final String imageName = Common.imageName("useContainerSupport"); + + public static void main(String[] args) throws Exception { + if (!DockerTestUtils.canTestDocker()) { + return; + } + + DockerTestUtils.buildJdkDockerImage(imageName, "Dockerfile-BasicTest", "jdk-docker"); + + try { + testUseContainerSupport(true); + testUseContainerSupport(false); + } finally { + DockerTestUtils.removeDockerImage(imageName); + } + } + + private static void testUseContainerSupport(boolean useContainerSupport) throws Exception { + String testMsg = " with -XX:" + (useContainerSupport ? "+" : "-") + "UseContainerSupport"; + Common.logNewTestCase("Test TestUseContainerSupport" + testMsg); + DockerRunOptions opts = + new DockerRunOptions(imageName, "/jdk/bin/java", "CheckUseContainerSupport"); + opts.addClassOptions(Boolean.valueOf(useContainerSupport).toString()); + opts.addDockerOpts("--memory", "200m") + .addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/"); + if (useContainerSupport) { + opts.addJavaOpts("-XX:+UseContainerSupport"); + } else { + opts.addJavaOpts("-XX:-UseContainerSupport"); + } + opts.addJavaOpts("-cp", "/test-classes/"); + DockerTestUtils.dockerRunJava(opts).shouldHaveExitValue(0).shouldContain("TEST PASSED!!!"); + } +}