Sha256: 82deed18a1a44e0d66dd2d6f1505bbe821509da864657e71637e697e3f83249d

Contents?: true

Size: 1.69 KB

Versions: 47

Compression:

Stored size: 1.69 KB

Contents

module Bluepill
  module Triggers
    class Flapping < Bluepill::Trigger
      TRIGGER_STATES = [:starting, :restarting]
      
      PARAMS = [:times, :within, :retry_in]
      
      attr_accessor *PARAMS
      attr_reader :timeline
      
      def initialize(process, options = {})
        options.reverse_merge!(:times => 5, :within => 1, :retry_in => 5)
        
        options.each_pair do |name, val|
          instance_variable_set("@#{name}", val) if PARAMS.include?(name)
        end
        
        @timeline = Util::RotationalArray.new(@times)
        super
      end
      
      def notify(transition)
        if TRIGGER_STATES.include?(transition.to_name)
          self.timeline << Time.now.to_i
          self.check_flapping
        end
      end
      
      def reset!
        @timeline.clear
        super
      end
      
      def check_flapping
        num_occurances = (@timeline.nitems == self.times)
        
        # The process has not flapped if we haven't encountered enough incidents
        return unless num_occurances
        
        # Check if the incident happend within the timeframe
        duration = (@timeline.last - @timeline.first) <= self.within
        
        if duration
          self.logger.info "Flapping detected: retrying in #{self.retry_in} seconds"
          
          self.schedule_event(:start, self.retry_in)
          
          # this happens in the process' thread so we don't have to worry about concurrency issues with this event
          self.dispatch!(:unmonitor)
          
          @timeline.clear
          
          # This will prevent a transition from happening in the process state_machine
          throw :halt
        end
      end
    end
  end
end

Version data entries

47 entries across 47 versions & 8 rubygems

Version Path
mwotton-bluepill-0.0.44 lib/bluepill/triggers/flapping.rb
ra-bluepill-0.0.44 lib/bluepill/triggers/flapping.rb
evented_bluepill-0.0.46 lib/bluepill/triggers/flapping.rb
bluepill-0.0.44 lib/bluepill/triggers/flapping.rb
sumskyi-bluepill-0.0.42.1 lib/bluepill/triggers/flapping.rb
sumskyi-bluepill-0.0.42.0 lib/bluepill/triggers/flapping.rb
bluepill-0.0.43 lib/bluepill/triggers/flapping.rb
bluepill-0.0.42 lib/bluepill/triggers/flapping.rb
bluepill-0.0.40 lib/bluepill/triggers/flapping.rb
dylanvaughn-bluepill-0.0.40 lib/bluepill/triggers/flapping.rb
dylanvaughn-bluepill-0.0.39 lib/bluepill/triggers/flapping.rb
bluepill-0.0.39 lib/bluepill/triggers/flapping.rb
bluepill-0.0.38 lib/bluepill/triggers/flapping.rb
bluepill-0.0.37 lib/bluepill/triggers/flapping.rb
bluepill-0.0.36 lib/bluepill/triggers/flapping.rb
bluepill-0.0.35 lib/bluepill/triggers/flapping.rb
bluepill-0.0.34 lib/bluepill/triggers/flapping.rb
bluepill-0.0.33 lib/bluepill/triggers/flapping.rb
wijet-bluepill-0.0.33 lib/bluepill/triggers/flapping.rb
bluepill-0.0.32 lib/bluepill/triggers/flapping.rb