fix: read multi-direct-block fractal heaps (root indirect block)
The fractal-heap reader split direct vs indirect block rows using the FRHP "Starting # of Rows in Root Indirect Block" field (a constant, typically 1), mislabeled as starting_row_of_indirect_blocks. For any heap whose data spans more than one direct block — common in libhdf5 files with a large group or many dense attributes — this treated direct blocks as indirect and walked into garbage, failing with InvalidFractalHeapSignature. Derive the split from the heap geometry instead: max_direct_rows = log2(max_direct_block_size / starting_block_size) + 2. Rows below it hold direct blocks; rows at/above hold child indirect blocks. Validated against an h5py-written group with 400 dense attributes (root indirect block, 4 rows, 13 direct blocks): all values now read correctly. Regression fixture covers an 80-attribute multi-block heap. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Binary file not shown.
Reference in New Issue
Block a user