Skip to content

Commit 25b8846

Browse files
authored
Merge pull request #83 from forky2/rate-limit
Implemented naive backoff algorithm to deal with rate limiting
2 parents a1af1e8 + a33383b commit 25b8846

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

vscoffline/sync.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ def __init__(self, insider, prerelease, version, session):
368368
self.prerelease = prerelease
369369
self.version = version
370370
self.session = session
371+
self.backoff = 1
371372

372373
def get_recommendations(self, destination, totalrecommended):
373374
recommendations = self.search_top_n(totalrecommended)
@@ -517,6 +518,13 @@ def search_release_by_extension_id(self, extensionid):
517518
log.warning(f"search_release_by_extension_id failed {extensionid}")
518519
return False
519520

521+
def backoff_reset(self):
522+
self.backoff = 1
523+
524+
def backoff_sleep(self):
525+
time.sleep(self.backoff)
526+
self.backoff *= 2
527+
520528
def _query_marketplace(self, filtertype, filtervalue, pageNumber=0, pageSize=500, limit=0, sortOrder=vsc.SortOrder.Default, sortBy=vsc.SortBy.NoneOrRelevance, queryFlags=0):
521529
extensions = {}
522530
total = 0
@@ -531,19 +539,26 @@ def _query_marketplace(self, filtertype, filtervalue, pageNumber=0, pageSize=500
531539
query = self._query(filtertype, filtervalue,
532540
pageNumber, pageSize, queryFlags)
533541
result = None
534-
for i in range(10):
535-
if i > 0:
536-
log.info("Retrying pull page %d attempt %d." %
537-
(pageNumber, i+1))
542+
i = 0
543+
while i < 10:
538544
try:
539545
result = self.session.post(vsc.URL_MARKETPLACEQUERY, headers=self._headers(
540546
), json=query, allow_redirects=True, timeout=vsc.TIMEOUT)
541547
if result:
548+
self.backoff_reset()
542549
break
550+
elif result.status_code == 429:
551+
# Server is rate limiting us. Backoff.
552+
self.backoff_sleep()
553+
continue
543554
except requests.exceptions.ProxyError:
544555
log.info("ProxyError: Retrying.")
545556
except requests.exceptions.ReadTimeout:
546557
log.info("ReadTimeout: Retrying.")
558+
i += 1
559+
if i < 10:
560+
log.info("Retrying pull page %d attempt %d." %
561+
(pageNumber, i+1))
547562
if not result:
548563
log.info("Failed 10 attempts to query marketplace. Giving up.")
549564
break

vscoffline/vsc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ def load_json(filepath: Union[str, pathlib.Path]) -> Union[List[Any], Dict[str,
135135
except json.decoder.JSONDecodeError as err:
136136
log.debug(f"JSONDecodeError while processing {filepath.absolute()} \n error: {str(err)}")
137137
return []
138+
except UnicodeDecodeError as err:
139+
log.debug(f"UnicodeDecodeError while processing {filepath.absolute()} \n error: {str(err)}")
140+
return []
138141
return result
139142

140143
@staticmethod

0 commit comments

Comments
 (0)