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 |