WebHost: fix AutoLauncher restarting rooms due to race condition (#3333)
This commit is contained in:
parent
230a9e620b
commit
663b50b33e
|
@ -80,7 +80,7 @@ def autohost(config: dict):
|
||||||
room.last_activity >= datetime.utcnow() - timedelta(days=3))
|
room.last_activity >= datetime.utcnow() - timedelta(days=3))
|
||||||
for room in rooms:
|
for room in rooms:
|
||||||
# we have to filter twice, as the per-room timeout can't currently be PonyORM transpiled.
|
# we have to filter twice, as the per-room timeout can't currently be PonyORM transpiled.
|
||||||
if room.last_activity >= datetime.utcnow() - timedelta(seconds=room.timeout):
|
if room.last_activity >= datetime.utcnow() - timedelta(seconds=room.timeout + 5):
|
||||||
hosters[room.id.int % len(hosters)].start_room(room.id)
|
hosters[room.id.int % len(hosters)].start_room(room.id)
|
||||||
|
|
||||||
except AlreadyRunningException:
|
except AlreadyRunningException:
|
||||||
|
|
|
@ -21,7 +21,6 @@ import Utils
|
||||||
|
|
||||||
from MultiServer import Context, server, auto_shutdown, ServerCommandProcessor, ClientMessageProcessor, load_server_cert
|
from MultiServer import Context, server, auto_shutdown, ServerCommandProcessor, ClientMessageProcessor, load_server_cert
|
||||||
from Utils import restricted_loads, cache_argsless
|
from Utils import restricted_loads, cache_argsless
|
||||||
from .locker import Locker
|
|
||||||
from .models import Command, GameDataPackage, Room, db
|
from .models import Command, GameDataPackage, Room, db
|
||||||
|
|
||||||
|
|
||||||
|
@ -246,25 +245,24 @@ def run_server_process(name: str, ponyconfig: dict, static_server_data: dict,
|
||||||
ctx.shutdown_task = asyncio.create_task(auto_shutdown(ctx, []))
|
ctx.shutdown_task = asyncio.create_task(auto_shutdown(ctx, []))
|
||||||
await ctx.shutdown_task
|
await ctx.shutdown_task
|
||||||
|
|
||||||
# ensure auto launch is on the same page in regard to room activity.
|
|
||||||
with db_session:
|
|
||||||
room: Room = Room.get(id=ctx.room_id)
|
|
||||||
room.last_activity = datetime.datetime.utcnow() - datetime.timedelta(seconds=room.timeout + 60)
|
|
||||||
|
|
||||||
except (KeyboardInterrupt, SystemExit):
|
except (KeyboardInterrupt, SystemExit):
|
||||||
with db_session:
|
pass
|
||||||
room = Room.get(id=room_id)
|
|
||||||
# ensure the Room does not spin up again on its own, minute of safety buffer
|
|
||||||
room.last_activity = datetime.datetime.utcnow() - datetime.timedelta(minutes=1, seconds=room.timeout)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
with db_session:
|
with db_session:
|
||||||
room = Room.get(id=room_id)
|
room = Room.get(id=room_id)
|
||||||
room.last_port = -1
|
room.last_port = -1
|
||||||
# ensure the Room does not spin up again on its own, minute of safety buffer
|
|
||||||
room.last_activity = datetime.datetime.utcnow() - datetime.timedelta(minutes=1, seconds=room.timeout)
|
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
rooms_shutting_down.put(room_id)
|
try:
|
||||||
|
with (db_session):
|
||||||
|
# ensure the Room does not spin up again on its own, minute of safety buffer
|
||||||
|
room = Room.get(id=room_id)
|
||||||
|
room.last_activity = datetime.datetime.utcnow() - \
|
||||||
|
datetime.timedelta(minutes=1, seconds=room.timeout)
|
||||||
|
logging.info(f"Shutting down room {room_id} on {name}.")
|
||||||
|
finally:
|
||||||
|
await asyncio.sleep(5)
|
||||||
|
rooms_shutting_down.put(room_id)
|
||||||
|
|
||||||
class Starter(threading.Thread):
|
class Starter(threading.Thread):
|
||||||
def run(self):
|
def run(self):
|
||||||
|
|
Loading…
Reference in New Issue