Skip to content

Commit 7838528

Browse files
committed
fix: avoid holding uow during long-running file operations
Signed-off-by: Aleš Kalfas <kalfas.ales@gmail.com>
1 parent e63f29a commit 7838528

1 file changed

Lines changed: 18 additions & 16 deletions

File tree

  • apps/agentstack-server/src/agentstack_server/service_layer/services

apps/agentstack-server/src/agentstack_server/service_layer/services/files.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,19 @@ async def get_content(
185185
async with self._uow() as uow:
186186
# check if the user owns the file
187187
await uow.files.get(file_id=file_id, user_id=user.id, context_id=context_id)
188-
async with self._object_storage.get_file(file_id=file_id) as file:
189-
yield file
188+
189+
async with self._object_storage.get_file(file_id=file_id) as file:
190+
yield file
190191

191192
async def get_extraction(self, *, file_id: UUID, user: User, context_id: UUID | None = None) -> TextExtraction:
192193
async with self._uow() as uow:
193194
return await uow.files.get_extraction_by_file_id(file_id=file_id, user_id=user.id, context_id=context_id)
194195

195196
async def delete(self, *, file_id: UUID, user: User, context_id: UUID | None = None) -> None:
196-
async with self._uow() as uow:
197-
# Collect all file IDs to delete from object storage
198-
file_ids_to_delete = [file_id]
197+
file_ids_to_delete = [file_id]
198+
deleted = False
199199

200+
async with self._uow() as uow:
200201
# Find all extractions for this file and collect their extracted files
201202
try:
202203
extraction = await uow.files.get_extraction_by_file_id(
@@ -209,10 +210,11 @@ async def delete(self, *, file_id: UUID, user: User, context_id: UUID | None = N
209210
pass
210211

211212
# Delete from database first (this will cascade delete extractions and extraction_files)
212-
if await uow.files.delete(file_id=file_id, user_id=user.id, context_id=context_id):
213-
# Then delete all related files from object storage
214-
await self._object_storage.delete_files(file_ids=file_ids_to_delete)
215-
await uow.commit()
213+
deleted = await uow.files.delete(file_id=file_id, user_id=user.id, context_id=context_id)
214+
await uow.commit()
215+
216+
if deleted:
217+
await self._object_storage.delete_files(file_ids=file_ids_to_delete)
216218

217219
async def _cleanup_extracted_files(self, file_ids: list[UUID]) -> None:
218220
"""Best-effort cleanup for partially uploaded extracted files."""
@@ -282,13 +284,13 @@ async def delete_extraction(self, *, file_id: UUID, user: User, context_id: UUID
282284
file_id=file_id, user_id=user.id, context_id=context_id
283285
)
284286

285-
# Delete all extracted files
286-
if extraction.extracted_files:
287-
file_ids_to_delete = [ef.file_id for ef in extraction.extracted_files if ef.file_id != file_id]
288-
if file_ids_to_delete:
289-
await self._object_storage.delete_files(file_ids=file_ids_to_delete)
290-
for fid in file_ids_to_delete:
291-
await uow.files.delete(file_id=fid)
287+
file_ids_to_delete = [ef.file_id for ef in extraction.extracted_files if ef.file_id != file_id]
288+
if file_ids_to_delete:
289+
await self._object_storage.delete_files(file_ids=file_ids_to_delete)
290+
291+
async with self._uow() as uow:
292+
for fid in file_ids_to_delete:
293+
await uow.files.delete(file_id=fid)
292294

293295
await uow.files.delete_extraction(extraction_id=extraction.id)
294296
await uow.commit()

0 commit comments

Comments
 (0)