Class: Puppet::Network::HTTP::Pool Private
- Defined in:
- lib/puppet/network/http/pool.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
A pool for persistent Net::HTTP
connections. Connections are stored in the pool indexed by their Site. Connections are borrowed from the pool, yielded to the caller, and released back into the pool. If a connection is expired, it will be closed either when a connection to that site is requested, or when the pool is closed. The pool can store multiple connections to the same site, and will be reused in MRU order.
Constant Summary collapse
- FIFTEEN_SECONDS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
15
Instance Attribute Summary collapse
- #factory ⇒ Object readonly private
Instance Method Summary collapse
-
#active_sessions(site) ⇒ Object
private
Returns an Array of sessions whose connections are not expired.
-
#borrow(site, verify) ⇒ Object
private
Borrow and take ownership of a persistent connection.
- #close ⇒ Object private
-
#close_connection(site, http) ⇒ Object
private
Safely close a persistent connection.
-
#initialize(keepalive_timeout = FIFTEEN_SECONDS) ⇒ Pool
constructor
private
A new instance of Pool.
- #pool ⇒ Object private
-
#release(site, http) ⇒ Object
private
Release a connection back into the pool.
- #with_connection(site, verify, &block) ⇒ Object private
Constructor Details
#initialize(keepalive_timeout = FIFTEEN_SECONDS) ⇒ Pool
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Pool.
16 17 18 19 20 |
# File 'lib/puppet/network/http/pool.rb', line 16 def initialize(keepalive_timeout = FIFTEEN_SECONDS) @pool = {} @factory = Puppet::Network::HTTP::Factory.new @keepalive_timeout = keepalive_timeout end |
Instance Attribute Details
#factory ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
14 15 16 |
# File 'lib/puppet/network/http/pool.rb', line 14 def factory @factory end |
Instance Method Details
#active_sessions(site) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns an Array of sessions whose connections are not expired.
107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/puppet/network/http/pool.rb', line 107 def active_sessions(site) now = Time.now sessions = @pool[site] || [] sessions.select do |session| if session.expired?(now) close_connection(site, session.connection) false else true end end end |
#borrow(site, verify) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Borrow and take ownership of a persistent connection. If a new connection is created, it will be started prior to being returned.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/puppet/network/http/pool.rb', line 72 def borrow(site, verify) @pool[site] = active_sessions(site) session = @pool[site].shift if session Puppet.debug("Using cached connection for #{site}") session.connection else http = @factory.create_connection(site) verify.setup_connection(http) Puppet.debug("Starting connection for #{site}") http.start http end end |
#close ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
44 45 46 47 48 49 50 51 |
# File 'lib/puppet/network/http/pool.rb', line 44 def close @pool.each_pair do |site, sessions| sessions.each do |session| close_connection(site, session.connection) end end @pool.clear end |
#close_connection(site, http) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Safely close a persistent connection.
61 62 63 64 65 66 |
# File 'lib/puppet/network/http/pool.rb', line 61 def close_connection(site, http) Puppet.debug("Closing connection for #{site}") http.finish rescue => detail Puppet.log_exception(detail, "Failed to close connection for #{site}: #{detail}") end |
#pool ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
54 55 56 |
# File 'lib/puppet/network/http/pool.rb', line 54 def pool @pool end |
#release(site, http) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Release a connection back into the pool.
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/puppet/network/http/pool.rb', line 91 def release(site, http) expiration = Time.now + @keepalive_timeout session = Puppet::Network::HTTP::Session.new(http, expiration) Puppet.debug("Caching connection for #{site}") sessions = @pool[site] if sessions sessions.unshift(session) else @pool[site] = [session] end end |
#with_connection(site, verify, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/puppet/network/http/pool.rb', line 22 def with_connection(site, verify, &block) reuse = true http = borrow(site, verify) begin if http.use_ssl? && http.verify_mode != OpenSSL::SSL::VERIFY_PEER reuse = false end yield http rescue => detail reuse = false raise detail ensure if reuse release(site, http) else close_connection(site, http) end end end |