Skip to content

Commit aa46b45

Browse files
authored
fix(store): speed up Store.open by avoiding empty/clear calls unless needed (#2314)
1 parent 8f4ef26 commit aa46b45

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

src/zarr/abc/store.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,10 @@ def __exit__(
6969
async def _open(self) -> None:
7070
if self._is_open:
7171
raise ValueError("store is already open")
72-
if not await self.empty():
73-
if self.mode.update or self.mode.readonly:
74-
pass
75-
elif self.mode.overwrite:
76-
await self.clear()
77-
else:
78-
raise FileExistsError("Store already exists")
72+
if self.mode.str == "w":
73+
await self.clear()
74+
elif self.mode.str == "w-" and not await self.empty():
75+
raise FileExistsError("Store already exists")
7976
self._is_open = True
8077

8178
async def _ensure_open(self) -> None:

src/zarr/testing/store.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ def test_store_mode(self, store: S, store_kwargs: dict[str, Any]) -> None:
7070
with pytest.raises(AttributeError):
7171
store.mode = AccessMode.from_literal("w") # type: ignore[misc]
7272

73+
@pytest.mark.parametrize("mode", ["r", "r+", "a", "w", "w-"])
74+
async def test_store_open_mode(
75+
self, store_kwargs: dict[str, Any], mode: AccessModeLiteral
76+
) -> None:
77+
store_kwargs["mode"] = mode
78+
store = await self.store_cls.open(**store_kwargs)
79+
assert store._is_open
80+
assert store.mode == AccessMode.from_literal(mode)
81+
7382
async def test_not_writable_store_raises(self, store_kwargs: dict[str, Any]) -> None:
7483
kwargs = {**store_kwargs, "mode": "r"}
7584
store = await self.store_cls.open(**kwargs)

tests/v3/test_store/test_zip.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,7 @@ def test_api_integration(self, store: ZipStore) -> None:
100100
async def test_with_mode(self, store: ZipStore) -> None:
101101
with pytest.raises(NotImplementedError, match="new mode"):
102102
await super().test_with_mode(store)
103+
104+
@pytest.mark.parametrize("mode", ["a", "w"])
105+
async def test_store_open_mode(self, store_kwargs: dict[str, Any], mode: str) -> None:
106+
super().test_store_open_mode(store_kwargs, mode)

0 commit comments

Comments
 (0)