Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8286212

Cgroup v1 initialization causes NPE on some systems

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P3 P3
    • tbd
    • 17.0.3, 18, 19
    • hotspot

      A user reports that if wildfly tests run within a container they fail to initialize with:

      [ERROR] Failed to execute goal org.wildfly.plugins:wildfly-maven-plugin:2.0.1.Final:execute-commands (apply-elytron) on project wildfly-ts-integ-smoke: Failed to execute commands: Exception in thread "main"
       java.lang.NullPointerException
      [ERROR] at java.base/java.util.Objects.requireNonNull(Objects.java:208)
      [ERROR] at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:263)
      [ERROR] at java.base/java.nio.file.Path.of(Path.java:147)
      [ERROR] at java.base/java.nio.file.Paths.get(Paths.java:69)
      [ERROR] at java.base/jdk.internal.platform.CgroupUtil.lambda$readStringValue$1(CgroupUtil.java:67)
      [ERROR] at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
      [ERROR] at java.base/jdk.internal.platform.CgroupUtil.readStringValue(CgroupUtil.java:69)
      [ERROR] at java.base/jdk.internal.platform.CgroupSubsystemController.getStringValue(CgroupSubsystemController.java:65)
      [ERROR] at java.base/jdk.internal.platform.CgroupSubsystemController.getLongValue(CgroupSubsystemController.java:124)
      [ERROR] at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getLongValue(CgroupV1Subsystem.java:175)
      [ERROR] at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getHierarchical(CgroupV1Subsystem.java:149)
      [ERROR] at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.initSubSystem(CgroupV1Subsystem.java:84)
      [ERROR] at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getInstance(CgroupV1Subsystem.java:60)
      [ERROR] at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:116)
      [ERROR] at java.base/jdk.internal.platform.CgroupMetrics.getInstance(CgroupMetrics.java:167)
      [ERROR] at java.base/jdk.internal.platform.SystemMetrics.instance(SystemMetrics.java:29)
      [ERROR] at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:58)
      [ERROR] at java.base/jdk.internal.platform.Container.metrics(Container.java:43)
      [ERROR] at jdk.management/com.sun.management.internal.OperatingSystemImpl.<init>(OperatingSystemImpl.java:182)
      [ERROR] at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl.getOperatingSystemMXBean(PlatformMBeanProviderImpl.java:280)
      [ERROR] at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl$3.nameToMBeanMap(PlatformMBeanProviderImpl.java:199)
      [ERROR] at java.management/java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$0(ManagementFactory.java:488)
      [ERROR] at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
      [ERROR] at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
      [ERROR] at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779)
      [ERROR] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      [ERROR] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      [ERROR] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
      [ERROR] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
      [ERROR] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      [ERROR] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
      [ERROR] at java.management/java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:489)
      [ERROR] at org.jboss.modules.ModuleLoader$RealMBeanReg$1.run(ModuleLoader.java:1258)
      [ERROR] at org.jboss.modules.ModuleLoader$RealMBeanReg$1.run(ModuleLoader.java:1256)
      [ERROR] at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
      [ERROR] at org.jboss.modules.ModuleLoader$RealMBeanReg.<init>(ModuleLoader.java:1256)
      [ERROR] at org.jboss.modules.ModuleLoader$TempMBeanReg.installReal(ModuleLoader.java:1240)
      [ERROR] at org.jboss.modules.ModuleLoader.installMBeanServer(ModuleLoader.java:273)
      [ERROR] at org.jboss.modules.Main.main(Main.java:605)

      The relevant mountinfo line is:

      941 931 0:36 /user.slice/user-1000.slice/session-50.scope /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,seclabel,memory

      The relevant line for the memory controller in /proc/self/cgroups is:

      9:memory:/user.slice/user-1000.slice/session-3.scope

      The relevant code reads:

      public void setPath(String cgroupPath) {
              if (root != null && cgroupPath != null) {
                  if (root.equals("/")) {
                      if (!cgroupPath.equals("/")) {
                          path = mountPoint + cgroupPath;
                      }
                      else {
                          path = mountPoint;
                      }
                  }
                  else {
                      if (root.equals(cgroupPath)) {
                          path = mountPoint;
                      }
                      else {
                          if (cgroupPath.startsWith(root)) {
                              if (cgroupPath.length() > root.length()) {
                                  String cgroupSubstr = cgroupPath.substring(root.length());
                                  path = mountPoint + cgroupSubstr;
                              }
                          }
                      }
                  }
              }
          }

      This seems to be a case not covered in the setPath() method in CgroupV1SubsystemController. root == /user.slice/user-1000.slice/session-50.scope, cGroupPath == /user.slice/user-1000.slice/session-3.scope. Therefore 'path' ends up not being set, causing the NPE.

      This was originally reported here:
      https://bugzilla.redhat.com/show_bug.cgi?id=2082094

      More detailed info here:
      https://gist.github.com/gaol/4d96eace8290e6549635fdc0ea41d0b4

            Unassigned Unassigned
            sgehwolf Severin Gehwolf
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: