RFR: [XS] 8229284: [TESTBUG] jdk/internal/platform/cgroup/TestCgroupMetrics.java fails for - memory:getMemoryUsage

Bob Vandette bob.vandette at oracle.com
Wed Aug 28 14:55:27 UTC 2019



> On Aug 28, 2019, at 10:18 AM, Baesken, Matthias <matthias.baesken at sap.com> wrote:
> 
>> Should you continue waiting in the loop until BOTH the new usage and max
>> usage exceed their  initial values?
> 
> 
> Hi Bob,  the  current coding  does not do it .  It checks  for  "<"  to fail .
> Please see the current coding :
> 
> 583         long memoryMaxUsage = metrics.getMemoryMaxUsage();
> 584         long memoryUsage = metrics.getMemoryUsage();
> 
> 586         byte[] bb = new byte[64*1024*1024]; // 64M
> 587 
> 588         long newMemoryMaxUsage = metrics.getMemoryMaxUsage();
> 589         long newMemoryUsage = metrics.getMemoryUsage();
> 
> 590 
> 591         if(newMemoryMaxUsage < memoryMaxUsage) {
> 592             fail(SubSystem.MEMORY, "getMemoryMaxUsage", newMemoryMaxUsage,
> 593                     memoryMaxUsage);
> 594         }
> 595 
> 596         if(newMemoryUsage < memoryUsage) {
> 597             fail(SubSystem.MEMORY, "getMemoryUsage", newMemoryUsage, memoryUsage);
> 598         }
> 599     }
> 
> My  change does not intend  to change this logic ,  just does more allocations to make sure the  current check works .

Yes, your change is clearly an improvement.  I just think the original logic is weak and could have been improved at the
same time.  You have a review from Severin so feel free to push what you’ve got.

Bob.


> 
> 
> Best regards, Matthias
> 
> 
> 
>> -----Original Message-----
>> From: Bob Vandette <bob.vandette at oracle.com>
>> Sent: Mittwoch, 28. August 2019 15:24
>> To: Baesken, Matthias <matthias.baesken at sap.com>
>> Cc: Severin Gehwolf <sgehwolf at redhat.com>; hotspot-
>> dev at openjdk.java.net
>> Subject: Re: RFR: [XS] 8229284: [TESTBUG]
>> jdk/internal/platform/cgroup/TestCgroupMetrics.java fails for -
>> memory:getMemoryUsage
>> 
>> Should you continue waiting in the loop until BOTH the new usage and max
>> usage exceed their
>> initial values?
>> 
>> Bob.
>> 
>> 
>>> On Aug 28, 2019, at 8:39 AM, Baesken, Matthias
>> <matthias.baesken at sap.com> wrote:
>>> 
>>> Hi Severin, I changed  the  fail() - calls   and the  newMemoryMaxUsage
>> handling.
>>> New webrev :
>>> 
>>> http://cr.openjdk.java.net/~mbaesken/webrevs/8229284.5/
>>> 
>>> 
>>> Best regards, Matthias
>>> 
>>> 
>>>> 
>>>> On Thu, 2019-08-15 at 16:08 +0000, Baesken, Matthias wrote:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8229284
>>>>> 
>>>>> http://cr.openjdk.java.net/~mbaesken/webrevs/8229284.3/
>>>> 
>>>> Hmm, unrelated to this bug, but still an issue:
>>>> 
>>>> It appears the failure message is bogus when the test fails. It should
>>>> be:
>>>> 
>>>> java.lang.RuntimeException: Test failed for - memory:getMemoryUsage,
>>>> expected [56200986624], got [56019386368]
>>>> 
>>>> I.e. the old/new values need to be swapped here:
>>>> 
>>>> 597             fail(SubSystem.MEMORY, "getMemoryUsage",
>>>> newMemoryUsage, memoryUsage);
>>>> 
>>>> Same for the getMemoryMaxUsage() fail:
>>>> 
>>>> 592             fail(SubSystem.MEMORY, "getMemoryMaxUsage",
>>>> newMemoryMaxUsage,
>>>> 593                     memoryMaxUsage);
>>>> 
>>>> As to the bug. It suggests the memoryUsage code causes problems, not
>>>> memoryMaxUsage.
>>>> 
>>>> 587         // allocate memory in a loop and check more than once for new
>>>> values
>>>> 588         // otherwise we might see seldom the effect of decreasing new
>>>> memory values
>>>> 589         // e.g. because the system could free up memory
>>>> 590         byte[][] bytes = new byte[32][];
>>>> 591         for (int i = 0; i < 32; i++) {
>>>> 592             bytes[i] = new byte[8*1024*1024];
>>>> 593             newMemoryMaxUsage = metrics.getMemoryMaxUsage();
>>>> 594             newMemoryUsage = metrics.getMemoryUsage();
>>>> 595             if (newMemoryMaxUsage > memoryMaxUsage &&
>>>> newMemoryUsage > memoryUsage) {
>>>> 596                 break;
>>>> 597             }
>>>> 
>>>> Do we really need to call metrics.getMemoryMaxUsage() in that loop? I'd
>>>> expect for the following code to work more reliably as the max usage is
>>>> supposed to capture the high water mark. If memoryMaxUsage ever
>>>> decreases, it's a bug in the cgroups accounting system right?
>>>> 
>>>> byte[][] bytes = new byte[32][];
>>>> for (int i = 0; i < 32; i++) {
>>>>   bytes[i] = new byte[8*1024*1024];
>>>>   newMemoryUsage = metrics.getMemoryUsage();
>>>>   if (newMemoryUsage > memoryUsage) {
>>>>       break;
>>>>   }
>>>> }
>>>> newMemoryMaxUsage = metrics.getMemoryMaxUsage();
>>>> 
>>>> // assert things
>>>> 
>>>> Perhaps even assert prior the loop:
>>>> 
>>>> if (memoryMaxUsage < memoryUsage) {
>>>>   throw new RuntimeException("cgroup accounting bug?");
>>>> }
>>>> 
>>>> Thanks,
>>>> Severin
>>> 
> 



More information about the hotspot-dev mailing list