8242480: Negative value may be returned by getFreeSwapSpaceSize() in the docker(Internet mail)

Severin Gehwolf sgehwolf at redhat.com
Thu Apr 16 15:39:40 UTC 2020


Hi Jie,

On Thu, 2020-04-16 at 13:23 +0000, jiefu(傅杰) wrote:
> Hi Severin,
> 
> Thanks for your review and very nice suggestions.

Thanks for adding a test!

> Updated: http://cr.openjdk.java.net/~jiefu/8242480/webrev.01/
> 
> test/hotspot/jtreg/containers/docker/TestGetFreeSwapSpaceSize.java is
> added to reproduce the bug.

Since you've added a new test, please move them to the jdk docker tests
in: 
test/jdk/jdk/internal/platform/docker/

This is because the OperatingSystemMXBean uses the Metrics.java
internal API (not hotspot cgroup support) and the tests really belong
there alongside other Metrics docker tests.

test/hotspot/jtreg/containers/docker/TestGetFreeSwapSpaceSize.java

+ * @build sun.hotspot.WhiteBox GetFreeSwapSpaceSize
+ * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission

I don't see any reason why WhiteBox would be needed for this test. Is
that an oversight or am I missing something?

Thanks,
Severin

> Thanks a lot.
> Best regards,
> Jie
> 
> 
> On 2020/4/16, 4:40 PM, "Severin Gehwolf" <sgehwolf at redhat.com>
> wrote:
> 
>     Hi Jie,
>     
>     On Fri, 2020-04-10 at 01:49 +0000, jiefu(傅杰) wrote:
>     > Hi all,
>     >  
>     > JBS:    https://bugs.openjdk.java.net/browse/JDK-8242480
>     > Webrev: http://cr.openjdk.java.net/~jiefu/8242480/webrev.00/
>     >  
>     > Negative values were returned by getFreeSwapSpaceSize() in our
> docker testing.
>     > The reason is that current implementation doesn't consider the
> situation when memory.limit_in_bytes == memory.memsw.limit_in_bytes,
> which means do not use the swap space at all.
>     >  
>     > In
> src/jdk.management/unix/classes/com/sun/management/internal/Operating
> SystemImpl.java, let's see
>     > ------------------------------------------------
>     >  71     public long getFreeSwapSpaceSize() {
>     >  72         if (containerMetrics != null) {
>     >  73             long memSwapLimit =
> containerMetrics.getMemoryAndSwapLimit();
>     >  74             long memLimit =
> containerMetrics.getMemoryLimit();
>     >  75             if (memSwapLimit >= 0 && memLimit >= 0) {
>     >  76                 for (int attempt = 0; attempt <
> MAX_ATTEMPTS_NUMBER; attempt++) {
>     >  77                     long memSwapUsage =
> containerMetrics.getMemoryAndSwapUsage();
>     >  78                     long memUsage =
> containerMetrics.getMemoryUsage();
>     >  79                     if (memSwapUsage > 0 && memUsage > 0) {
>     >  80                         // We read "memory usage" and
> "memory and swap usage" not atomically,
>     >  81                         // and it's possible to get the
> negative value when subtracting these two.
>     >  82                         // If this happens just retry the
> loop for a few iterations.
>     >  83                         if ((memSwapUsage - memUsage) >= 0)
> {
>     >  84                             return memSwapLimit - memLimit
> - (memSwapUsage - memUsage);
>     >  85                         }
>     >  86                     }
>     >  87                 }
>     >  88             }
>     >  89         }
>     >  90         return getFreeSwapSpaceSize0();
>     >  91     }
>     > ------------------------------------------------
>     > If memSwapLimit (@line 73) equals memLimit (@line 74), then
> getFreeSwapSpaceSize() may return a negative value @line 84.
>     >  
>     > It would be better to fix it.
>     > Could you please review it and give me some advice?
>     
>     Would this be reproducible via a test? There is
>     test/hotspot/jtreg/containers/docker/TestMemoryAwareness.java
> which
>     contains testOperatingSystemMXBeanAwareness() tests.
>     
>     It would be good to capture this in a test somehow.
>     
>     Thanks,
>     Severin
>     
>     
>     
> 



More information about the serviceability-dev mailing list