Compare commits

...

5 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
18e78a4d66 Release version 0.40.0 2021-07-12 00:44:33 -04:00
Jose Diaz-Gonzalez
1ed5427043 Merge pull request #177 from jacekn/retry
Add retry on certain network errors
2021-07-12 00:43:19 -04:00
Jose Diaz-Gonzalez
c2e3665ed8 Merge pull request #178 from pew/patch-1
pull changes from remote
2021-07-12 00:43:10 -04:00
Jonas
0a30a92fe4 pull changes from remote
use `git pull` to pull actual files from the remote instead of using `fetch` for only the metadata
2021-07-06 06:21:06 +02:00
Jacek Nykis
cc52587f52 Add retry on certain network errors
This change includes certain network level errors in the retry logic.
It partially address #110 but I think more comprehensive fix would be useful.
2021-07-01 14:39:10 +01:00
2 changed files with 37 additions and 5 deletions

View File

@@ -1 +1 @@
__version__ = '0.39.0'
__version__ = '0.40.0'

View File

@@ -28,6 +28,7 @@ from urllib.request import urlopen
from urllib.request import Request
from urllib.request import HTTPRedirectHandler
from urllib.request import build_opener
from http.client import IncompleteRead
try:
from . import __version__
@@ -436,6 +437,21 @@ def retrieve_data_gen(args, template, query_args=None, single_request=False):
r, errors = _get_response(request, auth, template)
status_code = int(r.getcode())
# Check if we got correct data
try:
response = json.loads(r.read().decode('utf-8'))
except IncompleteRead:
log_warning("Incomplete read error detected")
read_error = True
except json.decoder.JSONDecodeError:
log_warning("JSON decode error detected")
read_error = True
except TimeoutError:
log_warning("Tiemout error detected")
read_error = True
else:
read_error = False
# be gentle with API request limit and throttle requests if remaining requests getting low
limit_remaining = int(r.headers.get('x-ratelimit-remaining', 0))
if args.throttle_limit and limit_remaining <= args.throttle_limit:
@@ -446,21 +462,37 @@ def retrieve_data_gen(args, template, query_args=None, single_request=False):
time.sleep(args.throttle_pause)
retries = 0
while retries < 3 and status_code == 502:
log_warning('API request returned HTTP 502: Bad Gateway. Retrying in 5 seconds')
while retries < 3 and (status_code == 502 or read_error):
log_warning('API request failed. Retrying in 5 seconds')
retries += 1
time.sleep(5)
request = _construct_request(per_page, page, query_args, template, auth, as_app=args.as_app) # noqa
r, errors = _get_response(request, auth, template)
status_code = int(r.getcode())
try:
response = json.loads(r.read().decode('utf-8'))
read_error = False
except IncompleteRead:
log_warning("Incomplete read error detected")
read_error = True
except json.decoder.JSONDecodeError:
log_warning("JSON decode error detected")
read_error = True
except TimeoutError:
log_warning("Tiemout error detected")
read_error = True
if status_code != 200:
template = 'API request returned HTTP {0}: {1}'
errors.append(template.format(status_code, r.reason))
raise Exception(', '.join(errors))
response = json.loads(r.read().decode('utf-8'))
if read_error:
template = 'API request problem reading response for {0}'
errors.append(template.format(request))
raise Exception(', '.join(errors))
if len(errors) == 0:
if type(response) == list:
for resp in response:
@@ -1066,7 +1098,7 @@ def fetch_repository(name,
if lfs_clone:
git_command = ['git', 'lfs', 'fetch', '--all', '--prune']
else:
git_command = ['git', 'fetch', '--all', '--force', '--tags', '--prune']
git_command = ['git', 'pull', '--all', '--force', '--tags', '--prune']
logging_subprocess(git_command, None, cwd=local_dir)
else:
log_info('Cloning {0} repository from {1} to {2}'.format(