Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix soft shutdown e limita jogadores #196

Merged
merged 4 commits into from
Aug 5, 2023

Conversation

chesterbr
Copy link
Owner

A introdução de virtual threads (#195) causou um bug interessante: como as threads de JogadorConectado não são threads propriamente ditas, a VM não espera elas encerrarem pra dar shutdown, fazendo com que o soft shutdown (#185) falhe (o servidor cai imeditamente ao finalizar a thread que escuta conexões).

Para corrigir isso, foi preciso manter uma collection com as threads de JogadorConectado em execução (o que, por sua vez, exigiu que fosse implementado um callback naquela classe para que MiniTrucoServer saiba quando um jogador finaliza e tire ele da collection). Quando o listen é interrompido, a thread que escuta as conexões (a única coisa mantendo a JVM no ar nessa hora) espera que não haja mais nenhum jogador conectado antes de encerrar.

Com essa coleção em mãos, ficou fácil implementar dois outros itens de #38: um jeito fácil de ver quantos jogadores estão conectados (bastou logar um evento quando a coleção é modificada: "Jogadores conectados: <tamanho da coleção>", que é facilmente grepável) e um limite do número de jogadores conectados (quando uma conexão entra e a coleção já está no limite daquele tamanho, manda uma notificação toast e desconecta).

Poderia fazer o máximo ser alterável dinamicamente, mas vamos pensar MVP aqui.

…rrou.

Ele vai ser usado para que MiniTrucoServer mantenha uma coleção das threads de JogadorConectado abertas (pra corrigir um bug e saber quantos usuários estão conectados)
…reads), esperando as threads de JogadorConectado (porque a JVM não espera threads virtuais)
@chesterbr
Copy link
Owner Author

Parte de #173

@chesterbr chesterbr mentioned this pull request Aug 5, 2023
52 tasks
@@ -90,7 +114,28 @@ public static void aceitaConexoes() {
ServerLogger.evento(e, "Erro de I/O ao fechar ServerSocket");
}
}
ServerLogger.evento("Servidor não está mais escutando; aguardando finalização dos jogadores conectados.");
ServerLogger.evento("Servidor não está mais escutando (porta liberada)");
aguardaThreadsJogadoresFinalizarem();
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, não, eu não posso dar join delas todas. Aparentemente isso não funciona tão bem com Virtual Threads; vou investigar mais a fundo futuramente.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(talvez não tenha funcionado porque eu tentei fazer isso naquele handler do signal de USR1?)

@chesterbr chesterbr merged commit 299af5b into main Aug 5, 2023
@chesterbr chesterbr deleted the fix-soft-shutdown-e-limita-jogadores branch August 5, 2023 01:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant