Class: Puppet::HTTP::Pool Private
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.
Instance Attribute Summary collapse
- #factory ⇒ Object readonly private
- #keepalive_timeout ⇒ Object readonly private
Instance Method Summary collapse
-
#active_entries(site) ⇒ Object
private
Returns an Array of entries whose connections are not expired.
-
#borrow(site, verifier) ⇒ 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) ⇒ Pool
constructor
private
A new instance of Pool.
- #pool ⇒ Object private
-
#release(site, verifier, http) ⇒ Object
private
Release a connection back into the pool.
-
#setsockopts(netio) ⇒ Object
private
Set useful socket option(s) which lack from default settings in Net:HTTP.
-
#start(site, verifier, http) ⇒ Object
private
Start a persistent connection.
- #with_connection(site, verifier, &block) ⇒ Object private
Constructor Details
#initialize(keepalive_timeout) ⇒ 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.
15 16 17 18 19 |
# File 'lib/puppet/http/pool.rb', line 15 def initialize(keepalive_timeout) @pool = {} @factory = Puppet::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.
13 14 15 |
# File 'lib/puppet/http/pool.rb', line 13 def factory @factory end |
#keepalive_timeout ⇒ 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.
13 14 15 |
# File 'lib/puppet/http/pool.rb', line 13 def keepalive_timeout @keepalive_timeout end |
Instance Method Details
#active_entries(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 entries whose connections are not expired.
144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/puppet/http/pool.rb', line 144 def active_entries(site) now = Time.now entries = @pool[site] || [] entries.select do |entry| if entry.expired?(now) close_connection(site, entry.connection) false else true end end end |
#borrow(site, verifier) ⇒ 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.
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/puppet/http/pool.rb', line 94 def borrow(site, verifier) @pool[site] = active_entries(site) index = @pool[site].index do |entry| (verifier.nil? && entry.verifier.nil?) || (!verifier.nil? && verifier.reusable?(entry.verifier)) end entry = index ? @pool[site].delete_at(index) : nil if entry @pool.delete(site) if @pool[site].empty? Puppet.debug("Using cached connection for #{site}") entry.connection else http = @factory.create_connection(site) start(site, verifier, http) setsockopts(http.instance_variable_get(:@socket)) 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.
43 44 45 46 47 48 49 50 |
# File 'lib/puppet/http/pool.rb', line 43 def close @pool.each_pair do |site, entries| entries.each do |entry| close_connection(site, entry.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. Don’t try to close a connection that’s already closed.
79 80 81 82 83 84 85 86 87 88 |
# File 'lib/puppet/http/pool.rb', line 79 def close_connection(site, http) return false unless http.started? Puppet.debug("Closing connection for #{site}") http.finish true rescue => detail Puppet.log_exception(detail, _("Failed to close connection for %{site}: %{detail}") % { site: site, detail: detail }) nil 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.
53 54 55 |
# File 'lib/puppet/http/pool.rb', line 53 def pool @pool end |
#release(site, verifier, 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.
128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/puppet/http/pool.rb', line 128 def release(site, verifier, http) expiration = Time.now + @keepalive_timeout entry = Puppet::HTTP::PoolEntry.new(http, verifier, expiration) Puppet.debug("Caching connection for #{site}") entries = @pool[site] if entries entries.unshift(entry) else @pool[site] = [entry] end end |
#setsockopts(netio) ⇒ 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.
Set useful socket option(s) which lack from default settings in Net:HTTP
118 119 120 121 122 123 |
# File 'lib/puppet/http/pool.rb', line 118 def setsockopts(netio) return unless netio socket = netio.io socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) end |
#start(site, verifier, 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.
Start a persistent connection
60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/puppet/http/pool.rb', line 60 def start(site, verifier, http) Puppet.debug("Starting connection for #{site}") if site.use_ssl? verifier.setup_connection(http) begin http.start print_ssl_info(http) if Puppet::Util::Log.sendlevel?(:debug) rescue OpenSSL::SSL::SSLError => error verifier.handle_connection_error(http, error) end else http.start end end |
#with_connection(site, verifier, &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.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/puppet/http/pool.rb', line 21 def with_connection(site, verifier, &block) reuse = true http = borrow(site, verifier) 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 && http.started? release(site, verifier, http) else close_connection(site, http) end end end |