Skip to content

Commit 7942382

Browse files
committed
Ignore cleanup errors on Windows
1 parent 15a6146 commit 7942382

File tree

4 files changed

+20
-60
lines changed
  • key-value
    • key-value-aio
    • key-value-sync
      • src/key_value/sync/code_gen/stores/rocksdb
      • tests/code_gen/stores

4 files changed

+20
-60
lines changed

key-value/key-value-aio/src/key_value/aio/stores/rocksdb/store.py

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from pathlib import Path
44
from typing import overload
55

6-
from key_value.shared.errors.store import KeyValueStoreError
76
from key_value.shared.utils.compound import compound_key
87
from key_value.shared.utils.managed_entry import ManagedEntry
98
from typing_extensions import override
@@ -21,7 +20,6 @@ class RocksDBStore(BaseContextManagerStore, BaseStore):
2120
"""A RocksDB-based key-value store."""
2221

2322
_db: Rdict
24-
_is_closed: bool
2523

2624
@overload
2725
def __init__(self, *, db: Rdict, default_collection: str | None = None) -> None:
@@ -78,8 +76,6 @@ def __init__(
7876

7977
self._db = Rdict(str(path), options=opts)
8078

81-
self._is_closed = False
82-
8379
super().__init__(
8480
default_collection=default_collection,
8581
client_provided_by_user=client_provided,
@@ -93,19 +89,11 @@ async def _setup(self) -> None:
9389
self._exit_stack.callback(self._close_and_flush)
9490

9591
def _close_and_flush(self) -> None:
96-
if not self._is_closed:
97-
self._db.flush()
98-
self._db.close()
99-
self._is_closed = True
100-
101-
def _fail_on_closed_store(self) -> None:
102-
if self._is_closed:
103-
raise KeyValueStoreError(message="Operation attempted on closed store")
92+
self._db.flush()
93+
self._db.close()
10494

10595
@override
10696
async def _get_managed_entry(self, *, key: str, collection: str) -> ManagedEntry | None:
107-
self._fail_on_closed_store()
108-
10997
combo_key: str = compound_key(collection=collection, key=key)
11098

11199
value: bytes | None = self._db.get(combo_key)
@@ -126,8 +114,6 @@ async def _put_managed_entry(
126114
collection: str,
127115
managed_entry: ManagedEntry,
128116
) -> None:
129-
self._fail_on_closed_store()
130-
131117
combo_key: str = compound_key(collection=collection, key=key)
132118
json_value: str = self._serialization_adapter.dump_json(entry=managed_entry, key=key, collection=collection)
133119

@@ -144,8 +130,6 @@ async def _put_managed_entries(
144130
created_at: datetime,
145131
expires_at: datetime | None,
146132
) -> None:
147-
self._fail_on_closed_store()
148-
149133
if not keys:
150134
return
151135

@@ -159,8 +143,6 @@ async def _put_managed_entries(
159143

160144
@override
161145
async def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
162-
self._fail_on_closed_store()
163-
164146
combo_key: str = compound_key(collection=collection, key=key)
165147

166148
# Check if key exists before deleting, this is only used for tracking deleted count
@@ -172,8 +154,6 @@ async def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
172154

173155
@override
174156
async def _delete_managed_entries(self, *, keys: Sequence[str], collection: str) -> int:
175-
self._fail_on_closed_store()
176-
177157
if not keys:
178158
return 0
179159

@@ -194,10 +174,3 @@ async def _delete_managed_entries(self, *, keys: Sequence[str], collection: str)
194174
self._db.write(batch)
195175

196176
return deleted_count
197-
198-
def __del__(self) -> None:
199-
if not getattr(self, "_client_provided_by_user", False):
200-
try: # noqa: SIM105
201-
self._close_and_flush()
202-
except (AttributeError, Exception): # noqa: S110
203-
pass # Best-effort cleanup during finalization

key-value/key-value-aio/tests/stores/base.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import hashlib
2+
import sys
23
import tempfile
34
from abc import ABC, abstractmethod
45
from collections.abc import AsyncGenerator
@@ -30,7 +31,13 @@ async def eventually_consistent(self) -> None: # noqa: B027
3031

3132
@pytest.fixture
3233
async def per_test_temp_dir(self) -> AsyncGenerator[Path, None]:
33-
with tempfile.TemporaryDirectory() as temp_dir:
34+
# ignore cleanup errors on Windows
35+
if sys.platform == "win32":
36+
ignore_cleanup_errors = True
37+
else:
38+
ignore_cleanup_errors = False
39+
40+
with tempfile.TemporaryDirectory(ignore_cleanup_errors=ignore_cleanup_errors) as temp_dir:
3441
yield Path(temp_dir)
3542

3643
@pytest.fixture

key-value/key-value-sync/src/key_value/sync/code_gen/stores/rocksdb/store.py

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from pathlib import Path
77
from typing import overload
88

9-
from key_value.shared.errors.store import KeyValueStoreError
109
from key_value.shared.utils.compound import compound_key
1110
from key_value.shared.utils.managed_entry import ManagedEntry
1211
from typing_extensions import override
@@ -24,7 +23,6 @@ class RocksDBStore(BaseContextManagerStore, BaseStore):
2423
"""A RocksDB-based key-value store."""
2524

2625
_db: Rdict
27-
_is_closed: bool
2826

2927
@overload
3028
def __init__(self, *, db: Rdict, default_collection: str | None = None) -> None:
@@ -75,8 +73,6 @@ def __init__(self, *, db: Rdict | None = None, path: Path | str | None = None, d
7573

7674
self._db = Rdict(str(path), options=opts)
7775

78-
self._is_closed = False
79-
8076
super().__init__(default_collection=default_collection, client_provided_by_user=client_provided)
8177

8278
@override
@@ -87,19 +83,11 @@ def _setup(self) -> None:
8783
self._exit_stack.callback(self._close_and_flush)
8884

8985
def _close_and_flush(self) -> None:
90-
if not self._is_closed:
91-
self._db.flush()
92-
self._db.close()
93-
self._is_closed = True
94-
95-
def _fail_on_closed_store(self) -> None:
96-
if self._is_closed:
97-
raise KeyValueStoreError(message="Operation attempted on closed store")
86+
self._db.flush()
87+
self._db.close()
9888

9989
@override
10090
def _get_managed_entry(self, *, key: str, collection: str) -> ManagedEntry | None:
101-
self._fail_on_closed_store()
102-
10391
combo_key: str = compound_key(collection=collection, key=key)
10492

10593
value: bytes | None = self._db.get(combo_key)
@@ -114,8 +102,6 @@ def _get_managed_entry(self, *, key: str, collection: str) -> ManagedEntry | Non
114102

115103
@override
116104
def _put_managed_entry(self, *, key: str, collection: str, managed_entry: ManagedEntry) -> None:
117-
self._fail_on_closed_store()
118-
119105
combo_key: str = compound_key(collection=collection, key=key)
120106
json_value: str = self._serialization_adapter.dump_json(entry=managed_entry, key=key, collection=collection)
121107

@@ -132,8 +118,6 @@ def _put_managed_entries(
132118
created_at: datetime,
133119
expires_at: datetime | None,
134120
) -> None:
135-
self._fail_on_closed_store()
136-
137121
if not keys:
138122
return
139123

@@ -147,8 +131,6 @@ def _put_managed_entries(
147131

148132
@override
149133
def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
150-
self._fail_on_closed_store()
151-
152134
combo_key: str = compound_key(collection=collection, key=key)
153135

154136
# Check if key exists before deleting, this is only used for tracking deleted count
@@ -160,8 +142,6 @@ def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
160142

161143
@override
162144
def _delete_managed_entries(self, *, keys: Sequence[str], collection: str) -> int:
163-
self._fail_on_closed_store()
164-
165145
if not keys:
166146
return 0
167147

@@ -182,10 +162,3 @@ def _delete_managed_entries(self, *, keys: Sequence[str], collection: str) -> in
182162
self._db.write(batch)
183163

184164
return deleted_count
185-
186-
def __del__(self) -> None:
187-
if not getattr(self, "_client_provided_by_user", False):
188-
try: # noqa: SIM105
189-
self._close_and_flush()
190-
except (AttributeError, Exception): # noqa: S110
191-
pass # Best-effort cleanup during finalization

key-value/key-value-sync/tests/code_gen/stores/base.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# from the original file 'base.py'
33
# DO NOT CHANGE! Change the original file instead.
44
import hashlib
5+
import sys
56
import tempfile
67
from abc import ABC, abstractmethod
78
from collections.abc import Generator
@@ -27,7 +28,13 @@ def eventually_consistent(self) -> None: # noqa: B027
2728

2829
@pytest.fixture
2930
def per_test_temp_dir(self) -> Generator[Path, None, None]:
30-
with tempfile.TemporaryDirectory() as temp_dir:
31+
# ignore cleanup errors on Windows
32+
if sys.platform == "win32":
33+
ignore_cleanup_errors = True
34+
else:
35+
ignore_cleanup_errors = False
36+
37+
with tempfile.TemporaryDirectory(ignore_cleanup_errors=ignore_cleanup_errors) as temp_dir:
3138
yield Path(temp_dir)
3239

3340
@pytest.fixture

0 commit comments

Comments
 (0)