Skip to content

El server no desmarca personajes al apagarse: quedan bloqueados tras un reinicio #26

Description

@leocagli

Problema

Cuando el server del juego se apaga (deploy, reinicio, docker compose restart), los personajes quedan marcados como connected = true en la base de datos. No hay ningún manejo de SIGTERM ni SIGINT.

El reset existe, pero sólo corre al arrancar, y encima detrás de un flag:

// server/src/server.ts, alrededor de la linea 429
if (config.resetConnectedCharactersOnStartup) {
    await funct.fetchUrl("/internal/characters/reset-connected", { ... });
}

Consecuencias

  • Entre el apagado y el próximo arranque, los jugadores no pueden volver a entrar: su personaje figura conectado.
  • Si el servidor no vuelve a levantar, quedan bloqueados hasta que alguien lo resuelva a mano.
  • Si RESET_CONNECTED_CHARACTERS_ON_STARTUP está en false, el problema es permanente.
  • El contador de jugadores en línea queda inflado.

Solución

El endpoint ya existe (POST /internal/characters/reset-connected, en api/src/server.ts). Sólo falta llamarlo al recibir la señal de apagado.

Referencia: el fork sebapch/aowebpch ya implementó exactamente esto, con gracefulShutdown enganchado a SIGINT y SIGTERM.

Alcance

  1. Handler de SIGTERM y SIGINT que desmarque los personajes conectados antes de salir.
  2. Timeout: si la API no responde, salir igual en vez de colgarse. Un apagado que no termina es peor que uno sucio, porque Docker lo mata a los 10 segundos de todos modos.
  3. Avisar a los clientes conectados antes de cortar, para que muestren un mensaje en vez de un error genérico.
  4. Mantener el reset al arrancar como red de seguridad, para el caso de caída abrupta donde no hay señal.

Criterios de aceptación

  • docker compose stop deja los personajes desmarcados
  • Un jugador puede volver a entrar inmediatamente después de un reinicio
  • Si la API no responde durante el apagado, el proceso termina igual
  • El reset al arrancar sigue existiendo como respaldo

Archivos relevantes

  • server/src/server.ts (reset al arrancar alrededor de la línea 429; faltan los handlers de señal)
  • api/src/server.ts (endpoint /internal/characters/reset-connected, alrededor de la línea 2163)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardThird CampaignCampaign: Third CampaignbountyIssue con recompensa asignadabugSomething isn't workinggrantfoxPublicada en la campana de GrantFoxreward-50-usdRecompensa 50 USD - complejidad media

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions