You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Clusters: A crash on extract · B HDF encoding gaps · C xarray upstream · D h5py default propagated · E cross-parser inconsistency · F writer-side · G attribute fidelity · H encoding meta.
Cluster details
A. Parser crashes during extraction — local, <20 lines each. HDFParser.fillvalue.item() on bytes (#878 — partial fix in #988), on None for vlen arrays (companion #6), structured dtype crash (companion #5). ZarrParser.get_metadata KeyError for uint8 (#811).
B. _FillValue encoding gaps in HDFParser — _construct_manifest_array skips encode_cf_fill_value for kinds S/U/O/T (hdf.py:98), but docs require base64 for S. Hits #785, #628.
C. xarray FillValueCoder — UPSTREAM.decode has no StringDType/|S*/O branch (→#485, #878), expects base64 for floats (→#989) and S bytes. Spec-compliance test passes; equivalence test fails as BothEnginesFailedIdenticallyError — that's the upstream attribution.
D. h5py default fillvalue propagated indiscriminately — _get_fill_value returns dataset.fillvalue unconditionally; h5py-default "" / 0 lands in zarr metadata. Cascades into vlen-string "corrupt buffer" (companion #2) and #989. Fix: dataset.id.get_create_plist().fill_value_defined().
E. Cross-parser inconsistency — HDF/Zarr/DMR/Kerchunk/NetCDF3 disagree on defaults and metadata for the same source (#287, #352, #982, #904). Architectural — needs a uniform plumbing contract.
F. Writer-side fill semantics — to_kerchunk() NaN in parquet (#339), V2 null fill_value coerced (#478), array padding feature request (#22).
G. Attribute serialization fidelity — non-JSON values break writers (#715), scalar dtype widens across JSON round-trip (companion #4).
H. Encoding model — #68, resolved by totality of A/B/D/E/F/G work.
Completes when: xarray ships. BothEnginesFailedIdenticallyError cases turn green automatically.
Phase 3 — h5py default distinction
Distinguish explicit vs h5py-default at _get_fill_value (hdf.py:38-51) via dataset.id.get_create_plist().fill_value_defined(). Closes #989, half of #878, companion #3.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
Fill-sentinel-values roadmap
Date: 2026-05-11 · Scope: 15
fill-sentinel-valuesissues + companion HDFParser audit.TL;DR
test_zarr_spec_compliance.pyis the primary check.FillValueCoderuses HDF5 base64 on the zarr backend. Tracked at xarray#11332. No PRs needed here for those.Phases
flowchart TD P1["<b>Phase 1</b> — parser fixes<br/><sub>stop the crashes · in progress (#988)</sub>"] P2["<b>Phase 2</b> — xarray upstream<br/><sub>FillValueCoder · no PRs here</sub>"] P3["<b>Phase 3</b> — h5py defaults<br/><sub>distinguish explicit fills</sub>"] P4["<b>Phase 4</b> — cross-parser<br/><sub>port HDF conventions</sub>"] P5["<b>Phase 5</b> — writer<br/><sub>Icechunk, Kerchunk, V2</sub>"] P6["<b>Phase 6</b> — attribute fidelity<br/><sub>JSON policy</sub>"] Meta["<b>#68</b> closed by totality<br/><sub>P1 + P3 + P4 + P5 + P6</sub>"] P1 --> P3 --> P4 P1 -.-> P4 P4 --> Meta P5 --> Meta P6 --> Meta P2 -.parallel, auto-resolves.-> Meta classDef done fill:#FAC775,stroke:#854F0B,color:#412402 classDef upstream fill:#9FE1CB,stroke:#0F6E56,color:#04342C classDef todo fill:#D3D1C7,stroke:#5F5E5A,color:#2C2C2A classDef meta fill:#CECBF6,stroke:#534AB7,color:#26215C class P1 done class P2 upstream class P3,P4,P5,P6 todo class Meta metaNext actions
TypeErrorathdf.py:364(companion Virtual concatenation of arrays with different codecs or dtypes #5)._FillValuebase64 (companion Set up CI #1).fill_value_defined()check).Issues → cluster → phase
from_kerchunk_refs()disagreementto_kerchunk()_FillValueopen failure_FillValueencoding erroruint8KeyErrordtype='<U1'failure_FillValuedroppedfill_value: nulldecodeClusters: A crash on extract · B HDF encoding gaps · C xarray upstream · D h5py default propagated · E cross-parser inconsistency · F writer-side · G attribute fidelity · H encoding meta.
Cluster details
A. Parser crashes during extraction — local, <20 lines each.
HDFParser.fillvalue.item()onbytes(#878 — partial fix in #988), onNonefor vlen arrays (companion #6), structured dtype crash (companion #5).ZarrParser.get_metadataKeyError foruint8(#811).B.
_FillValueencoding gaps in HDFParser —_construct_manifest_arrayskipsencode_cf_fill_valuefor kindsS/U/O/T(hdf.py:98), but docs require base64 forS. Hits #785, #628.C. xarray
FillValueCoder— UPSTREAM.decodehas noStringDType/|S*/Obranch (→#485, #878), expects base64 for floats (→#989) andSbytes. Spec-compliance test passes; equivalence test fails asBothEnginesFailedIdenticallyError— that's the upstream attribution.D. h5py default fillvalue propagated indiscriminately —
_get_fill_valuereturnsdataset.fillvalueunconditionally; h5py-default""/0lands in zarr metadata. Cascades into vlen-string "corrupt buffer" (companion #2) and #989. Fix:dataset.id.get_create_plist().fill_value_defined().E. Cross-parser inconsistency — HDF/Zarr/DMR/Kerchunk/NetCDF3 disagree on defaults and metadata for the same source (#287, #352, #982, #904). Architectural — needs a uniform plumbing contract.
F. Writer-side fill semantics —
to_kerchunk()NaN in parquet (#339), V2 null fill_value coerced (#478), array padding feature request (#22).G. Attribute serialization fidelity — non-JSON values break writers (#715), scalar dtype widens across JSON round-trip (companion #4).
H. Encoding model — #68, resolved by totality of A/B/D/E/F/G work.
Phase 1 — Local parser fixes
_get_fill_value+ StringDType)parsers/hdf/hdf.pyhdf.py:364parsers/zarr/..._FillValuebase64hdf.py:98-100Validation:
TestBasicEquivalencecompound-dtype + S-dtype cases turn green.TestCompoundDtypefully green.Phase 2 — Upstream advocacy (no PRs here)
test_zarr_spec_compliance.pyalready passes for these cases — we're correct, xarray needs to catch up.FillValueCoder.decodeJSON-native scalarsdocs/custom_parsers.mdCompletes when: xarray ships.
BothEnginesFailedIdenticallyErrorcases turn green automatically.Phase 3 — h5py default distinction
Distinguish explicit vs h5py-default at
_get_fill_value(hdf.py:38-51) viadataset.id.get_create_plist().fill_value_defined(). Closes #989, half of #878, companion #3.Validation:
TestBasicEquivalencevlen-string-without-_FillValueturns green.Phase 4 — Cross-parser consistency
docs/custom_parsers.mdValidation: new
test_*_fill_value_equivalence.pyper non-HDF parser.Phase 5 — Writer-side semantics
"NaN"vs nullPhase 6 — Attribute fidelity
Test suite
test_zarr_spec_compliance.pytest_hdf_fill_value_equivalence.pyxarray+h5netcdfinteroptest_zarr_fill_value_equivalence.pyxr.open_zarrinteroptest_kerchunk_fill_value_equivalence.pytest_tiff_fill_value_equivalence.pyGDAL_NODATAtest_icechunk_fill_roundtrip.pytest_kerchunk_writer_fill_roundtrip.pyShared infra in
_fill_value_common.py. Adding a parser = ~150–300 lines (writer helper + open callbacks + strategies + curated examples).Failure attribution → where the fix lives
BothEnginesFailedIdenticallyErrorobserved (virtualizarr) failed; reference succeededreference failed; observed succeededboth engines failed but differentlyNotImplementedErrorguardassert_identicaldiffEach runs at
raw-attributes(CF decoding off) anddecoded-data(CF on).Future test expansions
Module priority: kerchunk (high — #982, #287, #352) → TIFF (medium, preventive) → FITS (low) → DMR (defer, needs mock OPeNDAP).
Within existing modules: multi-dataset HDF, nested groups,
loadable_variables=[...], remote URLs (S3 mock), group-level attributes.Done: both-engines-fail attribution, hypothesis sharding via
@exampleids.References
2026-05-11-hdf5-fill-sentinel-value-fixes.mdtest/hdf5-fill-value-property(commitc93abfa)fix/problem_fillvalues)fill-sentinel-valuesBeta Was this translation helpful? Give feedback.
All reactions