Skip to content

Commit bcf2f0e

Browse files
authored
Merge pull request #5106 from broadinstitute/fix-panel-app-uk
Handle too many requests in panel app UK loading
2 parents 128b4c0 + 2a7ef5d commit bcf2f0e

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

panelapp/pa_locus_list_api_tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def test_import_all_panels(self):
7171

7272
responses.add(responses.GET, au_panels_p1_url, json=au_panels_p1_json, status=200)
7373
responses.add(responses.GET, au_panels_p2_url, json=au_panels_p2_json, status=200)
74+
responses.add(responses.GET, au_genes_url, status=429)
7475
responses.add(responses.GET, au_genes_url, json=au_genes_json, status=200)
7576
responses.add(responses.GET, uk_panels_p1_url, json=uk_panels_p1_json, status=200)
7677
responses.add(responses.GET, uk_genes_url, json=uk_genes_json, status=200)

panelapp/panelapp_utils.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.db import transaction
55
from django.utils import timezone
66
from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type
7+
from time import sleep
78
from urllib3.exceptions import MaxRetryError
89

910
from panelapp.models import PaLocusList, PaLocusListGene
@@ -17,6 +18,8 @@
1718

1819
REQUEST_TIMEOUT_S = 300
1920

21+
class TooManyRequestsError(Exception):
22+
pass
2023

2124
def import_all_panels(user, panel_app_api_url, label=None):
2225
def _extract_ensembl_id_from_json(raw_gene_json):
@@ -118,12 +121,15 @@ def _get_all_panels(panels_url, all_results):
118121

119122
def _get_all_genes(genes_url: str, results_by_panel_id: dict):
120123
@retry(
121-
retry=retry_if_exception_type(MaxRetryError),
124+
retry=retry_if_exception_type((MaxRetryError, TooManyRequestsError)),
122125
wait=wait_exponential(multiplier=1, min=4, max=10),
123126
stop=stop_after_attempt(5),
124127
)
125128
def _get(url):
126129
resp = requests.get(url, timeout=REQUEST_TIMEOUT_S)
130+
if resp.status_code == 429:
131+
sleep(10)
132+
raise TooManyRequestsError()
127133
return resp.json()
128134

129135
resp_json = _get(genes_url)

0 commit comments

Comments
 (0)