Change-Id: Id88d8f9336c1e4b8afc640c9a07bf3e0e0074d14
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5676
Reviewed-by: Anish Swaminathan <anishs@vmware.com>
Tested-by: Anish Swaminathan <anishs@vmware.com>
... | ... |
@@ -4,7 +4,7 @@ |
4 | 4 |
Summary: dnf/yum equivalent using C libs |
5 | 5 |
Name: tdnf |
6 | 6 |
Version: 1.2.3 |
7 |
-Release: 2%{?dist} |
|
7 |
+Release: 3%{?dist} |
|
8 | 8 |
Vendor: VMware, Inc. |
9 | 9 |
Distribution: Photon |
10 | 10 |
License: LGPLv2.1,GPLv2 |
... | ... |
@@ -27,6 +27,7 @@ Source1: cache-updateinfo |
27 | 27 |
Source2: cache-updateinfo.service |
28 | 28 |
Source3: cache-updateinfo.timer |
29 | 29 |
Source4: updateinfo.sh |
30 |
+Patch0: tdnf_add_retry_to_downloads.patch |
|
30 | 31 |
|
31 | 32 |
%description |
32 | 33 |
tdnf is a yum/dnf equivalent |
... | ... |
@@ -50,6 +51,7 @@ Library providing cli libs for tdnf like clients. |
50 | 50 |
|
51 | 51 |
%prep |
52 | 52 |
%setup -q |
53 |
+%patch0 -p1 |
|
53 | 54 |
|
54 | 55 |
%build |
55 | 56 |
sed -i 's/tdnf, 1.2.0/tdnf, 1.2.3/' configure.ac |
... | ... |
@@ -151,6 +153,8 @@ systemctl try-restart tdnf-cache-updateinfo.timer >/dev/null 2>&1 || : |
151 | 151 |
%{_libdir}/libtdnfcli.so.* |
152 | 152 |
|
153 | 153 |
%changelog |
154 |
+* Wed Sep 12 2018 Priyesh Padmavilasom <ppadmavilasom@vmware.com> 1.2.3-3 |
|
155 |
+- retry option for downloads. default retry on download failures to 10 |
|
154 | 156 |
* Fri Apr 27 2018 Xiaolin Li <xiaolinl@vmware.com> 1.2.3-2 |
155 | 157 |
- Requires hawkey >= 2017.1-6 |
156 | 158 |
* Thu Apr 05 2018 Xiaolin Li <xiaolinl@vmware.com> 1.2.3-1 |
157 | 159 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,196 @@ |
0 |
+From cd08feba10c857f3e1a097968578b7df1a0a3aff Mon Sep 17 00:00:00 2001 |
|
1 |
+From: Priyesh Padmavilasom <ppadmavilasom@vmware.com> |
|
2 |
+Date: Mon, 10 Sep 2018 15:33:23 +0000 |
|
3 |
+Subject: [PATCH] add retry for downloads |
|
4 |
+ |
|
5 |
+Change-Id: I911bad2dbf90c30fe158e756a38316bcc6ae1db6 |
|
6 |
+--- |
|
7 |
+ |
|
8 |
+diff --git a/client/prototypes.h b/client/prototypes.h |
|
9 |
+index c6d09ed..489bc3e 100644 |
|
10 |
+--- a/client/prototypes.h |
|
11 |
+@@ -791,6 +791,12 @@ |
|
12 |
+ |
|
13 |
+ //utils.c |
|
14 |
+ uint32_t |
|
15 |
++TDNFGetOptValue( |
|
16 |
++ PTDNF pTdnf, |
|
17 |
++ const char *pszKey, |
|
18 |
++ char **ppszValue |
|
19 |
++ ); |
|
20 |
++uint32_t |
|
21 |
+ TDNFIsSystemError( |
|
22 |
+ uint32_t dwError |
|
23 |
+ ); |
|
24 |
+diff --git a/client/remoterepo.c b/client/remoterepo.c |
|
25 |
+index d5bccf0..94d5e33 100644 |
|
26 |
+--- a/client/remoterepo.c |
|
27 |
+@@ -85,8 +85,9 @@ |
|
28 |
+ goto cleanup; |
|
29 |
+ } |
|
30 |
+ |
|
31 |
++static |
|
32 |
+ uint32_t |
|
33 |
+-TDNFDownloadFile( |
|
34 |
++_TDNFDownloadFile( |
|
35 |
+ PTDNF pTdnf, |
|
36 |
+ const char *pszRepo, |
|
37 |
+ const char *pszFileUrl, |
|
38 |
+@@ -209,6 +210,57 @@ |
|
39 |
+ } |
|
40 |
+ |
|
41 |
+ uint32_t |
|
42 |
++TDNFDownloadFile( |
|
43 |
++ PTDNF pTdnf, |
|
44 |
++ const char *pszRepo, |
|
45 |
++ const char *pszFileUrl, |
|
46 |
++ const char *pszFile, |
|
47 |
++ const char *pszProgressData |
|
48 |
++ ) |
|
49 |
++{ |
|
50 |
++ uint32_t dwError = 0; |
|
51 |
++ int nRetriesLeft = 10; |
|
52 |
++ char *pszRetry = NULL; |
|
53 |
++ |
|
54 |
++ if(!pTdnf || |
|
55 |
++ !pTdnf->pArgs || |
|
56 |
++ IsNullOrEmptyString(pszFileUrl) || |
|
57 |
++ IsNullOrEmptyString(pszFile)) |
|
58 |
++ { |
|
59 |
++ dwError = ERROR_TDNF_INVALID_PARAMETER; |
|
60 |
++ BAIL_ON_TDNF_ERROR(dwError); |
|
61 |
++ } |
|
62 |
++ |
|
63 |
++ dwError = TDNFGetOptValue(pTdnf, "retry", &pszRetry); |
|
64 |
++ BAIL_ON_TDNF_ERROR(dwError); |
|
65 |
++ |
|
66 |
++ if (!IsNullOrEmptyString(pszRetry)) |
|
67 |
++ { |
|
68 |
++ nRetriesLeft = atoi(pszRetry); |
|
69 |
++ } |
|
70 |
++ |
|
71 |
++retry: |
|
72 |
++ dwError = _TDNFDownloadFile( |
|
73 |
++ pTdnf, |
|
74 |
++ pszRepo, |
|
75 |
++ pszFileUrl, |
|
76 |
++ pszFile, |
|
77 |
++ pszProgressData); |
|
78 |
++ if (TDNFIsCurlError(dwError) && nRetriesLeft > 0) |
|
79 |
++ { |
|
80 |
++ fprintf(stdout, "Download error: %d. Retrying\n", dwError); |
|
81 |
++ sleep(1); |
|
82 |
++ --nRetriesLeft; |
|
83 |
++ goto retry; |
|
84 |
++ } |
|
85 |
++ BAIL_ON_TDNF_ERROR(dwError); |
|
86 |
++ |
|
87 |
++error: |
|
88 |
++ TDNF_SAFE_FREE_MEMORY(pszRetry); |
|
89 |
++ return dwError; |
|
90 |
++} |
|
91 |
++ |
|
92 |
++uint32_t |
|
93 |
+ TDNFDownloadPackage( |
|
94 |
+ PTDNF pTdnf, |
|
95 |
+ HyPackage hPkg, |
|
96 |
+diff --git a/client/utils.c b/client/utils.c |
|
97 |
+index 8e0d5ec..70d93d7 100644 |
|
98 |
+--- a/client/utils.c |
|
99 |
+@@ -611,3 +611,53 @@ |
|
100 |
+ TDNF_SAFE_FREE_MEMORY(pszPath); |
|
101 |
+ goto cleanup; |
|
102 |
+ } |
|
103 |
++ |
|
104 |
++uint32_t |
|
105 |
++TDNFGetOptValue( |
|
106 |
++ PTDNF pTdnf, |
|
107 |
++ const char *pszKey, |
|
108 |
++ char **ppszValue |
|
109 |
++ ) |
|
110 |
++{ |
|
111 |
++ uint32_t dwError = 0; |
|
112 |
++ char *pszValue = NULL; |
|
113 |
++ PTDNF_CMD_OPT pSetOpt = NULL; |
|
114 |
++ |
|
115 |
++ if (!pTdnf || IsNullOrEmptyString(pszKey) || !ppszValue) |
|
116 |
++ { |
|
117 |
++ dwError = ERROR_TDNF_INVALID_PARAMETER; |
|
118 |
++ BAIL_ON_TDNF_ERROR(dwError); |
|
119 |
++ } |
|
120 |
++ |
|
121 |
++ pSetOpt = pTdnf->pArgs->pSetOpt; |
|
122 |
++ |
|
123 |
++ while(pSetOpt) |
|
124 |
++ { |
|
125 |
++ if(pSetOpt->nType == CMDOPT_KEYVALUE && |
|
126 |
++ !strcasecmp(pSetOpt->pszOptName, pszKey)) |
|
127 |
++ { |
|
128 |
++ dwError = TDNFAllocateString(pSetOpt->pszOptValue, &pszValue); |
|
129 |
++ BAIL_ON_TDNF_ERROR(dwError); |
|
130 |
++ |
|
131 |
++ break; |
|
132 |
++ } |
|
133 |
++ |
|
134 |
++ pSetOpt = pSetOpt->pNext; |
|
135 |
++ } |
|
136 |
++ |
|
137 |
++ if (pszValue) |
|
138 |
++ { |
|
139 |
++ *ppszValue = pszValue; |
|
140 |
++ } |
|
141 |
++ |
|
142 |
++cleanup: |
|
143 |
++ return dwError; |
|
144 |
++ |
|
145 |
++error: |
|
146 |
++ if(ppszValue) |
|
147 |
++ { |
|
148 |
++ *ppszValue = NULL; |
|
149 |
++ } |
|
150 |
++ TDNF_SAFE_FREE_MEMORY(pszValue); |
|
151 |
++ goto cleanup; |
|
152 |
++} |
|
153 |
+diff --git a/tools/cli/defines.h b/tools/cli/defines.h |
|
154 |
+index 58b9f42..05c759d 100644 |
|
155 |
+--- a/tools/cli/defines.h |
|
156 |
+@@ -24,6 +24,7 @@ |
|
157 |
+ |
|
158 |
+ #define ENABLEREPO "enablerepo" |
|
159 |
+ #define DISABLEREPO "disablerepo" |
|
160 |
++#define RETRY "retry" |
|
161 |
+ |
|
162 |
+ #define IsNullOrEmptyString(str) (!(str) || !(*str)) |
|
163 |
+ |
|
164 |
+diff --git a/tools/cli/lib/parseargs.c b/tools/cli/lib/parseargs.c |
|
165 |
+index 2a618fb..40cb73b 100644 |
|
166 |
+--- a/tools/cli/lib/parseargs.c |
|
167 |
+@@ -53,6 +53,7 @@ |
|
168 |
+ {"exclude", required_argument, 0, 0}, //--exclude |
|
169 |
+ {"security", no_argument, 0, 0}, //--security |
|
170 |
+ {"sec-severity", required_argument, 0, 0}, //--sec-severity |
|
171 |
++ {"retry", required_argument, 0, 0}, //--retry |
|
172 |
+ {0, 0, 0, 0} |
|
173 |
+ }; |
|
174 |
+ |
|
175 |
+@@ -347,6 +348,15 @@ |
|
176 |
+ dwError = AddSetOpt(pCmdArgs, optarg); |
|
177 |
+ BAIL_ON_CLI_ERROR(dwError); |
|
178 |
+ } |
|
179 |
++ else if(!strcasecmp(pszName, RETRY)) |
|
180 |
++ { |
|
181 |
++ dwError = AddSetOptWithValues( |
|
182 |
++ pCmdArgs, |
|
183 |
++ CMDOPT_KEYVALUE, |
|
184 |
++ pszName, |
|
185 |
++ optarg); |
|
186 |
++ BAIL_ON_CLI_ERROR(dwError); |
|
187 |
++ } |
|
188 |
+ cleanup: |
|
189 |
+ if(pszCopyArgs) |
|
190 |
+ { |