gene_pool 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/History.md +4 -0
- data/lib/gene_pool.rb +28 -14
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65f8bc24d422c5746e94dc1e295908b58da9220f
|
4
|
+
data.tar.gz: 9784d1f48c019d0e713b220150354973bf80b11c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94e48da354cfadc86e17640d18a926525f748659d9e5ed2b1571ad0be4a2f1be552901aa6d4d585c2c7f211687f784b54fa3b8299788820577985a150e4c1d46
|
7
|
+
data.tar.gz: 767e6165d9704693e62d4b70ae0f8aa8765fd1163f726e6cdede4f3a22afcb8030600a7c0097afc5122b37fb6397f9679d9f5eb8291029aaf54babf64c79a27b
|
data/Gemfile
CHANGED
data/History.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
GenePool Changelog
|
2
2
|
=====================
|
3
3
|
|
4
|
+
1.4.1 / 2014-04-29
|
5
|
+
- Close connection outside of the mutex.
|
6
|
+
- When iterating over the connections, don't include connections still in the process of being created (set to the reserved_placeholder).
|
7
|
+
|
4
8
|
1.4.0 / 2014-04-18
|
5
9
|
|
6
10
|
- Use Monitor instead of Mutex for locking to prevent recursive lock issues.
|
data/lib/gene_pool.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require 'thread'
|
3
|
+
require 'thread_safe'
|
3
4
|
require 'monitor'
|
4
5
|
|
5
6
|
# Generic connection pool class
|
6
7
|
class GenePool
|
7
8
|
|
8
|
-
attr_accessor :name, :
|
9
|
+
attr_accessor :name, :warn_timeout, :logger, :timeout_class
|
10
|
+
attr_reader :pool_size
|
9
11
|
|
10
12
|
# Creates a gene_pool. The passed block will be used to initialize a single instance of
|
11
13
|
# the item being pooled (i.e., socket connection or whatever)
|
@@ -40,7 +42,7 @@ class GenePool
|
|
40
42
|
@checked_out = []
|
41
43
|
# Map the original connections object_id within the with_connection method to the final connection.
|
42
44
|
# This could change if the connection is renew'ed.
|
43
|
-
@with_map =
|
45
|
+
@with_map = ThreadSafe::Hash.new
|
44
46
|
|
45
47
|
setup_mutex
|
46
48
|
end
|
@@ -130,16 +132,12 @@ class GenePool
|
|
130
132
|
# Note that with_connection_auto_remove automatically does this
|
131
133
|
def with_connection
|
132
134
|
connection = checkout
|
133
|
-
@
|
134
|
-
@with_map[connection.object_id] = connection
|
135
|
-
end
|
135
|
+
@with_map[connection.object_id] = connection
|
136
136
|
begin
|
137
137
|
yield connection
|
138
138
|
ensure
|
139
|
-
|
140
|
-
|
141
|
-
connection = @with_map.delete(connection.object_id)
|
142
|
-
end
|
139
|
+
# Update connection for any renew's that have occurred
|
140
|
+
connection = @with_map.delete(connection.object_id)
|
143
141
|
checkin(connection) if connection
|
144
142
|
end
|
145
143
|
end
|
@@ -149,7 +147,7 @@ class GenePool
|
|
149
147
|
with_connection do |connection|
|
150
148
|
begin
|
151
149
|
yield connection
|
152
|
-
rescue Exception
|
150
|
+
rescue Exception
|
153
151
|
remove(connection)
|
154
152
|
raise
|
155
153
|
end
|
@@ -204,10 +202,8 @@ class GenePool
|
|
204
202
|
@mutex.synchronize do
|
205
203
|
index = @checked_out.index(old_connection)
|
206
204
|
raise Error.new("Can't reassign non-checked out connection for #{@name}") unless index
|
207
|
-
close_connection(old_connection)
|
208
205
|
@checked_out[index] = new_connection
|
209
206
|
@connections[@connections.index(old_connection)] = new_connection
|
210
|
-
|
211
207
|
# If this is part of a with_connection block, then track our new connection
|
212
208
|
if @with_map.respond_to?(:key)
|
213
209
|
with_key = @with_map.key(old_connection)
|
@@ -218,7 +214,10 @@ class GenePool
|
|
218
214
|
|
219
215
|
@with_map[with_key] = new_connection if with_key
|
220
216
|
end
|
221
|
-
|
217
|
+
# Since connection has been removed, it can be closed outside the mutex
|
218
|
+
close_connection(old_connection)
|
219
|
+
|
220
|
+
@logger.debug {"#{@name}: Renewed connection old=#{old_connection.inspect} new=#{new_connection.inspect}"}
|
222
221
|
return new_connection
|
223
222
|
end
|
224
223
|
|
@@ -226,11 +225,26 @@ class GenePool
|
|
226
225
|
# This should probably only ever be used to allow interrupt of a connection that is checked out?
|
227
226
|
def each
|
228
227
|
@mutex.synchronize do
|
229
|
-
|
228
|
+
# Don't include the ones in a reserved_placeholder state because that object is meaningless
|
229
|
+
@connections.each { |connection| yield connection unless connection.kind_of?(Thread) }
|
230
230
|
end
|
231
231
|
end
|
232
232
|
|
233
|
+
# Return a copy of all the current connections
|
234
|
+
def connections
|
235
|
+
connections = @mutex.synchronize { connections = @connections.dup }
|
236
|
+
connections.delete_if { |c| c.kind_of?(Thread) }
|
237
|
+
connections.freeze
|
238
|
+
connections
|
239
|
+
end
|
240
|
+
|
241
|
+
# Close all connections and wait for active connections to complete
|
242
|
+
#
|
243
|
+
# Parameters:
|
244
|
+
# timeout:
|
245
|
+
# Maximum time to wait for connections to close before returning
|
233
246
|
def close(timeout=10)
|
247
|
+
# Prevent any new connections from being handed out
|
234
248
|
self.pool_size = 0
|
235
249
|
start_time = Time.now
|
236
250
|
while (Time.now - start_time) < timeout
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gene_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Pardee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
12
|
-
dependencies:
|
11
|
+
date: 2014-04-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thread_safe
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '0'
|
25
|
+
prerelease: false
|
26
|
+
type: :runtime
|
13
27
|
description: Generic pooling library for creating a connection pool
|
14
28
|
email:
|
15
29
|
- bradpardee@gmail.com
|