Sha256: 97f139c19633b74860e541b4f0cc6dea7448429e96bbad2418d2d4d06dd25fc2

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

require "ebisu_connection/replica"
require "ebisu_connection/greatest_common_divisor"

module EbisuConnection
  class ReplicaGroup
    class AllReplicaHasGoneError < StandardError; end

    def initialize(replica_conf, replica_group)
      @replicas = replica_conf.map do |conf|
        Replica.new(conf, replica_group)
      end

      recalc_roulette
    end

    def sample
      raise AllReplicaHasGoneError if @replicas.empty?
      @replicas[@roulette.sample]
    end

    def recovery_connection?
      dead_replicas = @replicas.select{|s| !s.active? }
      return false if dead_replicas.empty?

      dead_replicas.each do |s|
        s.disconnect!
        @replicas.delete(s)
      end

      raise AllReplicaHasGoneError if @replicas.empty?

      recalc_roulette
      true
    end

    def all_disconnect!
      @reserve_release = nil
      @replicas.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 = @replicas.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

2 entries across 2 versions & 1 rubygems

Version Path
ebisu_connection-2.3.1 lib/ebisu_connection/replica_group.rb
ebisu_connection-2.3.0 lib/ebisu_connection/replica_group.rb