Skip to content
This repository has been archived by the owner on Feb 2, 2023. It is now read-only.
/ jdk13u-dev Public archive

8250627: Use -XX:+/-UseContainerSupport for enabling/disabling Java container metrics #38

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions make/hotspot/symbols/symbols-linux
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#

JVM_handle_linux_signal
JVM_IsUseContainerSupport
numa_error
numa_warn
sysThreadAvailableStackWithSlack
3 changes: 3 additions & 0 deletions src/hotspot/share/include/jvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,9 @@ JVM_MaxMemory(void);
JNIEXPORT jint JNICALL
JVM_ActiveProcessorCount(void);

JNIEXPORT jboolean JNICALL
JVM_IsUseContainerSupport(void);

JNIEXPORT void * JNICALL
JVM_LoadLibrary(const char *name);

Expand Down
10 changes: 9 additions & 1 deletion src/hotspot/share/prims/jvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,15 @@ JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
return os::active_processor_count();
JVM_END


JVM_ENTRY_NO_ENV(jboolean, JVM_IsUseContainerSupport(void))
JVMWrapper("JVM_IsUseContainerSupport");
#ifdef LINUX
if (UseContainerSupport) {
return JNI_TRUE;
}
#endif
return JNI_FALSE;
JVM_END

// java.lang.Throwable //////////////////////////////////////////////////////

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public static Metrics getInstance() {
}

private static Metrics initContainerSubSystems() {
if (!isUseContainerSupport()) {
return null;
}
Metrics metrics = new Metrics();

/**
Expand Down Expand Up @@ -516,4 +519,6 @@ public long getBlkIOServiced() {
return SubSystem.getLongEntry(blkio, "blkio.throttle.io_serviced", "Total");
}

private static native boolean isUseContainerSupport();

}
35 changes: 35 additions & 0 deletions src/java.base/linux/native/libjava/Metrics.c
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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!!!");
}

}
74 changes: 74 additions & 0 deletions test/jdk/jdk/internal/platform/docker/TestUseContainerSupport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* 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
* @requires docker.support
* @library /test/lib
* @modules java.base/jdk.internal.platform
* @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/");
opts.addJavaOpts("--add-exports", "java.base/jdk.internal.platform=ALL-UNNAMED");
DockerTestUtils.dockerRunJava(opts).shouldHaveExitValue(0).shouldContain("TEST PASSED!!!");
}
}