@@ -10,6 +10,7 @@ import (
1010 "strconv"
1111 "time"
1212
13+ backoff "github.com/cenkalti/backoff/v4"
1314 log "github.com/sirupsen/logrus"
1415)
1516
@@ -37,38 +38,74 @@ func downloadFile(url string) (string, error) {
3738
3839 filepath := tempFile .Name ()
3940
41+ var (
42+ initialInterval = 500 * time .Millisecond
43+ randomizationFactor = 0.5
44+ multiplier = 2.0
45+ maxInterval = 5 * time .Second
46+ maxElapsedTime = 3 * time .Minute
47+ )
48+
49+ exp := backoff .NewExponentialBackOff ()
50+ exp .InitialInterval = initialInterval
51+ exp .RandomizationFactor = randomizationFactor
52+ exp .Multiplier = multiplier
53+ exp .MaxInterval = maxInterval
54+ exp .MaxElapsedTime = maxElapsedTime
55+
56+ retryCount := 1
57+ var fileReader io.ReadCloser
58+
59+ download := func () error {
60+ resp , err := http .Get (url )
61+ if err != nil {
62+ log .WithFields (log.Fields {
63+ "elapsedTime" : exp .GetElapsedTime (),
64+ "error" : err ,
65+ "path" : filepath ,
66+ "retry" : retryCount ,
67+ "url" : url ,
68+ }).Warn ("Could not download the file" )
69+
70+ retryCount ++
71+
72+ return err
73+ }
74+
75+ log .WithFields (log.Fields {
76+ "elapsedTime" : exp .GetElapsedTime (),
77+ "retries" : retryCount ,
78+ "path" : filepath ,
79+ "url" : url ,
80+ }).Debug ("File downloaded" )
81+
82+ fileReader = resp .Body
83+
84+ return nil
85+ }
86+
4087 log .WithFields (log.Fields {
4188 "url" : url ,
4289 "path" : filepath ,
4390 }).Debug ("Downloading file" )
4491
45- resp , err := http . Get ( url )
92+ err = backoff . Retry ( download , exp )
4693 if err != nil {
47- log .WithFields (log.Fields {
48- "error" : err ,
49- "url" : url ,
50- "path" : filepath ,
51- }).Error ("Error downloading file" )
52- return filepath , err
94+ return "" , err
5395 }
54- defer resp . Body .Close ()
96+ defer fileReader .Close ()
5597
56- _ , err = io .Copy (tempFile , resp . Body )
98+ _ , err = io .Copy (tempFile , fileReader )
5799 if err != nil {
58100 log .WithFields (log.Fields {
59101 "error" : err ,
60102 "url" : url ,
61103 "path" : filepath ,
62- }).Error ("Error writing file" )
104+ }).Error ("Could not write file" )
63105
64106 return filepath , err
65107 }
66108
67- log .WithFields (log.Fields {
68- "url" : url ,
69- "path" : filepath ,
70- }).Debug ("File downloaded" )
71-
72109 return filepath , nil
73110}
74111
0 commit comments