[ https://issues.apache.org/jira/browse/GUACAMOLE-67?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Michael Jumper resolved GUACAMOLE-67. ------------------------------------- Resolution: Fixed > I/O error in WebSocket can cause connection tracking to fail > ------------------------------------------------------------ > > Key: GUACAMOLE-67 > URL: https://issues.apache.org/jira/browse/GUACAMOLE-67 > Project: Guacamole > Issue Type: Bug > Components: guacamole > Reporter: Michael Jumper > Assignee: Michael Jumper > Priority: Blocker > Fix For: 0.9.10-incubating > > > 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: > {code:none} > 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 > {code} > 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 message was sent by Atlassian JIRA (v6.3.4#6332)