connection_pool 2.5.2 → 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 +4 -4
- data/Changes.md +10 -0
- data/README.md +21 -0
- data/lib/connection_pool/timed_stack.rb +6 -0
- data/lib/connection_pool/version.rb +1 -1
- data/lib/connection_pool.rb +48 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6266fe91b9d1e5285e6e4cd873b0721b18b2c49140fff54b43c9df4d5acd7b1
|
4
|
+
data.tar.gz: cc95e0178a26a01d9fc3933d8b65468d203c7fb6ed415312f86e392551659db8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9641879d84cc20db729d1780283fca3a0328e957502369bd22dbbdd0f6601974204acdd8dcd1929e79da505402b73f3fe5eaf2842cfe64d542640ab1e70ad21c
|
7
|
+
data.tar.gz: 34afe9f57cbaff9b08066725964d776e81e1e0e484eccd54c361cc2a77fe24fbda181c9576754367515799f24f8095504ce2b4c8718f37a90b75c559782be0b4
|
data/Changes.md
CHANGED
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.
|
data/lib/connection_pool.rb
CHANGED
@@ -99,7 +99,8 @@ 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
|
-
|
102
|
+
@discard_key = :"pool-#{@available.object_id}-discard"
|
103
|
+
INSTANCES[self] = self if @auto_reload_after_fork && INSTANCES
|
103
104
|
end
|
104
105
|
|
105
106
|
def with(options = {})
|
@@ -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
|
-
|
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.
|
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:
|
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.
|
91
|
+
rubygems_version: 3.6.9
|
92
92
|
specification_version: 4
|
93
93
|
summary: Generic connection pool for Ruby
|
94
94
|
test_files: []
|