Fix at_server_reload_start not firing. Resolve #3477. Add Server-Lifecycle.md docpage

This commit is contained in:
Griatch 2024-04-06 14:08:36 +02:00
parent 50d8ae2f54
commit 387533d1f0
15 changed files with 222 additions and 80 deletions

View file

@ -197,8 +197,6 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
if process and not _is_windows():
# avoid zombie-process on Unix/BSD
process.wait()
# unset the reset-mode flag on the portal
self.factory.portal.server_restart_mode = None
return
def wait_for_disconnect(self, callback, *args, **kwargs):
@ -232,11 +230,18 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
"""
if mode == "reload":
self.send_AdminPortal2Server(amp.DUMMYSESSION, operation=amp.SRELOAD)
self.send_AdminPortal2Server(
amp.DUMMYSESSION, operation=amp.SRELOAD, server_restart_mode=mode
)
elif mode == "reset":
self.send_AdminPortal2Server(amp.DUMMYSESSION, operation=amp.SRESET)
self.send_AdminPortal2Server(
amp.DUMMYSESSION, operation=amp.SRESET, server_restart_mode=mode
)
elif mode == "shutdown":
self.send_AdminPortal2Server(amp.DUMMYSESSION, operation=amp.SSHUTD)
self.send_AdminPortal2Server(
amp.DUMMYSESSION, operation=amp.SSHUTD, server_restart_mode=mode
)
# store the mode for use once server comes back up again
self.factory.portal.server_restart_mode = mode
# sending amp data
@ -326,7 +331,6 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
_, server_connected, _, _, _, _ = self.get_status()
# logger.log_msg("Evennia Launcher->Portal operation %s:%s received" % (ord(operation), arguments))
# logger.log_msg("operation == amp.SSTART: {}: {}".format(operation == amp.SSTART, amp.loads(arguments)))
if operation == amp.SSTART: # portal start #15
@ -405,11 +409,11 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
sessid, kwargs = self.data_in(packed_data)
# logger.log_msg("Evennia Server->Portal admin data %s:%s received" % (sessid, kwargs))
operation = kwargs.pop("operation")
portal_sessionhandler = evennia.PORTAL_SESSION_HANDLER
# logger.log_msg(f"Evennia Server->Portal admin data operation {ord(operation)}")
if operation == amp.SLOGIN: # server_session_login
# a session has authenticated; sync it.
session = portal_sessionhandler.get(sessid)
@ -427,22 +431,28 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
portal_sessionhandler.server_disconnect_all(reason=kwargs.get("reason"))
elif operation == amp.SRELOAD: # server reload
# set up callback to restart server once it has disconnected
self.factory.server_connection.wait_for_disconnect(
self.start_server, self.factory.portal.server_twistd_cmd
)
# tell server to reload
self.stop_server(mode="reload")
elif operation == amp.SRESET: # server reset
# set up callback to restart server once it has disconnected
self.factory.server_connection.wait_for_disconnect(
self.start_server, self.factory.portal.server_twistd_cmd
)
# tell server to reset
self.stop_server(mode="reset")
elif operation == amp.SSHUTD: # server-only shutdown
self.stop_server(mode="shutdown")
elif operation == amp.PSHUTD: # full server+server shutdown
# set up callback to shut down portal once server has disconnected
self.factory.server_connection.wait_for_disconnect(self.factory.portal.shutdown)
# tell server to shut down
self.stop_server(mode="shutdown")
elif operation == amp.PSYNC: # portal sync
@ -451,6 +461,7 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
self.factory.portal.server_process_id = kwargs.get("spid", None)
# this defaults to 'shutdown' or whatever value set in server_stop
server_restart_mode = self.factory.portal.server_restart_mode
# print("Server has connected. Sending session data to Server ... mode: {}".format(server_restart_mode))
sessdata = evennia.PORTAL_SESSION_HANDLER.get_all_sync_data()
self.send_AdminPortal2Server(
@ -461,6 +472,7 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
portal_start_time=self.factory.portal.start_time,
)
evennia.PORTAL_SESSION_HANDLER.at_server_connection()
self.factory.portal.server_restart_mode = None
if self.factory.server_connection:
# this is an indication the server has successfully connected, so
@ -480,7 +492,7 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
)
# set a flag in case we are about to shut down soon
self.factory.server_restart_mode = True
self.factory.server_restart_mode = "shutdown"
elif operation == amp.SCONN: # server_force_connection (for irc/etc)
portal_sessionhandler.server_connect(**kwargs)