mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-27 14:06:14 +00:00
test(python): remove temporary fork crash diagnostics
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user