Skip to content

Commit b4bdbd7

Browse files
rustyconoverclaude
andcommitted
Fix Windows CI logging warnings during interpreter shutdown
Guard logging calls in SubprocessTransport.close() and WorkerPool.close() with a _stderr_open() check to prevent ValueError tracebacks when stderr is already closed during Python interpreter shutdown on Windows. Bump version to 0.1.13. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f4cdc53 commit b4bdbd7

3 files changed

Lines changed: 21 additions & 18 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "vgi-rpc"
3-
version = "0.1.12"
3+
version = "0.1.13"
44
description = "Vector Gateway Interface - RPC framework based on Apache Arrow"
55
readme = "README.md"
66
requires-python = ">=3.13"

vgi_rpc/pool.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from vgi_rpc.external import ExternalLocationConfig
2828
from vgi_rpc.log import Message
2929
from vgi_rpc.rpc._client import RpcConnection, StreamSession
30-
from vgi_rpc.rpc._transport import StderrMode, SubprocessTransport
30+
from vgi_rpc.rpc._transport import StderrMode, SubprocessTransport, _stderr_open
3131
from vgi_rpc.shm import ShmSegment
3232
from vgi_rpc.utils import IpcValidation
3333

@@ -325,9 +325,10 @@ def close(self) -> None:
325325
dq.clear()
326326
self._idle.clear()
327327

328-
if active > 0:
328+
if active > 0 and _stderr_open():
329329
_logger.warning("WorkerPool closing with %d active connections", active)
330-
_logger.info("WorkerPool closed: terminated %d idle workers", len(all_idle))
330+
if _stderr_open():
331+
_logger.info("WorkerPool closed: terminated %d idle workers", len(all_idle))
331332

332333
for transport in all_idle:
333334
self._discards += 1

vgi_rpc/rpc/_transport.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
from vgi_rpc.rpc._server import RpcServer
2525

2626

27+
def _stderr_open() -> bool:
28+
"""Return True if stderr is still writable (guards against Windows shutdown)."""
29+
try:
30+
return sys.stderr is not None and not sys.stderr.closed
31+
except ValueError:
32+
return False
33+
34+
2735
# ---------------------------------------------------------------------------
2836
# RpcTransport protocol
2937
# ---------------------------------------------------------------------------
@@ -265,11 +273,8 @@ def close(self) -> None:
265273
"""Close stdin (sends EOF), wait for exit, close stdout."""
266274
if self._closed:
267275
return
268-
try:
269-
if wire_transport_logger.isEnabledFor(logging.DEBUG):
270-
wire_transport_logger.debug("SubprocessTransport closing: pid=%d", self._proc.pid)
271-
except ValueError:
272-
pass # stderr closed during interpreter shutdown (Windows)
276+
if _stderr_open() and wire_transport_logger.isEnabledFor(logging.DEBUG):
277+
wire_transport_logger.debug("SubprocessTransport closing: pid=%d", self._proc.pid)
273278
self._closed = True
274279
if self._proc.stdin:
275280
self._proc.stdin.close()
@@ -281,15 +286,12 @@ def close(self) -> None:
281286
if self._stderr_thread is not None:
282287
self._stderr_thread.join(timeout=5)
283288
self._reader.close()
284-
try:
285-
if wire_transport_logger.isEnabledFor(logging.DEBUG):
286-
wire_transport_logger.debug(
287-
"SubprocessTransport closed: pid=%d, exit_code=%s",
288-
self._proc.pid,
289-
self._proc.returncode,
290-
)
291-
except ValueError:
292-
pass # stderr closed during interpreter shutdown (Windows)
289+
if _stderr_open() and wire_transport_logger.isEnabledFor(logging.DEBUG):
290+
wire_transport_logger.debug(
291+
"SubprocessTransport closed: pid=%d, exit_code=%s",
292+
self._proc.pid,
293+
self._proc.returncode,
294+
)
293295

294296

295297
def serve_stdio(server: RpcServer) -> None:

0 commit comments

Comments
 (0)