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)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);