class Sequel::ShardedSingleFailoverConnectionPool

Attributes

on_reset[RW]
on_retry[RW]

Public Class Methods

clear_on_reset_callbacks() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 30
def clear_on_reset_callbacks
  @on_reset.clear
end
clear_on_retry_callbacks() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 22
def clear_on_retry_callbacks
  @on_retry.clear
end
new(db, opts = OPTS) click to toggle source
Calls superclass method
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 5
def initialize(db, opts = OPTS)
  super
  @pool_stick_timeout = opts[:pool_stick_timeout] || 15
  @pool_retry_count = opts[:pool_retry_count] || 5
  @failing_over = false
end
register_on_reset_callback(callback) click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 26
def register_on_reset_callback(callback)
  @on_reset << callback
end
register_on_retry_callback(callback) click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 18
def register_on_retry_callback(callback)
  @on_retry << callback
end

Public Instance Methods

failing_over?() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 72
def failing_over?
  !!@failing_over
end
failover!() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 68
def failover!
  @failing_over = true
end
hold(server=:default, &block) click to toggle source

Yields the connection to the supplied block for the given server. This method simulates the ConnectionPool#hold API.

Calls superclass method
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 38
def hold(server=:default, &block)
  reset_retries(:read_only) if failover_timed_out?(server)

  loop do
    begin
      @response = super(server, &block)
      break
    rescue Sequel::DatabaseDisconnectError, Sequel::DatabaseConnectionError => e
      raise if server != :read_only

      increment_retries

      unless self.class.on_retry.empty?
        self.class.on_retry.each { |callback| callback.call(e, self) }
      end

      if @retry_count >= @pool_retry_count
        reset_retries(server)
        raise
      end
    end
  end

  @response
end
pool_type() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 64
def pool_type
  :sharded_single_failover
end
reset_retries(server) click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 76
def reset_retries(server)
  unless self.class.on_reset.empty?
    self.class.on_reset.each { |callback| callback.call(self) }
  end
  probe(server.to_s) { |p| p.unstick }
  disconnect_server(server)
  @conns[server] = nil
  @failing_over = false
  @failed_at = nil
  @retry_count = nil
end

Private Instance Methods

failover_timed_out?(server) click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 90
def failover_timed_out?(server)
  server == :read_only &&
    @failed_at &&
    Time.now.to_i - @failed_at.to_i >= @pool_stick_timeout
end
increment_retries() click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 96
def increment_retries
  failover!
  @retry_count ||= 0
  probe(@retry_count) { |p| p.stick }
  @failed_at ||= Time.now
  @retry_count += 1
end
probe(*args) { |provider| ... } click to toggle source
# File lib/sequel/connection_pool/sharded_single_failover.rb, line 104
def probe(*args)
  p = yield(Sequel::ReplicaFailover::DTraceProvider.provider)
  return unless p.enabled?
  if args.any?
    p.fire(*args)
  else
    p.fire
  end
end