Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/release-notes/0.12.4.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
(v0.12.4)=
### 0.12.4 {small}`2025-10-27`

No significant changes.
#### Bug fixes

- {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`
Comment thread
flying-sheep marked this conversation as resolved.
File renamed without changes.
1 change: 0 additions & 1 deletion docs/release-notes/2172.bug.md

This file was deleted.

1 change: 1 addition & 0 deletions docs/release-notes/2342.fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{attr}`anndata.settings.zarr_write_format` and {attr}`anndata.settings.auto_shard_zarr_v3` can now be set together {user}`ilan-gold`
11 changes: 7 additions & 4 deletions src/anndata/_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,15 +368,18 @@ def override(self, **overrides):
"""
restore = {a: getattr(self, a) for a in overrides}
try:
# Preserve order so that settings that depend on each other can be overridden together i.e., always override zarr version before sharding
# Preserve order so that settings that depend on each other can be overridden together i.e., always override zarr version before sharding.
# Otherwise an error would be raised setting sharding before zarr version if the zarr version is 2.
for k in self._config:
if k in overrides:
setattr(self, k, overrides.get(k))
yield None
finally:
# TODO: does the order need to be preserved when restoring?
for attr, value in restore.items():
setattr(self, attr, value)
# 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.
# Otherwise an error would be raised if we reversed the zarr version first and it was 3 previously.
for k in reversed(self._config.keys()):
Comment thread
flying-sheep marked this conversation as resolved.
if k in restore:
setattr(self, k, restore.get(k))

def __repr__(self) -> str:
params = "".join(f"\t{k}={v!r},\n" for k, v in self._config.items())
Expand Down
12 changes: 10 additions & 2 deletions tests/test_io_elementwise.py
Original file line number Diff line number Diff line change
Expand Up @@ -913,10 +913,18 @@ def test_h5_unchunked(


@pytest.mark.zarr_io
def test_write_auto_sharded(tmp_path: Path):
@pytest.mark.parametrize(
"override",
[
{"auto_shard_zarr_v3": True, "zarr_write_format": 3},
{"zarr_write_format": 3, "auto_shard_zarr_v3": True},
],
ids=["shard_first", "write_format_first"],
)
def test_write_auto_sharded(tmp_path: Path, override: dict):
path = tmp_path / "check.zarr"
adata = gen_adata((1000, 100), **GEN_ADATA_NO_XARRAY_ARGS)
with ad.settings.override(auto_shard_zarr_v3=True, zarr_write_format=3):
with ad.settings.override(**override):
adata.write_zarr(path)

check_all_sharded(zarr.open(path))
Expand Down