Skip to content

Commit ab40da3

Browse files
authored
Merge pull request #207 from Aiven-Open/joelynch/use-iterable
typing: allow passing Iterable of unknown size to delete_keys
2 parents 808e890 + 7b5b045 commit ab40da3

File tree

4 files changed

+18
-10
lines changed

4 files changed

+18
-10
lines changed

rohmu/object_storage/azure.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from azure.core.exceptions import HttpResponseError, IncompleteReadError, ResourceExistsError
99
from azure.storage.blob import BlobServiceClient, ContentSettings
10+
from collections.abc import Iterable, Sized
1011
from rohmu.common.statsd import StatsdConfig
1112
from rohmu.errors import (
1213
FileNotFoundFromStorageError,
@@ -34,7 +35,7 @@
3435
)
3536
from rohmu.typing import Metadata
3637
from rohmu.util import batched
37-
from typing import Any, BinaryIO, Collection, Iterator, Optional, Tuple, Union
38+
from typing import Any, BinaryIO, Iterator, Optional, Tuple, Union
3839
from typing_extensions import Self
3940

4041
import azure.common
@@ -317,9 +318,12 @@ def delete_key(self, key: str, preserve_trailing_slash: bool = False) -> None:
317318

318319
return result
319320

320-
def delete_keys(self, keys: Collection[str], preserve_trailing_slash: bool = False) -> None:
321+
def delete_keys(self, keys: Iterable[str], preserve_trailing_slash: bool = False) -> None:
321322
container_client = self.get_blob_service_client().get_container_client(container=self.container_name)
322-
self.log.debug("Deleting %i keys", len(keys))
323+
if isinstance(keys, Sized):
324+
self.log.debug("Deleting %i keys", len(keys))
325+
else:
326+
self.log.debug("Deleting keys")
323327
for keys_batch in batched(keys, 256): # 256 is the maximum batch size for Azure
324328
paths_to_delete = []
325329
for key in keys_batch:

rohmu/object_storage/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from __future__ import annotations
77

8+
from collections.abc import Iterable
89
from contextlib import suppress
910
from dataclasses import dataclass, field
1011
from io import BytesIO
@@ -258,7 +259,7 @@ def format_key_from_backend(self, key: str) -> str:
258259
def delete_key(self, key: str, preserve_trailing_slash: bool = False) -> None:
259260
raise NotImplementedError
260261

261-
def delete_keys(self, keys: Collection[str], preserve_trailing_slash: bool = False) -> None:
262+
def delete_keys(self, keys: Iterable[str], preserve_trailing_slash: bool = False) -> None:
262263
"""Delete specified keys"""
263264
for key in keys:
264265
self.delete_key(key, preserve_trailing_slash=preserve_trailing_slash)

rohmu/object_storage/google.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from __future__ import annotations
77

8+
from collections.abc import Sized
89
from contextlib import contextmanager
910
from googleapiclient.discovery import build
1011
from googleapiclient.errors import BatchError, HttpError
@@ -52,7 +53,6 @@
5253
BinaryIO,
5354
Callable,
5455
cast,
55-
Collection,
5656
Iterable,
5757
Iterator,
5858
Optional,
@@ -486,7 +486,7 @@ def delete_key(self, key: str, preserve_trailing_slash: bool = False) -> None:
486486
reporter.report(self.stats)
487487
self.notifier.object_deleted(key)
488488

489-
def delete_keys(self, keys: Collection[str], preserve_trailing_slash: bool = False) -> None:
489+
def delete_keys(self, keys: Iterable[str], preserve_trailing_slash: bool = False) -> None:
490490
retry_deletion_keys: list[str] = []
491491

492492
def _delete_keys_callback(key: str, response: HttpRequest, exception: HttpError | None) -> None:
@@ -500,7 +500,10 @@ def _delete_keys_callback(key: str, response: HttpRequest, exception: HttpError
500500
# Retry outsize of callback to avoid retry multiplication
501501
retry_deletion_keys.append(key)
502502

503-
self.log.debug("Deleting %i keys", len(keys))
503+
if isinstance(keys, Sized):
504+
self.log.debug("Deleting %i keys", len(keys))
505+
else:
506+
self.log.debug("Deleting keys")
504507
reporter = Reporter(StorageOperation.delete_key)
505508
with self._object_client() as object_resource:
506509
for keys_batch in batched(keys, 100): # Docs ask to not batch more than 100 requests

rohmu/object_storage/s3.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
from rohmu.typing import Metadata
4444
from rohmu.util import batched, ProgressStream
4545
from threading import RLock
46-
from typing import Any, BinaryIO, cast, Collection, Iterator, Optional, Tuple, TYPE_CHECKING, Union
46+
from typing import Any, BinaryIO, cast, Iterable, Iterator, Optional, Tuple, TYPE_CHECKING, Union
4747
from typing_extensions import Self
4848

4949
import botocore.client
@@ -344,9 +344,9 @@ def delete_key(self, key: str, preserve_trailing_slash: bool = False) -> None:
344344
self.get_client().delete_object(Bucket=self.bucket_name, Key=path)
345345
self.notifier.object_deleted(key=key)
346346

347-
def delete_keys(self, keys: Collection[str], preserve_trailing_slash: bool = False) -> None:
348-
self.stats.operation(StorageOperation.delete_key, count=len(keys))
347+
def delete_keys(self, keys: Iterable[str], preserve_trailing_slash: bool = False) -> None:
349348
for batch in batched(keys, 1000): # Cannot delete more than 1000 objects at a time
349+
self.stats.operation(StorageOperation.delete_key, count=len(batch))
350350
formatted_keys = [
351351
self.format_key_for_backend(
352352
k,

0 commit comments

Comments
 (0)