Skip to content

Commit 70d1cbd

Browse files
improve: error handling in uploader
1 parent 8c1f9d2 commit 70d1cbd

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ uploader = Uploader(
5353
bucket_name="my-bucket",
5454
)
5555

56-
uploader.upload_files(
56+
uploader.queue_upload(
5757
source=large_list_of_files,
5858
destination=large_list_of_paths,
5959
)
60-
uploader.await_futures()
60+
uploader.await_upload()
6161
uploader.close()
6262
```

fast_s3/uploader.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1+
from enum import Enum
12
from pathlib import Path
2-
from typing import List, Union
3+
from typing import List, Optional, Union
34

5+
from pydantic import BaseModel
46
from s3transfer.futures import TransferFuture
57

68
from .transfer_manager import transfer_manager
79

810

11+
class Status(str, Enum):
12+
done = "done"
13+
error = "error"
14+
15+
16+
class Result(BaseModel):
17+
status: Status
18+
exception: Optional[Exception] = None
19+
20+
class Config:
21+
arbitrary_types_allowed = True
22+
23+
924
class Uploader:
1025
def __init__(
1126
self,
@@ -28,7 +43,7 @@ def __init__(
2843
self.bucket_name = bucket_name
2944
self.futures: List[TransferFuture] = []
3045

31-
def upload_files(
46+
def queue_upload(
3247
self,
3348
source: List[Union[str, bytes]],
3449
destination: List[Union[str, Path]],
@@ -46,10 +61,16 @@ def upload_files(
4661
)
4762
)
4863

49-
def await_futures(self):
64+
def await_upload(self):
65+
results = []
5066
for future in self.futures:
51-
future.result()
67+
try:
68+
future.result()
69+
results.append(Result(status=Status.done))
70+
except Exception as e:
71+
results.append(Result(status=Status.error, exception=e))
5272
self.futures = []
73+
return results
5374

5475
def close(self):
5576
self.transfer_manager.shutdown()

0 commit comments

Comments
 (0)