Commit Graph

15 Commits

Author SHA1 Message Date
Alexander 3a6115cbab Add benchmark suite and results
Benchmark harness (benchmarks/run_benchmarks.py):
- Mount time, readdir, stat latency, file open/read, memory usage
- ENOENT lookup (missing file) benchmark per Oracle review
- Uses synthetic FLAC files from test infrastructure

Results: ALL BENCHMARKS BLOCKED BY BUGS
- Bug #2 (directory tree building) crashes mount with any content
- FSNode.adddir() assumes parent dirs exist, fails with KeyError
- Bug #1 (nested methods) would block FUSE ops even if mount worked

beetfs is non-functional for real-world use until both bugs fixed.
2026-05-12 14:44:02 +02:00
Alexander dacd3a7c1f Add benchmark plan for beetfs performance measurement
Covers:
- Mount time scaling (100 to 100K items)
- Metadata operations (stat, readdir throughput)
- File I/O (open latency, read throughput)
- Memory usage (idle, per-file, leak detection)
- Concurrent access (GIL impact)
- Realistic workloads (library scan, album playback)

Tools: fio, mdtest, hyperfine
Baselines: ext4, fuse-passthrough, sshfs

Key bottlenecks identified:
- FileHandler loads entire file into RAM on open
- Mount-time bulk load of all library items
- Python GIL limits parallelism
2026-05-12 14:36:24 +02:00
Alexander f8666ae8c6 Document test findings and fix mount script
Test Results (74 tests):
- 12 passed, 56 failures, 3 errors, 3 skipped

Bugs Detected:
1. Nested methods bug: lines 758-1144 indented inside access()
   - FUSE operations (readdir, open, read, write) unreachable
   - os.listdir() returns ENOSYS (Function not implemented)

2. Directory tree building: KeyError in FSNode.getnode()
   - Mount fails when library contains tracks

3. Unmount not clean: filesystem not releasing properly

Changes:
- Fix conftest.py: inline sanitization (no module-level sanitize fn)
- Add test findings to e2e-test-plan.md
- Add .gitignore for .pyc and test artifacts
2026-05-12 14:29:05 +02:00
Alexander 81df4790bf Add e2e test suite for beetfs
Tests use real FUSE operations against mounted beetfs filesystem:
- test_smoke: mount/unmount lifecycle
- test_nested_bug: detects critical indentation bug (13 failures)
- test_readdir: directory listing
- test_read: metadata overlay verification
- test_stat: file/directory attributes
- test_write: metadata modification
- test_error_handling: ENOENT, EOPNOTSUPP

Also includes:
- conftest.py with BeetFSTestCase base class and synthetic FLAC generator
- e2e-test-plan.md with Oracle-reviewed test strategy
- flake.nix updated with ffmpeg/flac for test fixtures

Run: cd tests && nix develop ../ --command python -m unittest discover
2026-05-12 14:02:55 +02:00
Alexander c18e15987c Add Nix flake for Python 2.7 development environment
Uses nixpkgs-18.09 which has all required Python 2 packages:
- fuse-python 0.2.1
- mutagen 1.41.1
- beets 1.4.9 (built from source)
- jellyfish 0.6.1
- munkres 1.0.6

Run 'nix develop' or 'direnv allow' to enter the environment.
2026-05-12 13:18:30 +02:00
Alexander f0a83df190 Add reverse-engineered documentation
- README.md: Overview, core concept diagram, component summary
- architecture.md: System design, initialization flow, memory model
- components.md: Deep dive on all classes and functions
- data-flow.md: Complete read/write operation flows with diagrams
- analysis.md: Performance analysis (latency, memory footprint, I/O)
- drawbacks.md: 27 identified issues and limitations catalog
- modernization.md: Python 3 migration guide with effort estimates
2026-05-12 11:52:48 +02:00
Johannes Baiter 39a9821a07 Make code PEP8-compliant 2013-05-27 14:47:31 +02:00
Johannes Baiter 04b75f6cf7 Add README 2013-05-27 13:34:52 +02:00
Martin Eve 02c04ffaf1 Change InterpolatedFLAC to operate from memory; first working version of write() 2010-07-23 20:04:30 +01:00
Martin Eve 5baa443428 Basic FLAC tags from database 2010-07-23 10:08:18 +01:00
Adrian Sampson 0256547b2c set MP3 header length to 0 for now so MP3 files can be read
This will need to be changed once ID3 interpolation actually works.
2010-07-21 11:19:29 -07:00
Adrian Sampson 6a2df1f1c1 use get_item (in beets HEAD) instead of get_path 2010-07-21 11:18:05 -07:00
Martin Eve 5736929acd FLAC interpolation now works 2010-07-18 14:27:39 +01:00
Martin Eve 04ff5691c8 Remove confusing debug messages 2010-07-18 10:47:05 +01:00
Martin Eve f958700eea Initial commit 2010-07-16 18:39:16 +01:00