diff --git a/lib/steem/api.rb b/lib/steem/api.rb index 513b3901e46fcd5562e3189a0863c935d9cf6e75..2a72a31e9901a386b28ee628f4df91a119edd3b3 100644 --- a/lib/steem/api.rb +++ b/lib/steem/api.rb @@ -149,19 +149,6 @@ module Steem @@signatures[url][rpc_method_name] ||= Api::jsonrpc(url).get_signature(method: rpc_method_name).result end - # @private - def raise_error_response(rpc_method_name, rpc_args, response) - raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil? - - error = response.error - - if error.message == 'Invalid Request' - raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}. Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})" - end - - BaseError.build_error(error, rpc_method_name) - end - # @private def respond_to_missing?(m, include_private = false) methods.nil? ? false : methods.include?(m.to_sym) @@ -203,14 +190,6 @@ module Steem response = rpc_client.rpc_execute(@api_name, m, rpc_args) - if defined?(response.error) && !!response.error - if !!response.error.message - raise_error_response rpc_method_name, rpc_args, response - else - raise Steem::ArgumentError, response.error.inspect - end - end - if !!block case response when Hashie::Mash then yield response.result, response.error, response.id diff --git a/lib/steem/rpc/base_client.rb b/lib/steem/rpc/base_client.rb index 8d7387e7a5dcb9f75d8f8c169046e78550b92b6c..d5ae9fd2afd7932b2e44186a0cd3ed47d740b75d 100644 --- a/lib/steem/rpc/base_client.rb +++ b/lib/steem/rpc/base_client.rb @@ -161,6 +161,19 @@ module Steem sleep @backoff end + + # @private + def raise_error_response(rpc_method_name, rpc_args, response) + raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil? + + error = response.error + + if error.message == 'Invalid Request' + raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}. Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})" + end + + BaseError.build_error(error, rpc_method_name) + end end end end diff --git a/lib/steem/rpc/http_client.rb b/lib/steem/rpc/http_client.rb index 0517fa0d460a85a538a3fa70474a69ad5c3d867d..1d153b5d41d1de5c40a3271f8ec528ddc7b35d69 100644 --- a/lib/steem/rpc/http_client.rb +++ b/lib/steem/rpc/http_client.rb @@ -17,7 +17,7 @@ module Steem # # @private TIMEOUT_ERRORS = [Net::OpenTimeout, JSON::ParserError, Net::ReadTimeout, - Errno::EBADF, IOError, Errno::ENETDOWN] + Errno::EBADF, IOError, Errno::ENETDOWN, Steem::RemoteDatabaseLockError] # @private POST_HEADERS = { @@ -108,6 +108,22 @@ module Steem else; response end + [response].flatten.each_with_index do |r, i| + if defined?(r.error) && !!r.error + if !!r.error.message + begin + rpc_method_name = "#{api_name}.#{api_method}" + rpc_args = [request_object].flatten[i] + raise_error_response rpc_method_name, rpc_args, r + rescue *TIMEOUT_ERRORS => e + throw retry_timeout(:tota_cera_pila, e) + end + else + raise Steem::ArgumentError, r.error.inspect + end + end + end + yield_response response, &block when '504' # Gateway Timeout throw retry_timeout(:tota_cera_pila, response.body) diff --git a/lib/steem/stream.rb b/lib/steem/stream.rb index 859082108cdf58b33521c25ce8b1d0e13d96f3d8..1e9b25cf99d56c71eebe7ced0070404e848a4ad9 100644 --- a/lib/steem/stream.rb +++ b/lib/steem/stream.rb @@ -91,6 +91,14 @@ module Steem # @option options [Integer] :until_block_num Ends the stream at the given block number. Default: nil. def transactions(options = {}, &block) blocks(options) do |block, block_num| + if block.nil? + warn "Batch missing block_num: #{block_num}, retrying ..." + + block = block_api.get_block(block_num: block_num) do |result| + result.block + end + end + block.transactions.each_with_index do |transaction, index| trx_id = block.transaction_ids[index] @@ -332,9 +340,8 @@ module Steem end response = account_history_api.get_ops_in_block(*get_ops_in_block_options) - result = response.result - if result.nil? + if response.nil? || (result = response.result).nil? if retries < MAX_RETRY_COUNT warn "Retrying get_ops_in_block on block #{block_num}" unless @no_warn retries = retries + 1 @@ -360,7 +367,8 @@ module Steem retries = retries + 1 redo else - raise TooManyRetriesError, "unable to find virtual operations for block: #{block_num}" + warn "unable to find virtual operations for block: #{block_num}" + # raise TooManyRetriesError, "unable to find virtual operations for block: #{block_num}" end end @@ -374,4 +382,4 @@ module Steem end end end -end \ No newline at end of file +end