Skip to content

Commit 7f873b9

Browse files
🐛 Concurrent S3 bucket creation attempt (#8045)
1 parent 0fc43f7 commit 7f873b9

File tree

1 file changed

+26
-10
lines changed
  • services/storage/src/simcore_service_storage/modules

1 file changed

+26
-10
lines changed

services/storage/src/simcore_service_storage/modules/s3.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,42 @@
77
from common_library.json_serialization import json_dumps
88
from fastapi import FastAPI
99
from pydantic import TypeAdapter
10-
from servicelib.logging_utils import log_context
10+
from tenacity import retry, wait_random_exponential
1111
from tenacity.asyncio import AsyncRetrying
1212
from tenacity.before_sleep import before_sleep_log
1313
from tenacity.wait import wait_fixed
1414
from types_aiobotocore_s3.literals import BucketLocationConstraintType
1515

1616
from ..constants import RETRY_WAIT_SECS
17-
from ..core.settings import get_application_settings
17+
from ..core.settings import ApplicationSettings, get_application_settings
1818
from ..exceptions.errors import ConfigurationError
1919

2020
_logger = logging.getLogger(__name__)
2121

2222

23+
@retry(
24+
wait=wait_random_exponential(),
25+
before_sleep=before_sleep_log(_logger, logging.WARNING),
26+
reraise=True,
27+
)
28+
async def _ensure_s3_bucket(
29+
client: SimcoreS3API, settings: ApplicationSettings
30+
) -> None:
31+
assert settings.STORAGE_S3 # nosec
32+
if await client.bucket_exists(bucket=settings.STORAGE_S3.S3_BUCKET_NAME):
33+
_logger.info(
34+
"S3 bucket %s exists already, skipping creation",
35+
settings.STORAGE_S3.S3_BUCKET_NAME,
36+
)
37+
return
38+
await client.create_bucket(
39+
bucket=settings.STORAGE_S3.S3_BUCKET_NAME,
40+
region=TypeAdapter(
41+
BucketLocationConstraintType | Literal["us-east-1"]
42+
).validate_python(settings.STORAGE_S3.S3_REGION),
43+
)
44+
45+
2346
def setup_s3(app: FastAPI) -> None:
2447
async def _on_startup() -> None:
2548
app.state.s3_client = None
@@ -44,14 +67,7 @@ async def _on_startup() -> None:
4467
assert client # nosec
4568
app.state.s3_client = client
4669

47-
with log_context(_logger, logging.DEBUG, msg="setup.s3_bucket.cleanup_ctx"):
48-
assert settings.STORAGE_S3 # nosec
49-
await client.create_bucket(
50-
bucket=settings.STORAGE_S3.S3_BUCKET_NAME,
51-
region=TypeAdapter(
52-
BucketLocationConstraintType | Literal["us-east-1"]
53-
).validate_python(settings.STORAGE_S3.S3_REGION),
54-
)
70+
await _ensure_s3_bucket(client, settings)
5571

5672
async def _on_shutdown() -> None:
5773
if app.state.s3_client:

0 commit comments

Comments
 (0)