changeset 48880:ee49ac008730

8196062: Enable docker container related tests for linux ppc64le Summary: also fix cgroup subsystem recognition Reviewed-by: goetz, dsamersoff, bobv
author mbaesken
date Wed, 07 Feb 2018 16:16:50 +0100
parents e4d80042ff19
children b480310039f1
files src/hotspot/os/linux/osContainer_linux.cpp test/hotspot/jtreg/runtime/containers/docker/Dockerfile-BasicTest-ppc64le test/jtreg-ext/requires/VMProps.java test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java
diffstat 4 files changed, 69 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/os/linux/osContainer_linux.cpp	Wed Feb 07 10:25:10 2018 -0800
+++ b/src/hotspot/os/linux/osContainer_linux.cpp	Wed Feb 07 16:16:50 2018 +0100
@@ -122,35 +122,40 @@
   char file[MAXPATHLEN+1];
   char buf[MAXPATHLEN+1];
 
-  if (c != NULL && c->subsystem_path() != NULL) {
-    strncpy(file, c->subsystem_path(), MAXPATHLEN);
-    file[MAXPATHLEN-1] = '\0';
-    int filelen = strlen(file);
-    if ((filelen + strlen(filename)) > (MAXPATHLEN-1)) {
-       log_debug(os, container)("File path too long %s, %s", file, filename);
-       return OSCONTAINER_ERROR;
-    }
-    strncat(file, filename, MAXPATHLEN-filelen);
-    log_trace(os, container)("Path to %s is %s", filename, file);
-    fp = fopen(file, "r");
-    if (fp != NULL) {
-      p = fgets(buf, MAXPATHLEN, fp);
-      if (p != NULL) {
-        int matched = sscanf(p, scan_fmt, returnval);
-        if (matched == 1) {
-          fclose(fp);
-          return 0;
-        } else {
-          log_debug(os, container)("Type %s not found in file %s",
-                                     scan_fmt , file);
-        }
+  if (c == NULL) {
+    log_debug(os, container)("subsystem_file_contents: CgroupSubsytem* is NULL");
+    return OSCONTAINER_ERROR;
+  }
+  if (c->subsystem_path() == NULL) {
+    log_debug(os, container)("subsystem_file_contents: subsystem path is NULL");
+    return OSCONTAINER_ERROR;
+  }
+
+  strncpy(file, c->subsystem_path(), MAXPATHLEN);
+  file[MAXPATHLEN-1] = '\0';
+  int filelen = strlen(file);
+  if ((filelen + strlen(filename)) > (MAXPATHLEN-1)) {
+    log_debug(os, container)("File path too long %s, %s", file, filename);
+    return OSCONTAINER_ERROR;
+  }
+  strncat(file, filename, MAXPATHLEN-filelen);
+  log_trace(os, container)("Path to %s is %s", filename, file);
+  fp = fopen(file, "r");
+  if (fp != NULL) {
+    p = fgets(buf, MAXPATHLEN, fp);
+    if (p != NULL) {
+      int matched = sscanf(p, scan_fmt, returnval);
+      if (matched == 1) {
+        fclose(fp);
+        return 0;
       } else {
-        log_debug(os, container)("Empty file %s", file);
+        log_debug(os, container)("Type %s not found in file %s", scan_fmt, file);
       }
     } else {
-      log_debug(os, container)("Open of file %s failed, %s", file,
-                               os::strerror(errno));
+      log_debug(os, container)("Empty file %s", file);
     }
+  } else {
+    log_debug(os, container)("Open of file %s failed, %s", file, os::strerror(errno));
   }
   if (fp != NULL)
     fclose(fp);
@@ -273,7 +278,7 @@
         else {
           log_debug(os, container)("Incompatible str containing cgroup and cpuset: %s", p);
         }
-      } else if (strstr(p, "cpu,cpuacct") != NULL) {
+      } else if (strstr(p, "cpu,cpuacct") != NULL || strstr(p, "cpuacct,cpu") != NULL) {
         int matched = sscanf(p, "%d %d %d:%d %s %s",
                              &mountid,
                              &parentid,
@@ -322,8 +327,20 @@
 
   fclose(mntinfo);
 
-  if (memory == NULL || cpuset == NULL || cpu == NULL || cpuacct == NULL) {
-    log_debug(os, container)("Required cgroup subsystems not found");
+  if (memory == NULL) {
+    log_debug(os, container)("Required cgroup memory subsystem not found");
+    return;
+  }
+  if (cpuset == NULL) {
+    log_debug(os, container)("Required cgroup cpuset subsystem not found");
+    return;
+  }
+  if (cpu == NULL) {
+    log_debug(os, container)("Required cgroup cpu subsystem not found");
+    return;
+  }
+  if (cpuacct == NULL) {
+    log_debug(os, container)("Required cgroup cpuacct subsystem not found");
     return;
   }
 
@@ -374,7 +391,7 @@
         memory->set_subsystem_path(base);
       } else if (strstr(controller, "cpuset") != NULL) {
         cpuset->set_subsystem_path(base);
-      } else if (strstr(controller, "cpu,cpuacct") != NULL) {
+      } else if (strstr(controller, "cpu,cpuacct") != NULL || strstr(controller, "cpuacct,cpu") != NULL) {
         cpu->set_subsystem_path(base);
         cpuacct->set_subsystem_path(base);
       } else if (strstr(controller, "cpuacct") != NULL) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/runtime/containers/docker/Dockerfile-BasicTest-ppc64le	Wed Feb 07 16:16:50 2018 +0100
@@ -0,0 +1,10 @@
+# test on x86_64 uses Oracle Linux but we do not have this for ppc64le
+# so use some other Linux where OpenJDK works 
+# FROM oraclelinux:7.2
+FROM ppc64le/ubuntu
+
+COPY /jdk /jdk
+
+ENV JAVA_HOME=/jdk
+
+CMD ["/bin/bash"]
--- a/test/jtreg-ext/requires/VMProps.java	Wed Feb 07 10:25:10 2018 -0800
+++ b/test/jtreg-ext/requires/VMProps.java	Wed Feb 07 16:16:50 2018 +0100
@@ -352,9 +352,11 @@
      * @return true if docker is supported in a given environment
      */
     protected String dockerSupport() {
-        // currently docker testing is only supported for Linux-x64
-        if (! ( Platform.isLinux() && Platform.isX64() ) )
+        // currently docker testing is only supported for Linux-x64 and Linux-ppc64le
+        String arch = System.getProperty("os.arch");
+        if (! (Platform.isLinux() && (Platform.isX64() || arch.equals("ppc64le")))) {
             return "false";
+        }
 
         boolean isSupported;
         try {
--- a/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java	Wed Feb 07 10:25:10 2018 -0800
+++ b/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java	Wed Feb 07 16:16:50 2018 +0100
@@ -34,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import jdk.test.lib.Platform;
 import jdk.test.lib.Utils;
 import jdk.test.lib.process.OutputAnalyzer;
 import jdk.test.lib.process.ProcessTools;
@@ -109,7 +110,9 @@
      * The jdk will be placed under the "/jdk/" folder inside the docker file system.
      *
      * @param imageName     name of the image to be created, including version tag
-     * @param dockerfile    name of the dockerfile residing in the test source
+     * @param dockerfile    name of the dockerfile residing in the test source;
+     *                      we check for a platform specific dockerfile as well
+     *                      and use this one in case it exists
      * @param buildDirName  name of the docker build/staging directory, which will
      *                      be created in the jtreg's scratch folder
      * @throws Exception
@@ -122,6 +125,11 @@
         if (Files.exists(buildDir)) {
             throw new RuntimeException("The docker build directory already exists: " + buildDir);
         }
+        // check for the existance of a platform specific docker file as well
+        String platformSpecificDockerfile = dockerfile + "-" + Platform.getOsArch();
+        if (Files.exists(Paths.get(Utils.TEST_SRC, platformSpecificDockerfile))) {
+          dockerfile = platformSpecificDockerfile;
+        }
 
         Path jdkSrcDir = Paths.get(Utils.TEST_JDK);
         Path jdkDstDir = buildDir.resolve("jdk");