Skip to content

Commit 58385ca

Browse files
committed
Backport PR #2342: fix: \ad.settings.override\ order for sharding
1 parent c6c7d8d commit 58385ca

5 files changed

Lines changed: 25 additions & 11 deletions

File tree

docs/release-notes/0.12.4.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
(v0.12.4)=
22
### 0.12.4 {small}`2025-10-27`
33

4-
No significant changes.
4+
#### Bug fixes
5+
6+
- {func}`dask.array.store` was producing corrupted data with zarr v3 + distributed scheduler + a lock (which we used internally): see {issue}`dask/dask#12109`. Thus dense arrays were potentially being stored with corrupted data. The solution is to remove the lock for newer versions of dask but without the lock in older versions, it is impossible to store the data. Thus versions of dask older than `2025.4.0` will not be supported for writing dense data. {user}`ilan-gold`

docs/release-notes/2172.bug.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

docs/release-notes/2342.fix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{attr}`anndata.settings.zarr_write_format` and {attr}`anndata.settings.auto_shard_zarr_v3` can now be set together {user}`ilan-gold`

src/anndata/_settings.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,15 +364,18 @@ def override(self, **overrides):
364364
"""
365365
restore = {a: getattr(self, a) for a in overrides}
366366
try:
367-
# Preserve order so that settings that depend on each other can be overridden together i.e., always override zarr version before sharding
367+
# Preserve order so that settings that depend on each other can be overridden together i.e., always override zarr version before sharding.
368+
# Otherwise an error would be raised setting sharding before zarr version if the zarr version is 2.
368369
for k in self._config:
369370
if k in overrides:
370371
setattr(self, k, overrides.get(k))
371372
yield None
372373
finally:
373-
# TODO: does the order need to be preserved when restoring?
374-
for attr, value in restore.items():
375-
setattr(self, attr, value)
374+
# In the try block, we went in the forward order i.e., zarr version before sharding, but in the reset here, we go in the reverse order i.e., sharding before zarr version.
375+
# Otherwise an error would be raised if we reversed the zarr version first and it was 3 previously.
376+
for k in reversed(self._config.keys()):
377+
if k in restore:
378+
setattr(self, k, restore.get(k))
376379

377380
def __repr__(self) -> str:
378381
params = "".join(f"\t{k}={v!r},\n" for k, v in self._config.items())

tests/test_io_elementwise.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -933,22 +933,31 @@ def test_h5_unchunked(
933933

934934

935935
@pytest.mark.zarr_io
936-
def test_write_auto_sharded(tmp_path: Path):
936+
@pytest.mark.parametrize(
937+
"override",
938+
[
939+
{"auto_shard_zarr_v3": True, "zarr_write_format": 3},
940+
{"zarr_write_format": 3, "auto_shard_zarr_v3": True},
941+
],
942+
ids=["shard_first", "write_format_first"],
943+
)
944+
def test_write_auto_sharded(tmp_path: Path, override: dict):
937945
if is_zarr_v2():
938946
with (
939947
pytest.raises(
940-
ValueError, match=r"Cannot use sharding with `zarr-python<3`."
948+
ValueError,
949+
match=r"Cannot use sharding with `zarr-python<3`.",
941950
),
942-
ad.settings.override(auto_shard_zarr_v3=True),
951+
ad.settings.override(**override),
943952
):
944953
pass
945954
else:
946955
path = tmp_path / "check.zarr"
947956
adata = gen_adata((1000, 100), **GEN_ADATA_NO_XARRAY_ARGS)
948-
with ad.settings.override(auto_shard_zarr_v3=True, zarr_write_format=3):
957+
with ad.settings.override(**override):
949958
adata.write_zarr(path)
950959

951-
check_all_sharded(zarr.open(path))
960+
check_all_sharded(zarr.open(path))
952961

953962

954963
@pytest.mark.zarr_io

0 commit comments

Comments
 (0)