diff --git a/python/packages/server/src/officeconvert_server/storage.py b/python/packages/server/src/officeconvert_server/storage.py index 20f1d94..940092c 100644 --- a/python/packages/server/src/officeconvert_server/storage.py +++ b/python/packages/server/src/officeconvert_server/storage.py @@ -39,9 +39,19 @@ class S3Store: ) def ensure_bucket(self, bucket_name: str) -> None: - """Create a bucket if it does not already exist.""" - if not self._client.bucket_exists(bucket_name): + """Create a bucket if it does not already exist. + + Uses CreateBucket only, not HeadBucket. Some S3-compatible stores + (including SeaweedFS) mishandle or over-restrict HeadBucket; the MinIO + client's bucket_exists() maps non-NoSuchBucket errors to failures. + Idempotent create covers the same contract with fewer round trips. + """ + try: self._client.make_bucket(bucket_name) + except S3Error as exc: + if exc.code in ("BucketAlreadyOwnedByYou", "BucketAlreadyExists"): + return + raise def presigned_put_url(self, bucket_name: str, object_key: str, *, ttl_seconds: int) -> str: """Generate a presigned PUT URL for a single object upload."""