[jdk17] RFR: JDK-8265369 [macos-aarch64] java/net/MulticastSocket/Promiscuous.java failed with "SocketException: Cannot allocate memory"

Mark Sheppard msheppar at openjdk.java.net
Tue Jun 15 10:37:38 UTC 2021


On Tue, 15 Jun 2021 08:58:45 GMT, Chris Hegarty <chegar at openjdk.org> wrote:

>> JDK-8265369 [macos-aarch64] java/net/MulticastSocket/Promiscuous.java failed with "SocketException: Cannot allocate memory"
>> 
>> The test java/net/MulticastSocket/Promiscuous.java has been observed to fail on a regular basis on macosx-aarch.
>> This is typically under heavy test load on a test machine. Analysis of the problem have
>> shown that the setsockopt for joining a multicast group will intermittently fail with ENOMEM.
>> 
>> While analysis of test environment shows significant memory usage and some memory pressure, it is
>> not excessive and as such it is deemed transition or temporary condition, such that a retry of the
>> setsockopt system call, has been seen to mitigate the issue. This adds to the stability of the
>> Promiscuous.java test and reduces test failure noise.
>> 
>> The proposed fix is in open/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c
>> in the mcast_join_leave function.  That is, if setsockopt to join an mcast group fails, and the errno == ENOMEM, 
>> then re-invoke the setsockopt system call for joining a mcast group.
>> The change has been applied as a conditional compilation.
>> Additionally this change result in the Promiscuous.java test being removed from the
>> ProblemList.txt.
>> 
>> Please oblige and review the changes for a fix of the issue JDK-8265369
>
> src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c line 2017:
> 
>> 2015:                 }
>> 2016:             } else {
>> 2017: #endif
> 
> The handling of ENOMEM here is consistent with how it is handled in the NIO area - good.
> 
> I wonder if a little restructuring may simplify the call flow? For example, something similar to:
> 
>   int n;
>   ...
>   /*
>    * Join the multicast group.
>    */
>    n = setsockopt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
>                           (char *) &mname, mname_len);
> #ifdef __APPLE__
>    // workaround macOS bug where IP_ADD/DROP_MEMBERSHIP fails intermittently
>    if (n < 0 && errno == ENOMEM) {
>       n = setsockopt(fd, IPPROTO_IP, (join ? IP_ADD_MEMBERSHIP:IP_DROP_MEMBERSHIP),
>                                           (char *) &mname, mname_len);
>    }
> #endif
> 
>   if (n < 0) {  ...

yes, I'll do that ... originally I did this but reverted to current change to retain the current structure of the file
thanks for the suggestion, it is much neater

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

PR: https://git.openjdk.java.net/jdk17/pull/44


More information about the net-dev mailing list