Skip to content

Commit a60a3c9

Browse files
committed
added warning
1 parent fc8c230 commit a60a3c9

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

packages/aws-library/src/aws_library/s3/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
)
2323

2424
__all__: tuple[str, ...] = (
25-
"CopiedBytesTransferredCallback",
26-
"MultiPartUploadLinks",
2725
"PRESIGNED_LINK_MAX_SIZE",
2826
"S3_MAX_FILE_SIZE",
27+
"CopiedBytesTransferredCallback",
28+
"MultiPartUploadLinks",
2929
"S3AccessError",
3030
"S3BucketInvalidError",
3131
"S3DestinationNotEmptyError",
@@ -37,8 +37,8 @@
3737
"S3RuntimeError",
3838
"S3UploadNotFoundError",
3939
"SimcoreS3API",
40-
"UploadedBytesTransferredCallback",
4140
"UploadID",
41+
"UploadedBytesTransferredCallback",
4242
)
4343

4444
# nopycln: file

packages/aws-library/src/aws_library/s3/_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import functools
44
import logging
55
import urllib.parse
6+
import warnings
67
from collections.abc import AsyncGenerator, Sequence
78
from dataclasses import dataclass, field
89
from pathlib import Path
@@ -11,6 +12,7 @@
1112
import aioboto3
1213
from aiobotocore.session import ClientCreatorContext
1314
from boto3.s3.transfer import TransferConfig
15+
from botocore import __version__ as botocore_version
1416
from botocore import exceptions as botocore_exc
1517
from botocore.client import Config
1618
from models_library.api_schemas_storage.storage_schemas import (
@@ -20,6 +22,7 @@
2022
)
2123
from models_library.basic_types import SHA256Str
2224
from models_library.bytes_iters import BytesIter, DataSize
25+
from packaging import version
2326
from pydantic import AnyUrl, ByteSize, TypeAdapter
2427
from servicelib.bytes_iters import DEFAULT_READ_CHUNK_SIZE, BytesStreamer
2528
from servicelib.logging_utils import log_catch, log_context
@@ -51,6 +54,22 @@
5154
)
5255
from ._utils import compute_num_file_chunks, create_final_prefix
5356

57+
_BOTOCORE_VERSION: Final[version.Version] = version.parse(botocore_version)
58+
_MAX_BOTOCORE_VERSION_COMPATIBLE_WITH_CEPH_S3: Final[version.Version] = version.parse(
59+
"1.36.0"
60+
)
61+
62+
63+
def _check_botocore_version() -> None:
64+
if _BOTOCORE_VERSION >= _MAX_BOTOCORE_VERSION_COMPATIBLE_WITH_CEPH_S3:
65+
warnings.warn(
66+
f"Botocore version {botocore_version} is not supported for file uploads with CEPH S3 until CEPH is updated. "
67+
"Please use a version < 1.36.0. The upload operation will likely fail.",
68+
RuntimeWarning,
69+
stacklevel=2,
70+
)
71+
72+
5473
_logger = logging.getLogger(__name__)
5574

5675
_S3_MAX_CONCURRENCY_DEFAULT: Final[int] = 10
@@ -504,6 +523,9 @@ async def upload_file(
504523
bytes_transfered_cb: UploadedBytesTransferredCallback | None,
505524
) -> None:
506525
"""upload a file using aioboto3 transfer manager (e.g. works >5Gb and creates multiple threads)"""
526+
527+
_check_botocore_version()
528+
507529
upload_options: dict[str, Any] = {
508530
"Bucket": bucket,
509531
"Key": object_key,
@@ -528,6 +550,9 @@ async def copy_object(
528550
object_metadata: S3MetaData | None = None,
529551
) -> None:
530552
"""copy a file in S3 using aioboto3 transfer manager (e.g. works >5Gb and creates multiple threads)"""
553+
554+
_check_botocore_version()
555+
531556
copy_options: dict[str, Any] = {
532557
"CopySource": {"Bucket": bucket, "Key": src_object_key},
533558
"Bucket": bucket,
@@ -634,6 +659,7 @@ async def upload_object_from_file_like(
634659
file_like_reader: FileLikeReader,
635660
) -> None:
636661
"""streams write an object in S3 from an AsyncIterable[bytes]"""
662+
_check_botocore_version()
637663
await self._client.upload_fileobj(file_like_reader, bucket_name, object_key) # type: ignore[arg-type]
638664

639665
@staticmethod

0 commit comments

Comments
 (0)