68 lines
2.6 KiB
Ruby
68 lines
2.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'google/apis/core/http_command'
|
||
|
|
||
|
raise 'This patch is only tested with google-api-client-ruby v0.50.0' unless Google::Apis::VERSION == "0.50.0"
|
||
|
|
||
|
# The google-api-ruby-client does not have a way to increase or disable
|
||
|
# the maximum allowed time for a request to be retried. By default, it
|
||
|
# is using the Retriable gem's 15-minute timeout, which appears to be
|
||
|
# too low for uploads over 10 GB. This patches the gem with the upstream
|
||
|
# changes:
|
||
|
# https://github.com/googleapis/google-api-ruby-client/pull/8106
|
||
|
module Google
|
||
|
module Apis
|
||
|
module Core
|
||
|
# Command for HTTP request/response.
|
||
|
class HttpCommand
|
||
|
MAX_ELAPSED_TIME = 3600
|
||
|
|
||
|
# Execute the command, retrying as necessary
|
||
|
#
|
||
|
# @param [HTTPClient] client
|
||
|
# HTTP client
|
||
|
# @yield [result, err] Result or error if block supplied
|
||
|
# @return [Object]
|
||
|
# @raise [Google::Apis::ServerError] An error occurred on the server and the request can be retried
|
||
|
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
||
|
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
||
|
def execute(client)
|
||
|
prepare!
|
||
|
opencensus_begin_span
|
||
|
begin
|
||
|
Retriable.retriable tries: options.retries + 1,
|
||
|
max_elapsed_time: MAX_ELAPSED_TIME,
|
||
|
base_interval: 1,
|
||
|
multiplier: 2,
|
||
|
on: RETRIABLE_ERRORS do |try|
|
||
|
# This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
|
||
|
# auth to be re-attempted without having to retry all sorts of other failures like
|
||
|
# NotFound, etc
|
||
|
auth_tries = (try == 1 && authorization_refreshable? ? 2 : 1)
|
||
|
Retriable.retriable tries: auth_tries,
|
||
|
on: [Google::Apis::AuthorizationError, Signet::AuthorizationError, Signet::RemoteServerError, Signet::UnexpectedStatusError],
|
||
|
on_retry: proc { |*| refresh_authorization } do
|
||
|
execute_once(client).tap do |result|
|
||
|
if block_given?
|
||
|
yield result, nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
rescue => e # rubocop:disable Style/RescueStandardError
|
||
|
if block_given?
|
||
|
yield nil, e
|
||
|
else
|
||
|
raise e
|
||
|
end
|
||
|
end
|
||
|
ensure
|
||
|
opencensus_end_span
|
||
|
@http_res = nil
|
||
|
release!
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|