class SSHKit::Backend::ConnectionPool::Cache

A Cache holds connections for a given key. Each connection is stored along with an expiration time so that its idle duration can be measured.

Attributes

closer[R]
connections[R]
idle_timeout[R]

Public Class Methods

new(idle_timeout, closer) click to toggle source
# File lib/sshkit/backends/connection_pool/cache.rb, line 4
def initialize(idle_timeout, closer)
  @connections = []
  @connections.extend(MonitorMixin)
  @idle_timeout = idle_timeout
  @closer = closer
end

Public Instance Methods

clear() click to toggle source

Close all connections and completely clear the cache.

# File lib/sshkit/backends/connection_pool/cache.rb, line 49
def clear
  connections.synchronize do
    connections.map(&:last).each(&closer)
    connections.clear
  end
end
evict() click to toggle source

Close and remove any connections in this Cache that have been idle for too long.

# File lib/sshkit/backends/connection_pool/cache.rb, line 33
def evict
  # Peek at the first connection to see if it is still fresh. If so, we can
  # return right away without needing to use `synchronize`.
  first_expires_at, _connection = connections.first
  return if first_expires_at.nil? || fresh?(first_expires_at)

  connections.synchronize do
    fresh, stale = connections.partition do |expires_at, _|
      fresh?(expires_at)
    end
    connections.replace(fresh)
    stale.each { |_, conn| closer.call(conn) }
  end
end
pop() click to toggle source

Remove and return a fresh connection from this Cache. Returns `nil` if the Cache is empty or if all existing connections have gone stale.

# File lib/sshkit/backends/connection_pool/cache.rb, line 13
def pop
  connections.synchronize do
    evict
    _, connection = connections.pop
    connection
  end
end
push(conn) click to toggle source

Return a connection to this Cache.

# File lib/sshkit/backends/connection_pool/cache.rb, line 22
def push(conn)
  # No need to cache if the connection has already been closed.
  return if closed?(conn)

  connections.synchronize do
    connections.push([Time.now + idle_timeout, conn])
  end
end

Private Instance Methods

closed?(conn) click to toggle source
# File lib/sshkit/backends/connection_pool/cache.rb, line 66
def closed?(conn)
  conn.respond_to?(:closed?) && conn.closed?
end
fresh?(expires_at) click to toggle source
# File lib/sshkit/backends/connection_pool/cache.rb, line 62
def fresh?(expires_at)
  expires_at > Time.now
end