What I think is happening is, that sometimes after someone or you joined a server, the slot is not properly cleared, so the server thinks you are still on it and of course does not let you join again, but the game itself also thinks a serverconnection is running and does not let you join another game. The server in the list then is listed with +1 human player, that does not get cleared and stays broken and when someone tries to join it it adds +1 more human player, but for the person joining the game breaks, so he has to quit the game and try again, which may repeat the cycle.
What makes it so hard to test is, that you need a server on the internet and a client to join the server and a lot of patience to wait till something breaks and the bug occurs. I cannot open multiple instances of the game myself to test it, because it seems to be locked by the IP, meaning you need real different people to test it with real different IPs.
My current solution is to just restart the servers every X hours, so the bug never occurs, since the longer a server runs and the more players are on it the sooner it occurs. Bots work as well to cause the bug, which I now realized, since I have more bots on the servers by default and the bug happens much sooner. The bots simulate a real player connection, so they appear on the server list as players etc.
So what I think is happening is that at some point server connections are not getting cleared on the dedicated servers and either the server becomes unjoinable after you tried to join it, or it completely gets removed from the list by the master server since it reports some unlegit number of players and also becomes unjoinable.
Well this all sounds very complicated, but this is a potential game breaking bug and I don't really know where to start, so maybe someone here has an idea, I also provide a short console.log of what happens when I try to join such a bugged server and join it again:
==>trace(1);
Console trace enabled.
Leaving ConsoleEntry::eval() - return
Entering ToggleConsole(1)
Entering [CanvasCursorPackage]GuiCanvas::popDialog(Canvas, ConsoleDlg)
Entering ConsoleDlg::onSleep()
Leaving ConsoleDlg::onSleep() - return
Entering [CanvasCursorPackage]GuiCanvas::checkCursor(Canvas)
Entering showCursor()
Leaving showCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::checkCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::popDialog() - return
Leaving ToggleConsole() - return
Entering ToggleConsole(0)
Leaving ToggleConsole() - return
Entering JoinServerDlg::join(JoinServerDlg)
Server query canceled.
Adding a pending connection
Sending Connect challenge Request
Leaving JoinServerDlg::join() - return
Got Connect challenge Response
Sending Connect Request
Connection established 25566
Entering GameConnection::onConnectionAccepted(25566)
Leaving GameConnection::onConnectionAccepted() - return
Entering GameConnection::setLagIcon(25566, 1)
Leaving GameConnection::setLagIcon() - return
Mapping string: ServerMessage to index: 0
Mapping string: MsgClientJoin to index: 1
Mapping string: %1 has joined the server. to index: 2
Entering clientCmdServerMessage(23 MsgClientJoin, 70 has joined the server., , 1.00527e+06, , 0, , , , 0)
Entering defaultMessageCallback(23 MsgClientJoin, 70 has joined the server., , 1.00527e+06, , 0, , , , 0, , )
Entering onServerMessage( has joined the server.)
Entering playMessageSound( has joined the server.)
Leaving playMessageSound() - return -1
Entering ChatHud::addLine(ChatHud, has joined the server.)
Leaving ChatHud::addLine() - return
Leaving onServerMessage() - return
Leaving defaultMessageCallback() - return
Entering handleClientJoin(23 MsgClientJoin, 70 has joined the server., , 1.00527e+06, , 0, , , , 0, , )
Entering PlayerListGui::updatePlayerInfo(PlayerListGui, 25568)
Leaving PlayerListGui::updatePlayerInfo() - return
Leaving handleClientJoin() - return
Leaving clientCmdServerMessage() - return
Entering GameConnection::setLagIcon(25566, 0)
Leaving GameConnection::setLagIcon() - return
Entering ToggleConsole(1)
Entering [CanvasCursorPackage]GuiCanvas::pushDialog(Canvas, ConsoleDlg, 99)
Entering ConsoleDlg::onWake()
Leaving ConsoleDlg::onWake() - return
Entering [CanvasCursorPackage]GuiCanvas::checkCursor(Canvas)
Entering showCursor()
Leaving showCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::checkCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::pushDialog() - return
Entering updateConsoleErrorWindow()
Leaving updateConsoleErrorWindow() - return
Leaving ToggleConsole() - return
Entering ToggleConsole(0)
Leaving ToggleConsole() - return
Entering ToggleConsole(1)
Entering [CanvasCursorPackage]GuiCanvas::popDialog(Canvas, ConsoleDlg)
Entering ConsoleDlg::onSleep()
Leaving ConsoleDlg::onSleep() - return
Entering [CanvasCursorPackage]GuiCanvas::checkCursor(Canvas)
Entering showCursor()
Leaving showCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::checkCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::popDialog() - return
Leaving ToggleConsole() - return
Entering ToggleConsole(0)
Leaving ToggleConsole() - return
Entering JoinServerDlg::join(JoinServerDlg)
scripts/gui/joinServerDlg.cs (151): Cannot re-declare object [ServerConnection].
scripts/gui/joinServerDlg.cs (152): Unable to find object: '0' attempting to call function 'setConnectArgs'
scripts/gui/joinServerDlg.cs (153): Unable to find object: '0' attempting to call function 'setJoinPassword'
scripts/gui/joinServerDlg.cs (154): Unable to find object: '0' attempting to call function 'connect'
Leaving JoinServerDlg::join() - return
Entering toggleJoinServerDlg()
Entering [CanvasCursorPackage]GuiCanvas::popDialog(Canvas, JoinServerDlg)
Entering [CanvasCursorPackage]GuiCanvas::checkCursor(Canvas)
Entering showCursor()
Leaving showCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::checkCursor() - return
Leaving [CanvasCursorPackage]GuiCanvas::popDialog() - return
Entering JoinServerDlg::query(JoinServerDlg)
Entering onServerQueryStatus(start, Querying master server, 0)
Leaving onServerQueryStatus() - return
No master servers found in this region, trying IP:88.198.65.149:28002.
Requesting the server list from master server IP:88.198.65.149:28002 (2 tries left)...
Leaving JoinServerDlg::query() - return
Leaving toggleJoinServerDlg() - return
Received server list packet 1 of 1 from the master server (4 servers).
Pinging Server IP:88.198.65.149:28000 (3)...
Pinging Server IP:88.198.65.149:28003 (3)...
Pinging Server IP:88.198.65.149:28004 (3)...
Pinging Server IP:88.198.65.149:28005 (3)...