class Bosh::Director::InstanceReuser

Public Class Methods

new() click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 5
def initialize
  @idle_instances_by_stemcell = {}
  @in_use_instances_by_stemcell = {}
  @mutex = Mutex.new
end

Public Instance Methods

add_in_use_instance(instance, stemcell) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 11
def add_in_use_instance(instance, stemcell)
  raise NilInstanceError if instance.nil?
  canonical_stemcell = canonical(stemcell)
  @mutex.synchronize do
    @in_use_instances_by_stemcell[canonical_stemcell] ||= []
    @in_use_instances_by_stemcell[canonical_stemcell] << instance
  end
end
each() { |instance| ... } click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 80
def each
  all_instances = (@idle_instances_by_stemcell.values + @in_use_instances_by_stemcell.values).flatten
  all_instances.each do |instance|
    yield instance
  end
end
get_instance(stemcell) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 20
def get_instance(stemcell)
  canonical_stemcell = canonical(stemcell)
  @mutex.synchronize do
    return nil if @idle_instances_by_stemcell[canonical_stemcell].nil?
    instance = @idle_instances_by_stemcell[canonical_stemcell].pop
    return nil if instance.nil?
    @in_use_instances_by_stemcell[canonical_stemcell] ||= []
    @in_use_instances_by_stemcell[canonical_stemcell] << instance
    return instance
  end
end
get_num_instances(stemcell) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 62
def get_num_instances(stemcell)
  canonical_stemcell = canonical(stemcell)
  @mutex.synchronize do
    idle_count = @idle_instances_by_stemcell.fetch(canonical_stemcell, []).size
    in_use_count = @in_use_instances_by_stemcell.fetch(canonical_stemcell, []).size
    idle_count + in_use_count
  end
end
release_instance(instance) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 32
def release_instance(instance)
  raise NilInstanceError if instance.nil?
  @mutex.synchronize do
    release_without_lock(instance)
  end
end
remove_idle_instance_not_matching_stemcell(stemcell) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 51
def remove_idle_instance_not_matching_stemcell(stemcell)
  canonical_stemcell = canonical(stemcell)
  @mutex.synchronize do
    @idle_instances_by_stemcell.each do |stemcell, idle_instances|
      if stemcell != canonical_stemcell && !idle_instances.empty?
        return idle_instances.pop
      end
    end
  end
end
remove_instance(instance) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 39
def remove_instance(instance)
  raise NilInstanceError if instance.nil?
  @mutex.synchronize do
    release_without_lock(instance)
    @idle_instances_by_stemcell.each_value do |idle_instances|
      idle_instances.each do |idle_instance|
        idle_instances.delete(idle_instance) if instance == idle_instance
      end
    end
  end
end
total_instance_count() click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 71
def total_instance_count
  @mutex.synchronize do
    sum = 0
    @idle_instances_by_stemcell.values.each{|instances| sum += instances.to_a.count }
    @in_use_instances_by_stemcell.values.each{|instances| sum += instances.to_a.count }
    sum
  end
end

Private Instance Methods

canonical(stemcell) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 101
def canonical(stemcell)
  stemcell.desc
end
release_without_lock(instance) click to toggle source
# File lib/bosh/director/instance_reuser.rb, line 89
def release_without_lock(instance)
  @in_use_instances_by_stemcell.each do |canonical_stemcell, in_use_instances|
    in_use_instances.each do |in_use_instance|
      if instance == in_use_instance
        in_use_instances.delete(in_use_instance)
        @idle_instances_by_stemcell[canonical_stemcell] ||= []
        @idle_instances_by_stemcell[canonical_stemcell] << instance
      end
    end
  end
end