use a single bucket rather than one per conversion
This commit is contained in:
@@ -122,23 +122,13 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
|
||||
ksuid = Ksuid()
|
||||
conversion_id = str(ksuid)
|
||||
bucket_name = f"oc-{bytes(ksuid).hex()}"
|
||||
upload_key = "input/source.pptx"
|
||||
object_prefix = f"{conversion_id}/"
|
||||
upload_key = f"{object_prefix}input/source.pptx"
|
||||
expires_at = utc_now() + timedelta(seconds=self._config.s3_session_ttl_seconds)
|
||||
|
||||
try:
|
||||
self._store.ensure_bucket(bucket_name)
|
||||
except S3Error as exc:
|
||||
log_s3_error(
|
||||
"ensure_bucket",
|
||||
endpoint=self._config.s3_endpoint,
|
||||
secure=self._config.s3_secure,
|
||||
exc=exc,
|
||||
)
|
||||
raise
|
||||
try:
|
||||
upload_url = self._store.presigned_put_url(
|
||||
bucket_name,
|
||||
self._config.s3_bucket,
|
||||
upload_key,
|
||||
ttl_seconds=self._config.s3_session_ttl_seconds,
|
||||
)
|
||||
@@ -159,7 +149,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
full_jpeg_quality=full_jpeg_quality,
|
||||
thumbnail_jpeg_quality=thumbnail_jpeg_quality,
|
||||
notes=request.notes if request.HasField("notes") else None,
|
||||
bucket_name=bucket_name,
|
||||
object_prefix=object_prefix,
|
||||
upload_object_key=upload_key,
|
||||
status=conversion_pb2.CONVERSION_STATUS_PENDING,
|
||||
)
|
||||
@@ -168,7 +158,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
|
||||
return conversion_pb2.CreateConversionResponse(
|
||||
conversion_id=conversion_id,
|
||||
upload_bucket=bucket_name,
|
||||
upload_bucket=self._config.s3_bucket,
|
||||
upload_object_key=upload_key,
|
||||
upload_url=upload_url,
|
||||
expires_at=_to_timestamp(expires_at),
|
||||
@@ -265,7 +255,11 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
if session.conversion_task is not None and not session.conversion_task.done():
|
||||
session.conversion_task.cancel()
|
||||
await self._cleanup_local_artifacts(session)
|
||||
await asyncio.to_thread(self._store.remove_bucket_tree, session.bucket_name)
|
||||
await asyncio.to_thread(
|
||||
self._store.remove_prefix,
|
||||
self._config.s3_bucket,
|
||||
session.object_prefix,
|
||||
)
|
||||
return conversion_pb2.DeleteConversionResponse(
|
||||
conversion_id=session.conversion_id,
|
||||
deleted=True,
|
||||
@@ -295,7 +289,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
try:
|
||||
await asyncio.to_thread(
|
||||
self._store.fget_object,
|
||||
session.bucket_name,
|
||||
self._config.s3_bucket,
|
||||
session.upload_object_key,
|
||||
source_path,
|
||||
)
|
||||
@@ -436,10 +430,12 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
upload_total = slide_total * 2
|
||||
upload_index = 0
|
||||
for slide in slides:
|
||||
object_key = f"output/slide-{slide.index:04d}{slide.image_path.suffix}"
|
||||
self._store.fput_object(session.bucket_name, object_key, slide.image_path)
|
||||
object_key = (
|
||||
f"{session.object_prefix}output/slide-{slide.index:04d}{slide.image_path.suffix}"
|
||||
)
|
||||
self._store.fput_object(self._config.s3_bucket, object_key, slide.image_path)
|
||||
image_url = self._store.presigned_get_url(
|
||||
session.bucket_name,
|
||||
self._config.s3_bucket,
|
||||
object_key,
|
||||
ttl_seconds=self._config.s3_session_ttl_seconds,
|
||||
)
|
||||
@@ -447,15 +443,16 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
if progress_callback is not None:
|
||||
progress_callback(upload_index, upload_total)
|
||||
thumbnail_object_key = (
|
||||
f"output/thumb/slide-{slide.index:04d}{slide.thumbnail_path.suffix}"
|
||||
f"{session.object_prefix}output/thumb/slide-{slide.index:04d}"
|
||||
f"{slide.thumbnail_path.suffix}"
|
||||
)
|
||||
self._store.fput_object(
|
||||
session.bucket_name,
|
||||
self._config.s3_bucket,
|
||||
thumbnail_object_key,
|
||||
slide.thumbnail_path,
|
||||
)
|
||||
thumbnail_image_url = self._store.presigned_get_url(
|
||||
session.bucket_name,
|
||||
self._config.s3_bucket,
|
||||
thumbnail_object_key,
|
||||
ttl_seconds=self._config.s3_session_ttl_seconds,
|
||||
)
|
||||
@@ -515,7 +512,11 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
|
||||
"""Delete storage resources after the configured session retention period."""
|
||||
try:
|
||||
await asyncio.sleep(self._config.conversion_cleanup_delay_seconds)
|
||||
await asyncio.to_thread(self._store.remove_bucket_tree, session.bucket_name)
|
||||
await asyncio.to_thread(
|
||||
self._store.remove_prefix,
|
||||
self._config.s3_bucket,
|
||||
session.object_prefix,
|
||||
)
|
||||
except asyncio.CancelledError:
|
||||
return
|
||||
finally:
|
||||
|
||||
Reference in New Issue
Block a user