connection_pool 2.5.3 → 2.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee1b7fff2f766c5941f36e0d62c07dd35c04864a19ecd7348d351e6b287bfb16
4
- data.tar.gz: 3ec78e8d6b4763e26a73c5f865d92d0323ece85b85b858b28dc870da7babd640
3
+ metadata.gz: e6266fe91b9d1e5285e6e4cd873b0721b18b2c49140fff54b43c9df4d5acd7b1
4
+ data.tar.gz: cc95e0178a26a01d9fc3933d8b65468d203c7fb6ed415312f86e392551659db8
5
5
  SHA512:
6
- metadata.gz: b656b3fed03027af31fa1b7e80574d8690669143f5a6496e0512d251a7aa8bf67393188e7b2a09855877fcb39f150cf9fad6b94d7b2dd974410af5791be24287
7
- data.tar.gz: f5424045239ee1621049adcc37323ff182cc634303f41b46f150fdbf22ceed85d702bd116b74a8808f818e374bb262577852a5edd9233a1900857692f3ebc64c
6
+ metadata.gz: 9641879d84cc20db729d1780283fca3a0328e957502369bd22dbbdd0f6601974204acdd8dcd1929e79da505402b73f3fe5eaf2842cfe64d542640ab1e70ad21c
7
+ data.tar.gz: 34afe9f57cbaff9b08066725964d776e81e1e0e484eccd54c361cc2a77fe24fbda181c9576754367515799f24f8095504ce2b4c8718f37a90b75c559782be0b4
data/Changes.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # connection_pool Changelog
2
2
 
3
+ 2.5.4
4
+ ------
5
+
6
+ - Add ability to remove a broken connection from the pool [#204, womblep]
7
+
3
8
  2.5.3
4
9
  ------
5
10
 
data/README.md CHANGED
@@ -129,6 +129,27 @@ Thread.new do
129
129
  end
130
130
  ```
131
131
 
132
+ ## Discarding Connections
133
+
134
+ You can discard connections in the ConnectionPool instance to remove connections that are broken and can't be restarted.
135
+
136
+ NOTE: the connection is not closed. It will just be removed from the pool so it won't be selected again.
137
+
138
+ It can only be done inside the block passed to `with` or `with_timeout`.
139
+
140
+ Takes an optional block that will be executed with the connection.
141
+
142
+ ```ruby
143
+ pool.with do |conn|
144
+ begin
145
+ conn.execute("SELECT 1")
146
+ rescue SomeConnectionError
147
+ pool.discard_current_connection # remove the connection from the pool
148
+ raise
149
+ end
150
+ end
151
+ ```
152
+
132
153
  ## Current State
133
154
 
134
155
  There are several methods that return information about a pool.
@@ -134,6 +134,12 @@ class ConnectionPool::TimedStack
134
134
  @que.length
135
135
  end
136
136
 
137
+ ##
138
+ # Reduce the created count
139
+ def decrement_created
140
+ @created -= 1 unless @created == 0
141
+ end
142
+
137
143
  private
138
144
 
139
145
  def current_time
@@ -1,3 +1,3 @@
1
1
  class ConnectionPool
2
- VERSION = "2.5.3"
2
+ VERSION = "2.5.4"
3
3
  end
@@ -99,6 +99,7 @@ class ConnectionPool
99
99
  @available = TimedStack.new(@size, &block)
100
100
  @key = :"pool-#{@available.object_id}"
101
101
  @key_count = :"pool-#{@available.object_id}-count"
102
+ @discard_key = :"pool-#{@available.object_id}-discard"
102
103
  INSTANCES[self] = self if @auto_reload_after_fork && INSTANCES
103
104
  end
104
105
 
@@ -116,6 +117,40 @@ class ConnectionPool
116
117
  end
117
118
  alias_method :then, :with
118
119
 
120
+ ##
121
+ # Marks the current thread's checked-out connection for discard.
122
+ #
123
+ # When a connection is marked for discard, it will not be returned to the pool
124
+ # when checked in. Instead, the connection will be discarded.
125
+ # This is useful when a connection has become invalid or corrupted
126
+ # and should not be reused.
127
+ #
128
+ # Takes an optional block that will be called with the connection to be discarded.
129
+ # The block should perform any necessary clean-up on the connection.
130
+ #
131
+ # @yield [conn]
132
+ # @yieldparam conn [Object] The connection to be discarded.
133
+ # @yieldreturn [void]
134
+ #
135
+ #
136
+ # Note: This only affects the connection currently checked out by the calling thread.
137
+ # The connection will be discarded when +checkin+ is called.
138
+ #
139
+ # @return [void]
140
+ #
141
+ # @example
142
+ # pool.with do |conn|
143
+ # begin
144
+ # conn.execute("SELECT 1")
145
+ # rescue SomeConnectionError
146
+ # pool.discard_current_connection # Mark connection as bad
147
+ # raise
148
+ # end
149
+ # end
150
+ def discard_current_connection(&block)
151
+ ::Thread.current[@discard_key] = block || proc { |conn| conn }
152
+ end
153
+
119
154
  def checkout(options = {})
120
155
  if ::Thread.current[@key]
121
156
  ::Thread.current[@key_count] += 1
@@ -129,7 +164,18 @@ class ConnectionPool
129
164
  def checkin(force: false)
130
165
  if ::Thread.current[@key]
131
166
  if ::Thread.current[@key_count] == 1 || force
132
- @available.push(::Thread.current[@key])
167
+ if ::Thread.current[@discard_key]
168
+ begin
169
+ @available.decrement_created
170
+ ::Thread.current[@discard_key].call(::Thread.current[@key])
171
+ rescue
172
+ nil
173
+ ensure
174
+ ::Thread.current[@discard_key] = nil
175
+ end
176
+ else
177
+ @available.push(::Thread.current[@key])
178
+ end
133
179
  ::Thread.current[@key] = nil
134
180
  ::Thread.current[@key_count] = nil
135
181
  else
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connection_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.3
4
+ version: 2.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  - Damian Janowski
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-28 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  requirements: []
91
- rubygems_version: 3.6.2
91
+ rubygems_version: 3.6.9
92
92
  specification_version: 4
93
93
  summary: Generic connection pool for Ruby
94
94
  test_files: []