test(python): remove temporary fork crash diagnostics

This commit is contained in:
Xuanwo
2026-10-27 02:50:13 +08:00
parent 65159a65d7
commit 69f5561900
3 changed files with 18 additions and 97 deletions
-10
View File
@@ -155,17 +155,7 @@ jobs:
if: ${{ matrix.python-minor-version == '10' }}
run: |
python -m pip install 'torch>=2.0.0' --index-url https://download.pytorch.org/whl/cpu
- name: Upload Linux wheel for diagnostics
if: ${{ matrix.python-minor-version == '10' }}
uses: actions/upload-artifact@v7
with:
name: python-linux-wheel
path: target/wheels/lancedb-*.whl
retention-days: 1
if-no-files-found: error
- uses: ./.github/workflows/run_tests
env:
PYTHONFAULTHANDLER: "1"
with:
integration: true
- name: Test without pylance or pandas
-14
View File
@@ -1,14 +0,0 @@
set pagination off
set debuginfod enabled off
set print frame-arguments none
info threads
thread apply all bt 24
bt 48
info registers rip rsp
info proc mappings
frame 4
disassemble
frame 3
info registers rdi rsi rax rdx rip
x/6i $pc
x/gx $rdi
+18 -73
View File
@@ -2,18 +2,13 @@
# SPDX-FileCopyrightText: Copyright The LanceDB Authors
import contextlib
import faulthandler
import functools
import http.server
import json
import multiprocessing as mp
import os
import pickle
import signal
import sys
import threading
import time
from pathlib import Path
import lancedb
import pyarrow as pa
@@ -319,64 +314,7 @@ def test_permutation_with_builder_is_picklable(tmp_db):
assert restored.__getitems__(indices) == expected
def _fork_dataloader_diagnostics(worker_id=None):
if worker_id is None:
os.setsid()
print(
f"DataLoader pid={os.getpid()} worker={worker_id}", file=sys.stderr, flush=True
)
faulthandler.disable()
faulthandler.enable(all_threads=True)
faulthandler.register(signal.SIGUSR1, all_threads=True, chain=False)
if worker_id is not None and (core_root := os.environ.get("PR3851_CORE_DIRECTORY")):
core_directory = Path(core_root) / str(os.getpid())
core_directory.mkdir()
os.chdir(core_directory)
def _join_fork_dataloader(proc):
deadline = time.monotonic() + 30
proc.join(timeout=28)
if proc.is_alive():
children = Path(f"/proc/{proc.pid}/task/{proc.pid}/children")
try:
worker_pids = [int(pid) for pid in children.read_text().split()]
except FileNotFoundError:
worker_pids = []
for pid in [*worker_pids, proc.pid]:
print(
f"Requesting DataLoader traceback pid={pid}",
file=sys.stderr,
flush=True,
)
with contextlib.suppress(ProcessLookupError):
os.kill(pid, signal.SIGUSR1)
time.sleep(0.1)
proc.join(timeout=max(0, deadline - time.monotonic()))
def _stop_fork_dataloader(proc):
try:
owns_group = os.getpgid(proc.pid) == proc.pid
except ProcessLookupError:
proc.join()
return
if owns_group:
with contextlib.suppress(ProcessLookupError):
os.killpg(proc.pid, signal.SIGTERM)
else:
proc.terminate()
proc.join(timeout=5)
if owns_group:
with contextlib.suppress(ProcessLookupError):
os.killpg(proc.pid, signal.SIGKILL)
if proc.is_alive():
proc.kill()
proc.join()
def _multiworker_dataloader_target(db_uri: str, result_queue):
_fork_dataloader_diagnostics()
import lancedb
from lancedb.permutation import Permutation
@@ -389,7 +327,6 @@ def _multiworker_dataloader_target(db_uri: str, result_queue):
batch_size=10,
num_workers=2,
multiprocessing_context="fork",
worker_init_fn=_fork_dataloader_diagnostics,
)
count = 0
for batch in dataloader:
@@ -419,7 +356,6 @@ class _LazyPermutationDataset(torch.utils.data.Dataset):
def _lazy_multiworker_dataloader_target(db_uri: str, result_queue):
_fork_dataloader_diagnostics()
table = lancedb.connect(db_uri).open_table("test_table")
dataset = _LazyPermutationDataset(table)
dataloader = torch.utils.data.DataLoader(
@@ -427,7 +363,6 @@ def _lazy_multiworker_dataloader_target(db_uri: str, result_queue):
batch_size=10,
num_workers=2,
multiprocessing_context="fork",
worker_init_fn=_fork_dataloader_diagnostics,
)
count = 0
for batch in dataloader:
@@ -437,7 +372,6 @@ def _lazy_multiworker_dataloader_target(db_uri: str, result_queue):
def _remote_multiworker_dataloader_target(port: int, result_queue):
_fork_dataloader_diagnostics()
import lancedb
from lancedb.permutation import Permutation
@@ -458,7 +392,6 @@ def _remote_multiworker_dataloader_target(port: int, result_queue):
batch_size=10,
num_workers=2,
multiprocessing_context="fork",
worker_init_fn=_fork_dataloader_diagnostics,
)
count = 0
for batch in dataloader:
@@ -492,10 +425,14 @@ def test_permutation_dataloader_fork_workers(tmp_path):
queue = ctx.Queue()
proc = ctx.Process(target=_multiworker_dataloader_target, args=(db_uri, queue))
proc.start()
_join_fork_dataloader(proc)
proc.join(timeout=30)
if proc.is_alive():
_stop_fork_dataloader(proc)
proc.terminate()
proc.join(timeout=5)
if proc.is_alive():
proc.kill()
proc.join()
pytest.fail("Permutation hung when iterated in a fork-based DataLoader worker")
assert proc.exitcode == 0, f"child exited with code {proc.exitcode}"
@@ -528,10 +465,14 @@ def test_lazy_permutation_reopens_inherited_table_in_fork_worker(tmp_path):
args=(db_uri, queue),
)
proc.start()
_join_fork_dataloader(proc)
proc.join(timeout=30)
if proc.is_alive():
_stop_fork_dataloader(proc)
proc.terminate()
proc.join(timeout=5)
if proc.is_alive():
proc.kill()
proc.join()
pytest.fail("Lazy Permutation hung in a fork-based DataLoader worker")
assert proc.exitcode == 0, f"child exited with code {proc.exitcode}"
@@ -561,10 +502,14 @@ def test_remote_permutation_dataloader_fork_workers():
args=(port, queue),
)
proc.start()
_join_fork_dataloader(proc)
proc.join(timeout=30)
if proc.is_alive():
_stop_fork_dataloader(proc)
proc.terminate()
proc.join(timeout=5)
if proc.is_alive():
proc.kill()
proc.join()
pytest.fail(
"Remote permutation hung when iterated in a fork-based "
"DataLoader worker"