Sha256: 389818a4ece35ad3eef8d16d68a0c697d0be983d313ba70ed7f555ec43b91082

Contents?: true

Size: 1.53 KB

Versions: 9

Compression:

Stored size: 1.53 KB

Contents

require "thread"

module SSHKit

  module Backend

    class ConnectionPool

      attr_accessor :idle_timeout

      def initialize
        self.idle_timeout = 30
        @mutex = Mutex.new
        @pool = {}
      end

      def checkout(*new_connection_args, &block)
        # Optimization: completely bypass the pool if idle_timeout is zero.
        key = new_connection_args.to_s
        return create_new_entry(new_connection_args, key, &block) if idle_timeout == 0

        find_live_entry(key) || create_new_entry(new_connection_args, key, &block)
      end

      def checkin(entry)
        entry.expires_at = Time.now + idle_timeout if idle_timeout
        @mutex.synchronize do
          @pool[entry.key] ||= []
          @pool[entry.key] << entry
        end
      end

      def flush_connections
        @mutex.synchronize { @pool.clear }
      end

      private

      def find_live_entry(key)
        @mutex.synchronize do
          return nil unless @pool.key?(key)
          while entry = @pool[key].shift
            return entry if entry.live?
          end
        end
        nil
      end

      def create_new_entry(args, key, &block)
        Entry.new block.call(*args), key
      end

      Entry = Struct.new(:connection, :key) do
        attr_accessor :expires_at

        def live?
          !expired? && !closed?
        end

        def expired?
          expires_at && Time.now > expires_at
        end

        def closed?
          connection.respond_to?(:closed?) && connection.closed?
        end
      end

    end
  end
end

Version data entries

9 entries across 7 versions & 3 rubygems

Version Path
honeybadger-2.4.0 vendor/gems/ruby/1.9.1/gems/sshkit-1.5.1/lib/sshkit/backends/connection_pool.rb
honeybadger-2.4.0 vendor/gems/ruby/2.1.0/gems/sshkit-1.5.1/lib/sshkit/backends/connection_pool.rb
honeybadger-2.4.0 vendor/gems/ruby/2.2.0/gems/sshkit-1.5.1/lib/sshkit/backends/connection_pool.rb
sc_core-0.0.7 test/dummy/vendor/bundle/ruby/2.2.0/gems/sshkit-1.7.1/lib/sshkit/backends/connection_pool.rb
sshkit-1.7.1 lib/sshkit/backends/connection_pool.rb
sshkit-1.7.0 lib/sshkit/backends/connection_pool.rb
sshkit-1.6.1 lib/sshkit/backends/connection_pool.rb
sshkit-1.5.1 lib/sshkit/backends/connection_pool.rb
sshkit-1.5.0 lib/sshkit/backends/connection_pool.rb