Class: Rightscale::GogridErrorHandler
Overview
:nodoc:
Constant Summary collapse
- DEFAULT_CLOSE_ON_4XX_PROBABILITY =
0-100 (%)
10- @@reiteration_start_delay =
0.2
- @@reiteration_time =
5- @@close_on_error =
true- @@close_on_4xx_probability =
DEFAULT_CLOSE_ON_4XX_PROBABILITY
Class Method Summary collapse
- .close_on_4xx_probability ⇒ Object
- .close_on_4xx_probability=(close_on_4xx_probability) ⇒ Object
- .close_on_error ⇒ Object
- .close_on_error=(close_on_error) ⇒ Object
- .reiteration_start_delay ⇒ Object
- .reiteration_start_delay=(reiteration_start_delay) ⇒ Object
- .reiteration_time ⇒ Object
- .reiteration_time=(reiteration_time) ⇒ Object
Instance Method Summary collapse
-
#check(request) ⇒ Object
Returns false if.
-
#initialize(gogrid, parser, params = {}) ⇒ GogridErrorHandler
constructor
params: :reiteration_time :errors_list :close_on_error = true | false :close_on_4xx_probability = 1-100.
Constructor Details
#initialize(gogrid, parser, params = {}) ⇒ GogridErrorHandler
params:
:reiteration_time
:errors_list
:close_on_error = true | false
:close_on_4xx_probability = 1-100
412 413 414 415 416 417 418 419 420 421 422 423 |
# File 'lib/gogrid_base.rb', line 412 def initialize(gogrid, parser, params={}) #:nodoc: @gogrid = gogrid @parser = parser @started_at = Time.now @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time) @errors_list = params[:errors_list] || [] @reiteration_delay = @@reiteration_start_delay @retries = 0 # close current HTTP(S) connection on 5xx, errors from list and 4xx errors @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error] @close_on_4xx_probability = params[:close_on_4xx_probability] || @@close_on_4xx_probability end |
Class Method Details
.close_on_4xx_probability ⇒ Object
400 401 402 |
# File 'lib/gogrid_base.rb', line 400 def self.close_on_4xx_probability @@close_on_4xx_probability end |
.close_on_4xx_probability=(close_on_4xx_probability) ⇒ Object
403 404 405 |
# File 'lib/gogrid_base.rb', line 403 def self.close_on_4xx_probability=(close_on_4xx_probability) @@close_on_4xx_probability = close_on_4xx_probability end |
.close_on_error ⇒ Object
392 393 394 |
# File 'lib/gogrid_base.rb', line 392 def self.close_on_error @@close_on_error end |
.close_on_error=(close_on_error) ⇒ Object
395 396 397 |
# File 'lib/gogrid_base.rb', line 395 def self.close_on_error=(close_on_error) @@close_on_error = close_on_error end |
.reiteration_start_delay ⇒ Object
376 377 378 |
# File 'lib/gogrid_base.rb', line 376 def self.reiteration_start_delay @@reiteration_start_delay end |
.reiteration_start_delay=(reiteration_start_delay) ⇒ Object
379 380 381 |
# File 'lib/gogrid_base.rb', line 379 def self.reiteration_start_delay=(reiteration_start_delay) @@reiteration_start_delay = reiteration_start_delay end |
.reiteration_time ⇒ Object
384 385 386 |
# File 'lib/gogrid_base.rb', line 384 def self.reiteration_time @@reiteration_time end |
.reiteration_time=(reiteration_time) ⇒ Object
387 388 389 |
# File 'lib/gogrid_base.rb', line 387 def self.reiteration_time=(reiteration_time) @@reiteration_time = reiteration_time end |
Instance Method Details
#check(request) ⇒ Object
Returns false if
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# File 'lib/gogrid_base.rb', line 426 def check(request) #:nodoc: result = false error_found = false error_match = nil last_errors_text = '' response = @gogrid.last_response # log error request_text_data = "#{request[:server]}:#{request[:port]}#{request[:request].path}" @gogrid.logger.warn("##### #{@gogrid.class.name} returned an error: #{response.code} #{response.message}\n#{response.body} #####") @gogrid.logger.warn("##### #{@gogrid.class.name} request: #{request_text_data} ####") @gogrid.last_errors = [[response.code, "#{response.message} (#{request_text_data})"]] last_errors_text = response. # now - check the error @errors_list.each do |error_to_find| if last_errors_text[/#{error_to_find}/i] error_found = true error_match = error_to_find @gogrid.logger.warn("##### Retry is needed, error pattern match: #{error_to_find} #####") break end end # check the time has gone from the first error come if error_found # Close the connection to the server and recreate a new one. # It may have a chance that one server is a semi-down and reconnection # will help us to connect to the other server if @close_on_error @gogrid.connection.finish "#{self.class.name}: error match to pattern '#{error_match}'" end if (Time.now < @stop_at) @retries += 1 @gogrid.logger.warn("##### Retry ##{@retries} is being performed. Sleeping for #{@reiteration_delay} sec. Whole time: #{Time.now-@started_at} sec ####") sleep @reiteration_delay @reiteration_delay *= 2 # Always make sure that the fp is set to point to the beginning(?) # of the File/IO. TODO: it assumes that offset is 0, which is bad. if(request[:request].body_stream && request[:request].body_stream.respond_to?(:pos)) begin request[:request].body_stream.pos = 0 rescue Exception => e @logger.warn("Retry may fail due to unable to reset the file pointer" + " -- #{self.class.name} : #{e.inspect}") end end result = @gogrid.request_info(request, @parser) else @gogrid.logger.warn("##### Ooops, time is over... ####") end # aha, this is unhandled error: elsif @close_on_error # Is this a 5xx error ? if @gogrid.last_response.code.to_s[/^5\d\d$/] @gogrid.connection.finish "#{self.class.name}: code: #{@gogrid.last_response.code}: '#{@gogrid.last_response.message}'" # Is this a 4xx error ? elsif @gogrid.last_response.code.to_s[/^4\d\d$/] && @close_on_4xx_probability > rand(100) @gogrid.connection.finish "#{self.class.name}: code: #{@gogrid.last_response.code}: '#{@gogrid.last_response.message}', " + "probability: #{@close_on_4xx_probability}%" end end result end |