GitHub user mike-jumper opened a pull request:

    https://github.com/apache/incubator-guacamole-client/pull/43

    GUACAMOLE-67: Always clean up the connection upon WebSocket error.

    From [GUACAMOLE-67](https://issues.apache.org/jira/browse/GUACAMOLE-67):
    
    > If Tomcat (or another servlet container) encounters a hard, internal I/O 
error while handling a WebSocket connection, the resulting `IOException` will 
cause the connection thread to die:
    > 
    > ```
    > 15:39:50.882 [Thread-19] DEBUG o.a.g.w.GuacamoleWebSocketTunnelEndpoint - 
I/O error prevents further reads.
    > java.io.IOException: java.util.concurrent.ExecutionException: 
java.io.IOException: Key must be cancelled
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:228)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:172)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.guacamole.websocket.GuacamoleWebSocketTunnelEndpoint$2.run(GuacamoleWebSocketTunnelEndpoint.java:169)
 ~[GuacamoleWebSocketTunnelEndpoint$2.class:na]
    > Caused by: java.util.concurrent.ExecutionException: java.io.IOException: 
Key must be cancelled
    >   at 
org.apache.tomcat.websocket.FutureToSendHandler.get(FutureToSendHandler.java:102)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:224)
 ~[tomcat-websocket.jar:8.0.14]
    >   ... 3 common frames omitted
    > Caused by: java.io.IOException: Key must be cancelled
    >   at 
org.apache.coyote.http11.upgrade.NioServletOutputStream.doWriteInternal(NioServletOutputStream.java:84)
 ~[tomcat-coyote.jar:8.0.14]
    >   at 
org.apache.coyote.http11.upgrade.NioServletOutputStream.doWrite(NioServletOutputStream.java:61)
 ~[tomcat-coyote.jar:8.0.14]
    >   at 
org.apache.coyote.http11.upgrade.AbstractServletOutputStream.writeInternal(AbstractServletOutputStream.java:162)
 ~[tomcat-coyote.jar:8.0.14]
    >   at 
org.apache.coyote.http11.upgrade.AbstractServletOutputStream.write(AbstractServletOutputStream.java:129)
 ~[tomcat-coyote.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.onWritePossible(WsRemoteEndpointImplServer.java:99)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:81)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:420)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:311)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase$TextMessageSendHandler.write(WsRemoteEndpointImplBase.java:675)
 ~[tomcat-websocket.jar:8.0.14]
    >   at 
org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:220)
 ~[tomcat-websocket.jar:8.0.14]
    >   ... 3 common frames omitted
    > ```
    > 
    > This death is fine, but the code handling that error does not properly 
invoke `closeConnection()`, thus the associated `GuacamoleTunnel` and 
`GuacamoleSocket` are not guaranteed to be closed. They will *eventually* close 
due to timeout, but the lack of further read errors means that internal 
connection tracking will never realize the connection is closed. Extensions 
like guacamole-auth-jdbc which track connection activity based on closure will 
fail to properly record the connection as dead, and will require that the 
connection be explicitly closed by an admin.
    
    This change adds the missing invocation of `closeConnection()` to the 
handling of the `IOException` mentioned above.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/mike-jumper/incubator-guacamole-client 
fix-connection-hang

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-guacamole-client/pull/43.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #43
    
----
commit 12abb3c59cf0383619fc8f0bb162433a181e2b82
Author: Michael Jumper <[email protected]>
Date:   2016-07-29T22:47:24Z

    GUACAMOLE-67: Always clean up the connection upon WebSocket error.

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to