1. I login Player1 to a zone and join the user in an MMORoom created dynamically, named "Player1MMO".
2. I do not send a entry event for either client, which makes the timer for userMaxLimboSeconds start.
3. After about 50 seconds, the server tries to disconnect the user, but the server outputs and error:
Code: Select all
[https-jsse-nio-8443-exec-7] websocket.SFS2XWSService - Error writing to client: { Id: 4, Type: WEBSOCKET, Logged: Yes, IP: 127.0.0.1:52842 }
java.lang.InterruptedException
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1367)
at java.base/java.util.concurrent.Semaphore.tryAcquire(Semaphore.java:415)
at org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1451)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1403)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1374)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:91)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessage(WsRemoteEndpointImplBase.java:381)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendBytesByCompletion(WsRemoteEndpointImplBase.java:151)
at org.apache.tomcat.websocket.WsRemoteEndpointAsync.sendBinary(WsRemoteEndpointAsync.java:65)
at sfs2x.ws.tomcat.websocket.SFS2XWSService._write(SFS2XWSService.java:456)
at sfs2x.ws.tomcat.websocket.SFS2XWSService.write(SFS2XWSService.java:449)
at com.smartfoxserver.bitswarm.websocket.tomcat.WebSocketBinaryProtocolCodec.onPacketWrite(WebSocketBinaryProtocolCodec.java:121)
at com.smartfoxserver.bitswarm.core.BitSwarmEngine.writeToWebSocket(BitSwarmEngine.java:427)
at com.smartfoxserver.bitswarm.core.BitSwarmEngine.write(BitSwarmEngine.java:408)
at com.smartfoxserver.bitswarm.io.Response.write(Response.java:70)
at com.smartfoxserver.v2.api.response.SFSResponseApi.notifyRoomRemoved(SFSResponseApi.java:144)
at com.smartfoxserver.v2.api.SFSApi.removeRoom(SFSApi.java:389)
at com.smartfoxserver.v2.api.SFSApi.removeRoom(SFSApi.java:371)
at com.smartfoxserver.v2.entities.managers.SFSRoomManager.removeWhenEmpty(SFSRoomManager.java:633)
at com.smartfoxserver.v2.entities.managers.SFSRoomManager.handleAutoRemove(SFSRoomManager.java:611)
at com.smartfoxserver.v2.entities.managers.SFSRoomManager.removeUser(SFSRoomManager.java:512)
at com.smartfoxserver.v2.entities.SFSZone.removeUserFromRoom(SFSZone.java:992)
at com.smartfoxserver.v2.api.SFSApi.leaveRoom(SFSApi.java:1087)
at com.smartfoxserver.v2.api.SFSApi.leaveRoom(SFSApi.java:1037)
at com.smartfoxserver.v2.mmo.MMORoomCleaner.kickUserOut(MMORoomCleaner.java:69)
at com.smartfoxserver.v2.mmo.MMORoomCleaner.run(MMORoomCleaner.java:51)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
The way the client responds to this error varies. For HTML5, a disconnection event is received by the client, but the server doesn't disconnect the user properly sometimes. For other clients, such as Flash, the user seems to be disconnected, but the client doesn't receive it and bugs out.
If I send an XY entry point when logging in, this issue does not occur. However, if there are multiple users logged in and any of the clients do not send an entry point, this server error happens, and causes all logged in users clients to bug out and/or disconnect.
I'm wondering if something is wrong with userMaxLimboSeconds, because when I try to set it to a lower value via setUserMaxLimboSeconds (such as 5 seconds), it still seems to wait 50 seconds before disconnecting the user. Here's what the config settings look like for the MMO room:
Code: Select all
cfg.setName(user.getName() + "MMO");
cfg.setHidden(true);
cfg.setDefaultAOI(new Vec3D(100,100,0));
cfg.setUserMaxLimboSeconds(5);
cfg.setProximityListUpdateMillis(500);
cfg.setSendAOIEntryPoint(true);
cfg.setMaxVariablesAllowed(7);
cfg.setMaxUsers(8);
cfg.setDynamic(true);
cfg.setAutoRemoveMode(SFSRoomRemoveMode.WHEN_EMPTY);
cfg.setRoomVariables(roomVars);