On Mon, 5 Oct 2020 10:16:49 GMT, Severin Gehwolf <sgehw...@openjdk.org> wrote:
>> An issue similar to >> [JDK-8239559](https://bugs.openjdk.java.net/browse/JDK-8239559) has been >> discovered. On the >> affected system, `/proc/self/mountinfo` contains a line such as this one: >> >> 35 26 0:26 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup >> systemd rw,name=systemd >> >> >> Note that `/proc/cgroups` looks like this: >> >> #subsys_name hierarchy num_cgroups enabled >> cpuset 0 1 1 >> cpu 0 1 1 >> cpuacct 0 1 1 >> blkio 0 1 1 >> memory 0 1 1 >> devices 0 1 1 >> freezer 0 1 1 >> net_cls 0 1 1 >> perf_event 0 1 1 >> net_prio 0 1 1 >> hugetlb 0 1 1 >> pids 0 1 1 >> >> This is in fact a cgroups v1 system with systemd put into a separate >> namespace via FS type `cgroup`. That mountinfo >> line confuses the cgroups version detection heuristic. It only looked >> whether or not there is **any** entry in >> mountinfo of FS-type `cgroup` . That's wrong. A better heuristic would be >> looking at controllers we care about: `cpu`, >> `cpuacct`, `memory`, `cpuset` for hotspot and some more for the Java side. >> The proposed fix on the hotspot side is to >> set `any_cgroup_mounts_found` to true only if one of those controllers show >> up in mountinfo. Otherwise, we know it's >> cgroup v2 due to the zero hierarchy ids. For the Java side the proposal is >> to add some parsing for mountinfo lines and >> look for `cgroup` FS-type lines which aren't also mounted purely for systemd. >> **Testing** >> >> - [x] Linux x86_64 container tests on cgroup v1 (fastdebug) >> - [x] Linux x86_64 container tests on cgroup v2 (fastdebug) >> - [x] Added regression test which fails prior the patch and passes after >> - [x] Submit testing > > Severin Gehwolf has updated the pull request incrementally with one > additional commit since the last revision: > > Fix typo in comment src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystemFactory.java line 150: > 148: // find anyway in that case. > 149: try (Stream<String> mntInfo = > CgroupUtil.readFilePrivileged(Paths.get(mountInfo))) { > 150: boolean anyCgroupMounted = > mntInfo.anyMatch(CgroupSubsystemFactory::noSystemdCgroupLine); I'd prefer a similar approach to the hotspot side where you do a positive check for controllers we are interested in rather than a negative check for systemd. ------------- PR: https://git.openjdk.java.net/jdk/pull/485