[ https://issues.apache.org/jira/browse/JCS-41?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Aaron Smuts closed JCS-41. -------------------------- Resolution: Fixed Fix Version/s: jcs-1.4-dev I implemented the fix and made the setting configurable on the server. It will be in the 1.3.2.0-rc temp build. > RemoteCache & RemoteCacheServerFactory setting RMISocketFactory > --------------------------------------------------------------- > > Key: JCS-41 > URL: https://issues.apache.org/jira/browse/JCS-41 > Project: JCS > Issue Type: Improvement > Components: RMI Remote Cache > Affects Versions: jcs-1.3, jcs-1.4-dev > Environment: All > Reporter: Niall Gallagher > Assignee: Aaron Smuts > Fix For: jcs-1.4-dev > > Original Estimate: 1h > Remaining Estimate: 1h > > Classes... > org.apache.jcs.auxiliary.remote.RemoteCache > and > org.apache.jcs.auxiliary.remote.server.RemoteCacheServerFactory > .. both try to set a timeout on RMI connections between the remote cache > server and client machines using the following code to install a > timeout-enabled socket factory which the RMI subsystem subsequently uses... > RMISocketFactory.setSocketFactory( new RMISocketFactory() { > public Socket createSocket( String host, int port ) throws > IOException { > Socket socket = new Socket( host, port ); > socket.setSoTimeout( DEFAULT_RMI_SOCKET_FACTORY_TIMEOUT_MS ); > socket.setSoLinger( false, 0 ); > return socket; > } > public ServerSocket createServerSocket( int port ) throws > IOException { > return new ServerSocket( port ); > } > }); > The socket factory code above applies a "read timeout" to RMI sockets such > that if a connection is already established and subsequently stalls or a > machine goes offline, the timeout will break the connection as intended. The > code does not apply a "connect timeout" however, which means that if an > attempt is made to establish a new connection to a machine which is offline, > the socket connection attempt will stall for an infinite amount of time (such > is the default connect timeout), and therefore the thread opening the > connection will stall permanently in the JVM. > This is not a bug in JCS code, it was a limitation in JDK3 in that you could > not AFAIK set a connection timeout on a socket. > As of JDK4, there is a socket.connect(address, timeout) method, so this issue > can be fixed. > Here's the required replacement code: > RMISocketFactory.setSocketFactory( new RMISocketFactory() { > public Socket createSocket( String host, int port ) throws > IOException { > Socket socket = new Socket(); > socket.setSoTimeout(timeoutMillis); > socket.setSoLinger( false, 0 ); > socket.connect(new InetSocketAddress(host, port), > timeoutMillis); > return socket; > } > public ServerSocket createServerSocket( int port ) throws > IOException { > return new ServerSocket( port ); > } > }); > This was an issue for us recently. We fixed it by installing the > RMISocketFactory above in the JVM before initializing JCS. We have tested and > confirmed that this code works well with JCS, it times out reads same as > before and it now times out new connection attempts too. > How about including this in the next version of JCS? > By the way I read some JCS mailing list archives from last time socket > timeouts were discussed. Not sure if this will be helpful to anyone... but we > found that if an RMI client and server were running on the same subnet, > timeouts were not required and each machine detected that the other was > offline immediately. Cross-subnet through our router however, timeouts became > important as attempts to connect to an offline machine resulted in JCS > threads hanging whilst trying to connect. > We are not sure, but we suspect that this is related to our firewall blocking > required ICMP "host not reachable" packets between subnets, causing different > behaviour depending on the network setup. The replacement code above allows > our machines in both subnets to recover when a machine is offline, previously > they just stalled. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]