RFR: 8146115 - Improve docker container detection and resource configuration usage

Kim Barrett kim.barrett at oracle.com
Wed Oct 25 06:57:14 UTC 2017


> On Oct 24, 2017, at 10:11 AM, Bob Vandette <bob.vandette at oracle.com> wrote:
> 
> 
>> On Oct 23, 2017, at 12:52 AM, Kim Barrett <kim.barrett at oracle.com> wrote:
>> 
>>> On Sep 27, 2017, at 9:20 PM, David Holmes <david.holmes at oracle.com> wrote:
>>>>> 62     void set_subsystem_path(char *cgroup_path) {
>>>>> 
>>>>> If this takes a "const char*" will it save you from casting string literals to "char*" elsewhere?
>>>> I tried several different ways of declaring the container accessor functions and
>>>> always ended up with warnings due to scanf not being able to validate arguments
>>>> since the format string didn’t end up being a string literal.  I originally was using templates
>>>> and then ended up with the macros.  I tried several different casts but could resolve the problem.
>>> 
>>> Sounds like something Kim Barrett should take a look at :)
>> 
>> Fortunately, I just happened by.
>> 
>> The warnings are because we compile with -Wformat=2, which enables
>> -Wformat-nonliteral (among other things).
>> 
>> Use PRAGMA_FORMAT_NONLITERAL_IGNORED, e.g.
>> 
>> PRAGMA_DIAG_PUSH
>> PRAGMA_FORMAT_NONLITERAL_IGNORED
>> <function definition>
>> PRAGMA_DIAG_POP
>> 
>> That will silence warnings about sscanf (or anything else!) with a
>> non-literal format string within that <function definition>.
> 
> Thanks but I ended up taking a different approach that resulted in more compact code.
> 
> http://cr.openjdk.java.net/~bobv/8146115/webrev.02

Not a review, just a few more comments in passing.

------------------------------------------------------------------------------ 
src/hotspot/os/linux/osContainer_linux.cpp 
 150             log_debug(os, container)("Type %s not found in file %s\n",    \
 151                                      scan_fmt , buf);                     \

uses buf as path, but buf has been clobbered to contain contents from
file.

Similarly for
 155         log_debug(os, container)("Empty file %s\n", buf);                 \

------------------------------------------------------------------------------
src/hotspot/os/linux/osContainer_linux.cpp 
 158       log_debug(os, container)("file not found %s\n", buf);               \

There are many reasons why fopen might fail, and merging them all into
a "file not found" message could be quite confusing.  It would be much
better to report the error from errno.

------------------------------------------------------------------------------ 
src/hotspot/os/linux/osContainer_linux.cpp 

Something like the following (where the obvious helpers are made up to
keep this short) would eliminate the macrology.

PRAGMA_DIAG_PUSH  
PRAGMA_FORMAT_NONLITERAL_IGNORED
template<typename T>
int get_subsystem_file_contents_value(CgroupSubsystem* c,
                                  const char* filename,
                                  T* returnval,
                                  const char* scan_fmt,
				  const char* description) {
  const char* line = get_subsystem_file_line(c, filename);
  if (line != NULL) {
    if (sscanf(line, scan_fmt, returnval) == 1) {
      return 0;
    } else {
      report_subsystem_file_contents_parse_error(description, c, filename);
    }
  }
  return OSCONTAINER_ERROR;
}
PRAGMA_DIAG_POP

int subsystem_file_contents_int(CgroupSubsystem* c,
                                const char* filename,
                                int* returnval) {
  return get_subsystem_file_contents_value(c, filename, returnval, "%d", "int");
}

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



More information about the hotspot-dev mailing list