[ 
https://issues.apache.org/jira/browse/GEODE-10165?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17513534#comment-17513534
 ] 

Darrel Schneider commented on GEODE-10165:
------------------------------------------

My recommendation would be to change Transport.doSend to do this:

{code:java}
    } catch (SocketException sock_ex) {
      if (!sock.isClosed() && !stack.getChannel().isClosed()) {
        if (messenger != null) { 
          messenger.handleJGroupsIOException(sock_ex, dest);
        } else {
          log.error("Exception caught while sending message", sock_ex);
        }
      }
    } catch (IOException e) {
...
{code}
Its interesting that the IOException handling has a comment that this message 
"Operation not permitted" is what it really wanted to handle. At some point it 
was broadened to handle even more IOExceptions. The SocketException handling 
appears to be trying to log less (log nothing if socket was closed) then the 
default Throwable which just always logs that same error. Given that 
SocketException is an IOException we can pass one to handleJGroupsIOException 
with no problem and it also suppresses logging if manager's shutdown is in 
progress.
So I think this change makes sense. The only thing I'm not sure about is if 
SocketException handing should do nothing if messenger is null (just like 
IOException does) or if it should have the "else" that logs it. It should 
probably follow the example of IOException and do nothing.

> DatagramSocket can throw SocketException instead of IOException when 
> operation not permitted on JDK17
> -----------------------------------------------------------------------------------------------------
>
>                 Key: GEODE-10165
>                 URL: https://issues.apache.org/jira/browse/GEODE-10165
>             Project: Geode
>          Issue Type: Improvement
>          Components: membership
>    Affects Versions: 1.15.0
>            Reporter: Dale Emery
>            Priority: Major
>              Labels: Java17
>
> On JDK 17, a DatagramSocket can throw `SocketException` for "Operation not 
> permitted". In the same situation where on JDK11 it would throw `IOException`.
>  
> `Transport.doSend()` logs a `SocketException` as an error. It delegates 
> handling the `IOException` to its messenger, which logs it as a warning.
> So the exception is logged as an error on JDK17, where on JDK11 it would be 
> logged as a warning.
>  
> Example failure in CI:
> - Failure in CI (PR precheckin): 
> https://concourse.apachegeode-ci.info/builds/39064786
> - Test results: 
> http://files.apachegeode-ci.info/builds/apache-develop-pr/geode-pr-7475/test-results/distributedTest/1648074003/
> - Test run artifacts: 
> http://files.apachegeode-ci.info/builds/apache-develop-pr/geode-pr-7475/test-artifacts/1648074003/distributedtestfiles-geode-pr-7475.tgz
> Example stack trace on JDK17:
> {noformat}
> [vm5] [error 2022/03/23 20:00:06.635 UTC  <Shutdown Message Thread for 
> heavy-lifter-1c2c92cd-65e8-5d6a-a2fd-52d05cdafe97(45303)<v2>:47672> 
> tid=0x40d] Exception caught while sending message
> [vm5] java.net.SocketException: Operation not permitted
> [vm5] at java.base/sun.nio.ch.DatagramChannelImpl.send0(Native Method)
> [vm5] at 
> java.base/sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:901)
> [vm5] at 
> java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:863)
> [vm5] at 
> java.base/sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:821)
> [vm5] at 
> java.base/sun.nio.ch.DatagramChannelImpl.blockingSend(DatagramChannelImpl.java:853)
> [vm5] at 
> java.base/sun.nio.ch.DatagramSocketAdaptor.send(DatagramSocketAdaptor.java:218)
> [vm5] at java.base/java.net.DatagramSocket.send(DatagramSocket.java:664)
> [vm5] at org.jgroups.protocols.UDP._send(UDP.java:224)
> [vm5] at org.jgroups.protocols.UDP.sendUnicast(UDP.java:215)
> [vm5] at org.jgroups.protocols.TP.sendToSingleMember(TP.java:1985)
> [vm5] at org.jgroups.protocols.TP.doSend(TP.java:1962)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.Transport.doSend(Transport.java:85)
> [vm5] at org.jgroups.protocols.TP.send(TP.java:1948)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.Transport._send(Transport.java:57)
> [vm5] at org.jgroups.protocols.TP.down(TP.java:1515)
> [vm5] at org.jgroups.stack.Protocol.down(Protocol.java:439)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.StatRecorder.down(StatRecorder.java:87)
> [vm5] at org.jgroups.protocols.UNICAST3.down(UNICAST3.java:646)
> [vm5] at org.jgroups.protocols.FlowControl.down(FlowControl.java:347)
> [vm5] at org.jgroups.protocols.FRAG2.down(FRAG2.java:136)
> [vm5] at org.jgroups.stack.ProtocolStack.down(ProtocolStack.java:1039)
> [vm5] at org.jgroups.JChannel.down(JChannel.java:790)
> [vm5] at org.jgroups.JChannel.send(JChannel.java:426)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.JGroupsMessenger.send(JGroupsMessenger.java:838)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.JGroupsMessenger.send(JGroupsMessenger.java:681)
> [vm5] at 
> org.apache.geode.distributed.internal.membership.gms.GMSMembership.send(GMSMembership.java:1335)
> [vm5] at 
> org.apache.geode.distributed.internal.DistributionImpl.send(DistributionImpl.java:291)
> [vm5] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendViaMembershipManager(ClusterDistributionManager.java:2067)
> [vm5] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendShutdownMessage(ClusterDistributionManager.java:1965)
> [vm5] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.lambda$shutdown$2(ClusterDistributionManager.java:1134)
> [vm5] at java.base/java.lang.Thread.run(Thread.java:833)
> {noformat}
>  
> Example stack trace on JDK11:
> {noformat}
> [vm7] [warn 2022/03/24 23:40:50.949 UTC  <Shutdown Message Thread for 
> dale-dunit(51430)<v4>:52674> tid=0x2d5] Unable to send message to 
> dale-dunit(50205)<v3>:52673
> [vm7] java.io.IOException: Operation not permitted
> [vm7] at java.base/java.net.PlainDatagramSocketImpl.send(Native Method)
> [vm7] at java.base/java.net.DatagramSocket.send(DatagramSocket.java:695)
> [vm7] at org.jgroups.protocols.UDP._send(UDP.java:224)
> [vm7] at org.jgroups.protocols.UDP.sendUnicast(UDP.java:215)
> [vm7] at org.jgroups.protocols.TP.sendToSingleMember(TP.java:1985)
> [vm7] at org.jgroups.protocols.TP.doSend(TP.java:1962)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.Transport.doSend(Transport.java:85)
> [vm7] at org.jgroups.protocols.TP.send(TP.java:1948)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.Transport._send(Transport.java:57)
> [vm7] at org.jgroups.protocols.TP.down(TP.java:1515)
> [vm7] at org.jgroups.stack.Protocol.down(Protocol.java:439)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.StatRecorder.down(StatRecorder.java:87)
> [vm7] at org.jgroups.protocols.UNICAST3.down(UNICAST3.java:646)
> [vm7] at org.jgroups.protocols.FlowControl.down(FlowControl.java:347)
> [vm7] at org.jgroups.protocols.FRAG2.down(FRAG2.java:136)
> [vm7] at org.jgroups.stack.ProtocolStack.down(ProtocolStack.java:1039)
> [vm7] at org.jgroups.JChannel.down(JChannel.java:790)
> [vm7] at org.jgroups.JChannel.send(JChannel.java:426)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.JGroupsMessenger.send(JGroupsMessenger.java:838)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.messenger.JGroupsMessenger.send(JGroupsMessenger.java:681)
> [vm7] at 
> org.apache.geode.distributed.internal.membership.gms.GMSMembership.send(GMSMembership.java:1335)
> [vm7] at 
> org.apache.geode.distributed.internal.DistributionImpl.send(DistributionImpl.java:291)
> [vm7] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendViaMembershipManager(ClusterDistributionManager.java:2067)
> [vm7] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.sendShutdownMessage(ClusterDistributionManager.java:1965)
> [vm7] at 
> org.apache.geode.distributed.internal.ClusterDistributionManager.lambda$shutdown$2(ClusterDistributionManager.java:1134)
> [vm7] at java.base/java.lang.Thread.run(Thread.java:829)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to