Sha256: d8150315a018a33e5705b6dc389995af857dc75c6359994a9ce882a457941046

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

require 'ebisu_connection/greatest_common_divisor'
require 'ebisu_connection/slave'

module EbisuConnection
  class SlaveGroup
    class AllSlavesHasGoneError < StandardError; end

    def initialize(slaves_conf, slave_group)
      @slaves = slaves_conf.map do |conf|
        Slave.new(conf, slave_group)
      end

      recalc_roulette
    end

    def sample
      raise AllSlavesHasGoneError if @slaves.empty?
      @slaves[@roulette.sample]
    end

    def remove_connection(connection)
      return unless s = @slaves.detect{|s| s.connection == connection}
      s.disconnect! rescue nil
      @slaves.delete(s)
      raise AllSlavesHasGoneError if @slaves.empty?
      recalc_roulette
      nil
    end

    def all_disconnect!
      @reserve_release = nil
      @slaves.each {|s| s.disconnect!}
    end

    def reserve_release_connection!
      @reserve_release = true
    end

    def reserved_release?
      !!@reserve_release
    end

    private

    def recalc_roulette
      weight_list = @slaves.map {|s| s.weight }

      @roulette = []
      gcd = GreatestCommonDivisor.calc(weight_list)
      weight_list.each_with_index do |w, index|
        weight = w / gcd
        @roulette.concat([index] * weight)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ebisu_connection-1.0.0 lib/ebisu_connection/slave_group.rb
ebisu_connection-0.3.1 lib/ebisu_connection/slave_group.rb
ebisu_connection-0.3.0 lib/ebisu_connection/slave_group.rb