use values of 'retries' options correctly

The RE-tries option now specifies exactly that: the maximum number a
failed HTTP request is re-tried. For example a value of 2 will now
correctly stop after 3 attempts: the initial one + 2 re-tries.

The maximum wait-time now also caps at 30min and increases exponentially
for both extractor.request() and downloader.http.download().
This commit is contained in:
Mike Fährmann
2019-06-30 21:27:28 +02:00
parent 6393b47db2
commit f7b5c4c3e7
5 changed files with 16 additions and 15 deletions

View File

@@ -300,7 +300,7 @@ extractor.*.retries
------------------- -------------------
=========== ===== =========== =====
Type ``integer`` Type ``integer``
Default ``5`` Default ``4``
Description Number of times a failed HTTP request is retried before giving up. Description Number of times a failed HTTP request is retried before giving up.
=========== ===== =========== =====

View File

@@ -154,7 +154,7 @@
{ {
"mtime": true, "mtime": true,
"rate": null, "rate": null,
"retries": 5, "retries": 4,
"timeout": 30.0, "timeout": 30.0,
"verify": true "verify": true
}, },
@@ -164,7 +164,7 @@
"format": null, "format": null,
"mtime": true, "mtime": true,
"rate": null, "rate": null,
"retries": 5, "retries": 4,
"timeout": 30.0, "timeout": 30.0,
"verify": true "verify": true
} }

View File

@@ -64,10 +64,10 @@ class HttpDownloader(DownloaderBase):
if tries: if tries:
if response: if response:
response.close() response.close()
self.log.warning("%s (%d/%d)", msg, tries, self.retries) self.log.warning("%s (%s/%s)", msg, tries, self.retries+1)
if tries >= self.retries: if tries > self.retries:
return False return False
time.sleep(tries) time.sleep(min(2 ** (tries-1), 1800))
tries += 1 tries += 1
# check for .part file # check for .part file
@@ -142,6 +142,7 @@ class HttpDownloader(DownloaderBase):
if size and file.tell() < size: if size and file.tell() < size:
msg = "filesize mismatch ({} < {})".format( msg = "filesize mismatch ({} < {})".format(
file.tell(), size) file.tell(), size)
print()
continue continue
# check filename extension # check filename extension

View File

@@ -39,7 +39,7 @@ class Extractor():
self._init_headers() self._init_headers()
self._init_cookies() self._init_cookies()
self._init_proxies() self._init_proxies()
self._retries = self.config("retries", 5) self._retries = self.config("retries", 4)
self._timeout = self.config("timeout", 30) self._timeout = self.config("timeout", 30)
self._verify = self.config("verify", True) self._verify = self.config("verify", True)
@@ -65,9 +65,9 @@ class Extractor():
def request(self, url, method="GET", *, session=None, def request(self, url, method="GET", *, session=None,
encoding=None, expect=(), retries=None, **kwargs): encoding=None, expect=(), retries=None, **kwargs):
tries = 0 tries = 1
retries = retries or self._retries retries = self._retries if retries is None else retries
session = session or self.session session = self.session if session is None else session
kwargs.setdefault("timeout", self._timeout) kwargs.setdefault("timeout", self._timeout)
kwargs.setdefault("verify", self._verify) kwargs.setdefault("verify", self._verify)
@@ -98,11 +98,11 @@ class Extractor():
if code < 500 and code != 429: if code < 500 and code != 429:
break break
tries += 1 self.log.debug("%s (%s/%s)", msg, tries, retries+1)
self.log.debug("%s (%d/%d)", msg, tries, retries) if tries > retries:
if tries >= retries:
break break
time.sleep(2 ** tries) time.sleep(min(2 ** (tries-1), 1800))
tries += 1
raise exception.HttpError(msg) raise exception.HttpError(msg)

View File

@@ -174,7 +174,7 @@ def build_parser():
downloader.add_argument( downloader.add_argument(
"-R", "--retries", "-R", "--retries",
dest="retries", metavar="RETRIES", type=int, action=ConfigAction, dest="retries", metavar="RETRIES", type=int, action=ConfigAction,
help="Number of retries (default: 5)", help="Number of retries (default: 4)",
) )
downloader.add_argument( downloader.add_argument(
"-A", "--abort", "-A", "--abort",