On Thu, 17 Jun 2021 12:27:25 GMT, Matthias Baesken <mbaes...@openjdk.org> wrote:

> Hello, please review this PR; it extend the OSContainer API in order to also 
> support the pids controller of cgroups.
> 
> I noticed that unlike the other controllers "cpu", "cpuset", "cpuacct", 
> "memory"  on some older Linux distros (SLES 12.1, RHEL 7.1) the pids 
> controller might not be there (or not fully supported) so it was added as 
> optional  , see the coding
> 
> 
>   if (!cg_infos[PIDS_IDX]._data_complete) {
>     log_debug(os, container)("Optional cgroup v1 pids subsystem not found");
>     // keep the other controller info, pids is optional
>   }

Thanks for this work. How did you test this? Did you run container tests on a 
cgroups v1 and cgroups v2 system?

src/hotspot/os/linux/cgroupSubsystem_linux.cpp line 136:

> 134:   char *p;
> 135:   bool is_cgroupsV2;
> 136:   // true iff all required controllers, memory, cpu, cpuset, cpuacct 
> enabled

*are* enabled, please.

src/hotspot/os/linux/cgroupSubsystem_linux.cpp line 193:

> 191:   all_required_controllers_enabled = true;
> 192:   for (int i = 0; i < CG_INFO_LENGTH; i++) {
> 193:     // the pids controller is not there on older Linux distros

Suggestion: Change the code comment to `// pids controller is optional. All 
other controllers are required`

src/hotspot/os/linux/cgroupSubsystem_linux.cpp line 198:

> 196:       all_required_controllers_enabled = 
> all_required_controllers_enabled && cg_infos[i]._enabled;
> 197:     }
> 198:     if (! cg_infos[i]._enabled) {

This if is only present for debug logging and should be guarded to that effect.

src/hotspot/os/linux/cgroupSubsystem_linux.cpp line 424:

> 422:     return false;
> 423:   }
> 424:   if (!cg_infos[PIDS_IDX]._data_complete) {

Same here, this if should be guarded with debug logging being enabled.

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp line 252:

> 250:  *    maximum number of tasks
> 251:  *    -1 for no setup
> 252:  *    -3 for "max" (special value)

I'd suggest to use:

-1 if unlimited
OSCONTAINER_ERROR for not supported

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp line 261:

> 259:                      "Maximum number of tasks is: " JLONG_FORMAT, 
> JLONG_FORMAT, pidsmax);
> 260:   if (pidsmax < 0) {
> 261:     // check for potential special value

It would be clearer if this comment mentioned that the value might be `max` 
and, thus, wouldn't be parseable with `GET_CONTAINER_INFO`.

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp line 266:

> 264:     err2 = subsystem_file_line_contents(_pids, "/pids.max", NULL, 
> "%1023s", myline);
> 265:     if (err2 != 0) {
> 266:       if (strncmp(myline, "max", 3) == 0) return -3;

We use `-1` for "unlimited" elsewhere and should probably do the same here.

src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp line 266:

> 264:     err2 = subsystem_file_line_contents(_pids, "/pids.max", NULL, 
> "%1023s", myline);
> 265:     if (err2 != 0) {
> 266:       if (strncmp(myline, "max", 3) == 0) return -3;

This looks like it should use `GET_CONTAINER_INFO_CPTR` macro and then 
`limit_from_str` from cgroups v2 code. Perhaps move `limit_from_str` method to 
the base class.

src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp line 260:

> 258:     }
> 259:   }
> 260:   return pidsmax;

We have this pattern of needing to handle `max` elsewhere in cgroups v2 code. 
See for example: `CgroupV2Subsystem::cpu_quota()`. We should handle it 
similarly here.

src/hotspot/os/linux/os_linux.cpp line 2319:

> 2317:       st->print_cr("max");
> 2318:     } else {
> 2319:       st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : 
> "unlimited");

We should treat the unlimited case similar to how we handle them elsewhere. I'm 
not sure this magic constant of `-3` gives us any more info that we'd get with 
`-1` that we use elsewhere.

src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1Subsystem.java
 line 415:

> 413:      ****************************************************************/
> 414:     public long getPidsMax() {
> 415:         return 
> CgroupV1SubsystemController.longValOrUnlimited(getLongValue(pids, 
> "pids.max"));

Since this value may be `max` we should use the same logic than for v2. I.e.:


 String pidsMaxStr = CgroupSubsystemController.getStringValue(pids, "pids.max");
 return CgroupSubsystemController.limitFromString(pidsMaxStr);

test/hotspot/jtreg/containers/cgroup/CgroupSubsystemFactory.java line 172:

> 170:             "net_prio    5   1   1\n" +
> 171:             "hugetlb 6   1   1\n" +
> 172:             "pids    9   80  1";  //  the 3 did not match 9

This comment leaves the reader none the wiser. I think you are alluding to 
controller id matching between `/proc/cgroups` and `/proc/self/cgroup`. If so, 
please use that info.

-------------

Changes requested by sgehwolf (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/4518

Reply via email to