|
2 | 2 |
|
3 | 3 | All notable changes to this project will be documented in this file. |
4 | 4 |
|
| 5 | +## [0.8.3] - 2026-04-28 |
| 6 | + |
| 7 | +### Fixed |
| 8 | +- **GIL Deadlock in Parallel Modules**: Wrapped all Rayon `par_iter()` calls in |
| 9 | + `py.allow_threads()` across `mfsd.rs`, `uxm.rs`, `extract_motif.rs`, and |
| 10 | + `region_mds.rs`. Previously, `pyo3-log` attempted to acquire the GIL from |
| 11 | + Rayon worker threads while the main thread held it, causing indefinite hangs |
| 12 | + on multi-threaded runs (observed as 16-hour wall time on IRIS HPC). |
| 13 | +- **mFSD Silent Error Swallowing**: Replaced `Err(_) => continue` in BAM record |
| 14 | + iterator with a logged error breaker (max 1000 consecutive errors). Previously, |
| 15 | + corrupt BAM regions could cause infinite silent loops. |
| 16 | +- **FILTER_MAF Substring Match**: Changed `sample_id in tsb` to exact match |
| 17 | + (`sample_id == tsb`) preventing `T01` from matching `T01-XS1`. |
| 18 | +- **FILTER_MAF Comment Lines**: Stripped `#` comment lines from filtered MAF output |
| 19 | + in both multi-sample and single-sample modes. |
| 20 | +- **mFSD 0-Variant Guard**: Added early exit at both Python (`wrapper.py`) and Rust |
| 21 | + layers when MAF has 0 data lines. Produces header-only TSV instead of attempting |
| 22 | + BAM access. |
| 23 | +- **mFSD GC Correction Fallback**: When reference FASTA is unavailable or GC lookup |
| 24 | + fails for a region, GC correction is now skipped (weight=1.0) instead of silently |
| 25 | + using a hardcoded 50% GC. |
| 26 | + |
| 27 | +### Added |
| 28 | +- **mFSD BAM I/O Diagnostics**: Per-variant timing, BAM open/fetch latency logging, |
| 29 | + record counts, and slow-variant warnings (>30s). All diagnostics use structured |
| 30 | + `log` macros (visible with `--verbose`). |
| 31 | +- **mFSD Header Constant**: Extracted 46-column TSV header into `MFSD_HEADER` module |
| 32 | + constant, eliminating duplication between normal output and 0-variant early-exit. |
| 33 | + |
| 34 | +### Changed |
| 35 | +- **Minimum Python**: `requires-python` raised from `>=3.8` to `>=3.10` (Python |
| 36 | + 3.8 and 3.9 are EOL). |
| 37 | +- **Minimum Rust**: Added `rust-version = "1.87"` MSRV to `Cargo.toml`. |
| 38 | +- **Cargo Dependencies**: Updated 81 semver-compatible transitive dependencies |
| 39 | + (rayon 1.11→1.12, anyhow 1.0.100→1.0.102, flate2 1.1.5→1.1.9, etc.). |
| 40 | +- **Diagnostic Logging**: Converted all `eprintln!` breadcrumbs inside parallel |
| 41 | + closures to structured `debug!`/`warn!` macros for proper timestamp/level |
| 42 | + formatting through Python's logging framework. |
| 43 | + |
| 44 | +### Documentation |
| 45 | +- **Developer Guide**: Added "PyO3 + Rayon GIL deadlock" Known Gotcha with correct |
| 46 | + and incorrect code examples. |
| 47 | +- **Developer Guide**: Updated contributing checklist test count (244→357). |
| 48 | + |
| 49 | +### Tests |
| 50 | +- Added `test_mfsd_zero_variants` — verifies 0-variant input produces header-only TSV. |
| 51 | +- Added `test_mfsd_maf_with_comment_lines` — verifies MAFs with `#` comment headers |
| 52 | + are parsed correctly. |
| 53 | +- Total: 357 passed, 4 skipped. |
| 54 | + |
5 | 55 | ## [0.8.2] - 2026-03-26 |
6 | 56 |
|
7 | 57 | ### Fixed |
|
0 commit comments