From 65ac934fd5d5a312ad3afaf26b7768018dc344a6 Mon Sep 17 00:00:00 2001 From: xianml Date: Wed, 13 Nov 2024 13:14:58 +0800 Subject: [PATCH 1/4] fix: make sure always execute the shutdown logic, even if server received a signal during startup --- uvicorn/server.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uvicorn/server.py b/uvicorn/server.py index cca2e850c..be620d81f 100644 --- a/uvicorn/server.py +++ b/uvicorn/server.py @@ -83,8 +83,9 @@ async def _serve(self, sockets: list[socket.socket] | None = None) -> None: logger.info(message, process_id, extra={"color_message": color_message}) await self.startup(sockets=sockets) - if self.should_exit: - return + # FIX: make sure always execute the shutdown logic, even if server received a signal during startup + # if self.should_exit: + # return await self.main_loop() await self.shutdown(sockets=sockets) From b1993416ba745442302f6f14af9e380d7e114cf7 Mon Sep 17 00:00:00 2001 From: xianml Date: Thu, 21 Nov 2024 22:31:59 +0800 Subject: [PATCH 2/4] fix: test case error --- uvicorn/server.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uvicorn/server.py b/uvicorn/server.py index be620d81f..231b985ee 100644 --- a/uvicorn/server.py +++ b/uvicorn/server.py @@ -264,8 +264,9 @@ async def shutdown(self, sockets: list[socket.socket] | None = None) -> None: logger.info("Shutting down") # Stop accepting new connections. - for server in self.servers: - server.close() + if hasattr(self, "servers") and self.servers: + for server in self.servers: + server.close() for sock in sockets or []: sock.close() # pragma: full coverage From 0f5e8a4143231914dbdf40853a74d819bdfd7f94 Mon Sep 17 00:00:00 2001 From: xianml Date: Thu, 21 Nov 2024 22:49:22 +0800 Subject: [PATCH 3/4] fix: test case --- uvicorn/server.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uvicorn/server.py b/uvicorn/server.py index 231b985ee..30fd6ab7e 100644 --- a/uvicorn/server.py +++ b/uvicorn/server.py @@ -308,8 +308,9 @@ async def _wait_tasks_to_complete(self) -> None: while self.server_state.tasks and not self.force_exit: await asyncio.sleep(0.1) - for server in self.servers: - await server.wait_closed() + if hasattr(self, "servers") and self.servers: + for server in self.servers: + await server.wait_closed() @contextlib.contextmanager def capture_signals(self) -> Generator[None, None, None]: From 4379b59f0102baf7afe93c2f08ab44fb5823c950 Mon Sep 17 00:00:00 2001 From: xianml Date: Fri, 3 Jan 2025 14:41:54 +0800 Subject: [PATCH 4/4] fix: del unused code --- uvicorn/server.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/uvicorn/server.py b/uvicorn/server.py index 30fd6ab7e..6ebfb3252 100644 --- a/uvicorn/server.py +++ b/uvicorn/server.py @@ -84,8 +84,6 @@ async def _serve(self, sockets: list[socket.socket] | None = None) -> None: await self.startup(sockets=sockets) # FIX: make sure always execute the shutdown logic, even if server received a signal during startup - # if self.should_exit: - # return await self.main_loop() await self.shutdown(sockets=sockets)