diff options
author | Homu <homu@barosl.com> | 2015-11-27 09:34:04 +0900 |
---|---|---|
committer | Homu <homu@barosl.com> | 2015-11-27 09:34:04 +0900 |
commit | e3124ff8de1a802c7e7c21e8be33aa0b68f9ea09 (patch) | |
tree | 18849a60ae17bb87981ab84e386924465307e5f5 | |
parent | acbc5e4717144cc4e9c7b6373402741e00fea4f2 (diff) | |
parent | 32be5d614cd6ef0416219b2b6b9ef3d545b61e8f (diff) | |
download | bundler-e3124ff8de1a802c7e7c21e8be33aa0b68f9ea09.tar.gz |
Auto merge of #4103 - jingweno:master, r=indirect
Retry `Fetcher#specs` with `Bundler::Retry`
As mentioned in https://github.com/heroku/heroku-buildpack-ruby/pull/435, bundler failed at the step of fetching version metadata:
```
Fetching version metadata from https://rubygems.org/Net::HTTPInternalServerError: <?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Error><Code>InternalError</Code><Message>We encountered an internal error.
Please try
again.</Message><RequestId>E7402EA19C5D6803</RequestId><HostId>hzuvaA1JAZX6ST+OL4ARYeAqZ/tgkM2yOjZgBq6Panu10YzWtfNNozOg8N5qR3gxFE/sUfYGP48=</HostId></Error>
```
It turns out the retry logic doesn’t cover fetching source index, gem metadata, version metadata and dependency metadata. A new method `Fetcher#specs_with_retry` is added to wrap `Fetcher#specs` with `Bundler::Retry` which reties when bundler fails in the mentioned cases.
/cc @schneems
-rw-r--r-- | lib/bundler/fetcher.rb | 7 | ||||
-rw-r--r-- | lib/bundler/source/rubygems.rb | 10 |
2 files changed, 12 insertions, 5 deletions
diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb index 465a361762..4ebbe7acf8 100644 --- a/lib/bundler/fetcher.rb +++ b/lib/bundler/fetcher.rb @@ -92,6 +92,13 @@ module Bundler "Your network or your gem server is probably having issues right now." end + # return the specs in the bundler format as an index with retries + def specs_with_retry(gem_names, source) + Bundler::Retry.new("fetcher").attempts do + specs(gem_names, source) + end + end + # return the specs in the bundler format as an index def specs(gem_names, source) old = Bundler.rubygems.sources diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb index 8e3173c666..b42cdc3eef 100644 --- a/lib/bundler/source/rubygems.rb +++ b/lib/bundler/source/rubygems.rb @@ -337,7 +337,7 @@ module Bundler # gather lists from non-api sites index_fetchers.each do |f| Bundler.ui.info "Fetching source index from #{f.uri}" - idx.use f.specs(nil, self) + idx.use f.specs_with_retry(nil, self) end # because ensuring we have all the gems we need involves downloading @@ -350,7 +350,7 @@ module Bundler if allow_api api_fetchers.each do |f| Bundler.ui.info "Fetching gem metadata from #{f.uri}", Bundler.ui.debug? - idx.use f.specs(dependency_names, self) + idx.use f.specs_with_retry(dependency_names, self) Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over end @@ -363,7 +363,7 @@ module Bundler idxcount = idx.size api_fetchers.each do |f| Bundler.ui.info "Fetching version metadata from #{f.uri}", Bundler.ui.debug? - idx.use f.specs(idx.dependency_names, self), true + idx.use f.specs_with_retry(idx.dependency_names, self), true Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over end break if idxcount == idx.size @@ -378,7 +378,7 @@ module Bundler # if there are any cross-site gems we missed, get them now api_fetchers.each do |f| Bundler.ui.info "Fetching dependency metadata from #{f.uri}", Bundler.ui.debug? - idx.use f.specs(unmet, self) + idx.use f.specs_with_retry(unmet, self) Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over end if unmet.any? else @@ -389,7 +389,7 @@ module Bundler unless allow_api api_fetchers.each do |f| Bundler.ui.info "Fetching source index from #{f.uri}" - idx.use f.specs(nil, self) + idx.use f.specs_with_retry(nil, self) end end end |