Skip to content

Commit db1dffd

Browse files
assembly: don't create a new assembly when polling rate limit is reached
polling rate limit (ASSEMBLY_STATUS_FETCHING_RATE_LIMIT_REACHED) is different from the classic rate limit (RATE_LIMIT_REACHED) which requires the assembly to be retried.
1 parent a192c2b commit db1dffd

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

transloadit/assembly.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,19 @@ def create(self, wait=False, resumable=True, retries=3):
108108

109109
if wait:
110110
while not self._assembly_finished(response):
111-
sleep(1) # avoid hitting a rate limit
111+
# if a wait period is provided by the API due to polling
112+
# rate limit, we should use that period, otherwise, we
113+
# will fallback to 1 second.
114+
sleep_time = response.data.get("info", {}).get("retryIn", 1)
115+
sleep(sleep_time)
112116
response = self.transloadit.get_assembly(
113117
assembly_url=response.data.get("assembly_ssl_url")
114118
)
115119

116120
if self._rate_limit_reached(response) and retries:
117121
# wait till rate limit is expired
118122
sleep(response.data.get("info", {}).get("retryIn", 1))
119-
self.create(wait, resumable, retries - 1)
123+
return self.create(wait, resumable, retries - 1)
120124

121125
return response
122126

@@ -125,8 +129,10 @@ def _assembly_finished(self, response):
125129
is_aborted = status == "REQUEST_ABORTED"
126130
is_canceled = status == "ASSEMBLY_CANCELED"
127131
is_completed = status == "ASSEMBLY_COMPLETED"
128-
is_failed = response.data.get("error") is not None
129-
return is_aborted or is_canceled or is_completed or is_failed
132+
error = response.data.get("error")
133+
is_failed = error is not None
134+
is_fetch_rate_limit = error == "ASSEMBLY_STATUS_FETCHING_RATE_LIMIT_REACHED"
135+
return is_aborted or is_canceled or is_completed or (is_failed and not is_fetch_rate_limit)
130136

131137
def _rate_limit_reached(self, response):
132138
return response.data.get("error") == "RATE_LIMIT_REACHED"

0 commit comments

Comments
 (0)