Avoid batch S3 deletes in builder
All checks were successful
build / build (push) Successful in 2s

This commit is contained in:
robert
2026-05-19 13:33:07 -03:00
parent f5bda1ab24
commit 27b0cabc55
2 changed files with 10 additions and 9 deletions

View File

@@ -764,16 +764,15 @@ def _safe_supporting_skill_path(path: str) -> str:
def _delete_workspace_objects(s3: Any, bucket: str, prefix: str) -> None: def _delete_workspace_objects(s3: Any, bucket: str, prefix: str) -> None:
# MinIO rejects boto3's batch DeleteObjects request in this environment
# when Content-MD5 is not present. Per-object deletes avoid that fragile
# API path and are fine for agent source workspaces.
paginator = s3.get_paginator("list_objects_v2") paginator = s3.get_paginator("list_objects_v2")
batch: list[dict[str, str]] = []
for page in paginator.paginate(Bucket=bucket, Prefix=prefix): for page in paginator.paginate(Bucket=bucket, Prefix=prefix):
for obj in page.get("Contents") or (): for obj in page.get("Contents") or ():
batch.append({"Key": obj["Key"]}) key = obj.get("Key")
if len(batch) >= 1000: if key:
s3.delete_objects(Bucket=bucket, Delete={"Objects": batch}) s3.delete_object(Bucket=bucket, Key=key)
batch = []
if batch:
s3.delete_objects(Bucket=bucket, Delete={"Objects": batch})
def _files_from_tarball(bundle: bytes) -> dict[str, bytes]: def _files_from_tarball(bundle: bytes) -> dict[str, bytes]:

View File

@@ -192,9 +192,11 @@ class _FakeS3:
) -> None: ) -> None:
self.objects[Key] = bytes(Body) self.objects[Key] = bytes(Body)
def delete_object(self, *, Bucket: str, Key: str) -> None:
self.objects.pop(Key, None)
def delete_objects(self, *, Bucket: str, Delete: dict[str, object]) -> None: def delete_objects(self, *, Bucket: str, Delete: dict[str, object]) -> None:
for obj in Delete["Objects"]: # type: ignore[index] raise AssertionError("batch DeleteObjects should not be used")
self.objects.pop(obj["Key"], None)
class _FakePaginator: class _FakePaginator: