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
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