class AppDynamics::NodeIndexPool

Constants

KEEPALIVE
MAX_INDEX

Attributes

config[R]
path[R]

Public Class Methods

new(path, config:) click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 14
def initialize(path, config:)
  @path = path
  @config = config
end

Public Instance Methods

exit() click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 23
def exit
  debug "Exiting index pool; index=#{@index}"
  @thread&.kill
  if @index
    FileUtils.rm_f(path_for_nodeindex(index))
    @index = nil
  end
end
index() click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 19
def index
  @index ||= fetch_index
end

Private Instance Methods

fetch_index() click to toggle source

NOTE: This may be susceptible to race conditions

# File lib/app_dynamics/node_index_pool.rb, line 57
def fetch_index
  index = nil
  FileUtils.mkdir_p(path)
  Lockfile.new(File.expand_path("lock", path)) do
    if (index = next_index(MAX_INDEX))
      touch_index(index)
    else
      raise "Unable to get node index"
    end
  end
  keepalive(index)
  index
end
keepalive(index) click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 47
def keepalive(index)
  @thread = Thread.new do
    loop do
      touch_index(index)
      sleep KEEPALIVE
    end
  end
end
next_index(max) click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 34
def next_index(max)
  (1..max).find do |i|
    file = path_for_nodeindex(i)
    !File.exist?(file) || File.mtime(file) < Time.now - (KEEPALIVE * 2)
  end
end
path_for_nodeindex(index) click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 71
def path_for_nodeindex(index)
  File.expand_path("#{index}.nodeindex", path)
end
touch_index(index) click to toggle source
# File lib/app_dynamics/node_index_pool.rb, line 41
def touch_index(index)
  path = path_for_nodeindex(index)
  debug "Touching #{path}"
  FileUtils.touch(path)
end