summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJingwen Owen Ou <jingweno@gmail.com>2015-11-11 15:06:52 -0800
committerJingwen Owen Ou <jingweno@gmail.com>2015-11-11 15:09:47 -0800
commit32be5d614cd6ef0416219b2b6b9ef3d545b61e8f (patch)
treede8036528193b5c4870f7168ee22696b392c61b8
parent521dafedcd9183ff6e91622edf548f43e5facbb7 (diff)
downloadbundler-32be5d614cd6ef0416219b2b6b9ef3d545b61e8f.tar.gz
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.
-rw-r--r--lib/bundler/fetcher.rb7
-rw-r--r--lib/bundler/source/rubygems.rb10
2 files changed, 12 insertions, 5 deletions
diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb
index b53d577c23..36d8164f15 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 b91f32acd2..d19b3f271a 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