git: e3bad5f7aa86 - main - fetch(1): process truncated transfer as soft failure
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 24 Jan 2022 04:09:54 UTC
The branch main has been updated by eugen: URL: https://cgit.FreeBSD.org/src/commit/?id=e3bad5f7aa86a0911cf8d28395e7a29395739985 commit e3bad5f7aa86a0911cf8d28395e7a29395739985 Author: Eugene Grosbein <eugen@FreeBSD.org> AuthorDate: 2022-01-24 04:03:42 +0000 Commit: Eugene Grosbein <eugen@FreeBSD.org> CommitDate: 2022-01-24 04:09:37 +0000 fetch(1): process truncated transfer as soft failure Let "fetch -a" resume truncated transfer automatically perform another attempt if it obtained some new data in previous one making progress. This makes it more robust against frequent but transient network failures. For example: => sqlite-src-3370200.zip doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch https://www.sqlite.org/2022/sqlite-src-3370200.zip sqlite-src-3370200.zip 3% of 12 MB 45 kBps 04m24s fetch: sqlite-src-3370200.zip appears to be truncated: 524288/13145234 bytes sqlite-src-3370200.zip 10% of 12 MB 67 kBps 02m56s fetch: sqlite-src-3370200.zip appears to be truncated: 1327104/13145234 bytes sqlite-src-3370200.zip 28% of 12 MB 123 kBps 01m14s fetch: sqlite-src-3370200.zip appears to be truncated: 3735552/13145234 bytes sqlite-src-3370200.zip 54% of 12 MB 253 kBps 24s fetch: sqlite-src-3370200.zip appears to be truncated: 7176192/13145234 bytes sqlite-src-3370200.zip 62% of 12 MB 90 kBps 55s fetch: sqlite-src-3370200.zip appears to be truncated: 8241152/13145234 bytes sqlite-src-3370200.zip 82% of 12 MB 113 kBps 20s fetch: sqlite-src-3370200.zip appears to be truncated: 10862592/13145234 bytes sqlite-src-3370200.zip 12 MB 185 kBps 12s ===> Fetching all distfiles required by sqlite3-3.37.2,1 for building MFC after: 1 month --- usr.bin/fetch/fetch.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c index 22f7a1d2950b..3526e5d6c5c1 100644 --- a/usr.bin/fetch/fetch.c +++ b/usr.bin/fetch/fetch.c @@ -433,11 +433,11 @@ fetch(char *URL, const char *path) struct xferstat xs; FILE *f, *of; size_t size, readcnt, wr; - off_t count; + off_t count, size_prev; char flags[8]; const char *slash; char *tmppath; - int r; + int r, tries; unsigned timeout; char *ptr; @@ -537,6 +537,9 @@ fetch(char *URL, const char *path) goto success; } + tries = 1; +again: + r = 0; /* * If the -r flag was specified, we have to compare the local * and remote files, so we should really do a fetchStat() @@ -553,7 +556,7 @@ fetch(char *URL, const char *path) sb.st_size = -1; if (!o_stdout) { r = stat(path, &sb); - if (r == 0 && r_flag && S_ISREG(sb.st_mode)) { + if (r == 0 && (r_flag || tries > 1) && S_ISREG(sb.st_mode)) { url->offset = sb.st_size; } else if (r == -1 || !S_ISREG(sb.st_mode)) { /* @@ -568,6 +571,7 @@ fetch(char *URL, const char *path) goto failure; } } + size_prev = sb.st_size; /* start the transfer */ if (timeout) @@ -629,7 +633,7 @@ fetch(char *URL, const char *path) of = stdout; } else if (r_flag && sb.st_size != -1) { /* resume mode, local file exists */ - if (!F_flag && us.mtime && sb.st_mtime != us.mtime) { + if (!F_flag && us.mtime && sb.st_mtime != us.mtime && tries == 1) { /* no match! have to refetch */ fclose(f); /* if precious, warn the user and give up */ @@ -717,6 +721,8 @@ fetch(char *URL, const char *path) slash = path; else ++slash; + if(tmppath != NULL) + free(tmppath); asprintf(&tmppath, "%.*s.fetch.XXXXXX.%s", (int)(slash - path), path, slash); if (tmppath != NULL) { @@ -829,6 +835,13 @@ fetch(char *URL, const char *path) if (us.size != -1 && count < us.size) { warnx("%s appears to be truncated: %jd/%jd bytes", path, (intmax_t)count, (intmax_t)us.size); + if(!o_stdout && a_flag && us.size > size_prev) { + fclose(f); + if (w_secs) + sleep(w_secs); + tries++; + goto again; + } goto failure_keep; }