[PING] RFR: 8231111: Cgroups v2: Rework Metrics in java.base so as to recognize unified hierarchy

Mandy Chung mandy.chung at oracle.com
Sat Feb 15 02:16:58 UTC 2020

Hi Severin,

On 2/11/20 10:04 AM, Severin Gehwolf wrote:
> Updated webrev:
> Full: http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8231111/10/webrev/
> incremental: http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8231111/10/incremental/webrev/

Thanks for updating this.  This patch looks okay in general while I 
still think this is quite hard to tell whether the implementation 
matches the spec in the unavailable & unlimited cases.  It'd be good if 
this can be cleaned up in the future.    Thanks for the new test.


92 logger.log(Level.WARNING, "Mixed cgroupv1 and cgroupv2 not supported. 
Metrics disabled.");

There isn't a clear guideline on what logging level to use.  I will opt 
for API not emit any message as this method returns null.  or this 
should throw an exception if this should be reported instead. So debug 
or trace level seems to be suitable for this message.

  130 return new CgroupMetrics(new CgroupV2Subsystem(unified));
  131         } else {
132 return new CgroupV1Metrics(CgroupV1Subsystem.getInstance());

CgroupV2Subsystem is instantiated with a constructor.  Do you expect 
multiple instances of CgroupV2Subsystem (as opposed to CgroupV1Subsystem 
is a singleton)?


  391                 String match = "hierarchical_memory_limit";
392 retval = CgroupV1SubsystemController.getLongValueMatchingLine(memory,
  393                                                             "memory.stat",
394 match); Nit: the match variable is not needed. Similar pattern 
occurs in line 451-453. 

This is cgroup v1 specific. I still think it should be moved to 
linux/classes rather than share/classes.  The tests should only run on 

    copyright header is missing

    You can define a private MetricsCgroupV1 subsystem field in this 
class to avoid the casting:

   15         return ((MetricsCgroupV1)subsystem).getMemoryMaxUsage();

So CgroupMetrics::subsystem field can stay as private if desire.

Side note:  CgroupV1Metrics is the implementation of MetricsCgroupV1.  
The naming is a bit strange.  CgroupV1Metrics sounds better for the 
interface and the implementation class could be CgroupV1MetricsImpl and 
it'd help a reader to understand their relationship.  I leave it for you 
to decide.


+ private static final long LONG_RETVAL_NOT_SUPPORTED = -2;

This is specific to printSystemMetrics.  I suggest to move this to 
printSystemMetrics as a local variable.  Then formatCpuVal and 
formatLimitString to take an additional "unavailable" parameter so that 
these methods will print "N/A" if limit == unavailable.

+ private static String formatBoolean(Boolean value, String prefix) { 
This is no longer needed. Please remove it.

    The Oracle copyright is taken out and the copyright is also changed 
from GPL to GPL+CP.
    The Red Hat copyright can be added to the top of the file 
immediately before "DO NOT ALTER or REMOVE" line like [1].


     TestDockerMemoryMetrics requires docker.support.  I think any test 
depending on MetricsMemoryTester.java are filtered when running on 
platform other than linux.  Please verify that.

   58         try(Stream<String> stream = Files.lines(Paths.get(path))) {

Nit: space between "try" and "(" is missing.

    I expect the copyright header be placed at the top of the file 
before all imports.


More information about the core-libs-dev mailing list