module Datadog::Workers::IntervalLoop

Adds looping behavior to workers, with a sleep interval between each loop.

Constants

BACK_OFF_MAX
BACK_OFF_RATIO
BASE_INTERVAL

Attributes

loop_back_off_max[W]
loop_back_off_ratio[W]
loop_base_interval[W]

Public Class Methods

included(base) click to toggle source
# File lib/ddtrace/workers/loop.rb, line 10
def self.included(base)
  base.send(:prepend, PrependedMethods)
end

Public Instance Methods

loop_back_off!(amount = nil) click to toggle source
# File lib/ddtrace/workers/loop.rb, line 60
def loop_back_off!(amount = nil)
  @loop_wait_time = amount || [loop_wait_time * BACK_OFF_RATIO, BACK_OFF_MAX].min
end
loop_back_off?() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 56
def loop_back_off?
  false
end
loop_back_off_max() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 48
def loop_back_off_max
  @loop_back_off_max ||= BACK_OFF_MAX
end
loop_back_off_ratio() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 44
def loop_back_off_ratio
  @loop_back_off_ratio ||= BACK_OFF_RATIO
end
loop_base_interval() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 40
def loop_base_interval
  @loop_base_interval ||= BASE_INTERVAL
end
loop_wait_time() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 52
def loop_wait_time
  @loop_wait_time ||= loop_base_interval
end
run_loop?() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 35
def run_loop?
  return false unless instance_variable_defined?(:@run_loop)
  @run_loop == true
end
stop_loop() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 21
def stop_loop
  mutex.synchronize do
    return false unless run_loop?
    @run_loop = false
    shutdown.signal
  end

  true
end
work_pending?() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 31
def work_pending?
  run_loop?
end

Protected Instance Methods

mutex() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 71
def mutex
  @mutex ||= Mutex.new
end

Private Instance Methods

perform_loop() { || ... } click to toggle source
# File lib/ddtrace/workers/loop.rb, line 77
def perform_loop
  @run_loop = true

  loop do
    if work_pending?
      # Run the task
      yield

      # Reset the wait interval
      loop_back_off!(loop_base_interval)
    elsif loop_back_off?
      # Back off the wait interval a bit
      loop_back_off!
    end

    # Wait for an interval, unless shutdown has been signaled.
    mutex.synchronize do
      return unless run_loop? || work_pending?
      shutdown.wait(mutex, loop_wait_time) if run_loop?
    end
  end
end
shutdown() click to toggle source
# File lib/ddtrace/workers/loop.rb, line 100
def shutdown
  @shutdown ||= ConditionVariable.new
end