data_objects 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/data_objects.rb +1 -1
- data/lib/data_objects/support/pooling.rb +17 -17
- data/lib/data_objects/transaction.rb +2 -1
- data/lib/data_objects/version.rb +2 -2
- data/spec/connection_spec.rb +4 -4
- data/spec/support/pooling_spec.rb +32 -32
- metadata +4 -4
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ AUTHOR = "Yehuda Katz"
|
|
9
9
|
EMAIL = "wycats@gmail.com"
|
10
10
|
GEM_NAME = "data_objects"
|
11
11
|
GEM_VERSION = DataObjects::VERSION
|
12
|
-
GEM_DEPENDENCIES = ["addressable", ">=1.0.3"], ["extlib", "
|
12
|
+
GEM_DEPENDENCIES = ["addressable", ">=1.0.3"], ["extlib", ">=0.9.5"]
|
13
13
|
GEM_CLEAN = "{coverage,doc,log}/", "profile_results.*", "**/.*.sw?", "*.gem", ".config", "**/.DS_Store"
|
14
14
|
GEM_EXTRAS = {}
|
15
15
|
|
data/lib/data_objects.rb
CHANGED
@@ -9,7 +9,7 @@ class Object
|
|
9
9
|
# because instances are keeped in memory reused.
|
10
10
|
#
|
11
11
|
# Classes that include Pooling module have re-defined new
|
12
|
-
# method that returns instances
|
12
|
+
# method that returns instances acquired from pool.
|
13
13
|
#
|
14
14
|
# Term resource is used for any type of poolable objects
|
15
15
|
# and should NOT be thought as DataMapper Resource or
|
@@ -43,18 +43,18 @@ class Object
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# ==== Notes
|
46
|
-
# Instances of poolable resource are
|
46
|
+
# Instances of poolable resource are acquired from
|
47
47
|
# pool. This quires a new instance from pool and
|
48
48
|
# returns it.
|
49
49
|
#
|
50
50
|
# ==== Returns
|
51
|
-
# Resource instance
|
51
|
+
# Resource instance acquired from the pool.
|
52
52
|
#
|
53
53
|
# ==== Raises
|
54
54
|
# ArgumentError:: when pool is exhausted and no instance
|
55
|
-
# can be
|
55
|
+
# can be acquired.
|
56
56
|
def new
|
57
|
-
pool.
|
57
|
+
pool.acquire
|
58
58
|
end
|
59
59
|
|
60
60
|
# ==== Notes
|
@@ -118,20 +118,20 @@ class Object
|
|
118
118
|
end
|
119
119
|
|
120
120
|
# ==== Notes
|
121
|
-
# Indicates if pool has resources to
|
121
|
+
# Indicates if pool has resources to acquire.
|
122
122
|
#
|
123
123
|
# ==== Returns
|
124
|
-
# <Boolean>:: true if pool has resources can be
|
124
|
+
# <Boolean>:: true if pool has resources can be acquired,
|
125
125
|
# false otherwise.
|
126
126
|
def available?
|
127
127
|
@reserved.size < size_limit
|
128
128
|
end
|
129
129
|
|
130
130
|
# ==== Notes
|
131
|
-
#
|
131
|
+
# Acquires last used available resource and returns it.
|
132
132
|
# If no resources available, current implementation
|
133
133
|
# throws an exception.
|
134
|
-
def
|
134
|
+
def acquire
|
135
135
|
@lock.synchronize do
|
136
136
|
if available?
|
137
137
|
instance = prepair_available_resource
|
@@ -145,10 +145,10 @@ class Object
|
|
145
145
|
end
|
146
146
|
|
147
147
|
# ==== Notes
|
148
|
-
# Releases previously
|
148
|
+
# Releases previously acquired instance.
|
149
149
|
#
|
150
150
|
# ==== Parameters
|
151
|
-
# instance <Anything>:: previosly
|
151
|
+
# instance <Anything>:: previosly acquired instance.
|
152
152
|
#
|
153
153
|
# ==== Raises
|
154
154
|
# RuntimeError:: when given not pooled instance.
|
@@ -178,12 +178,12 @@ class Object
|
|
178
178
|
end
|
179
179
|
|
180
180
|
# ==== Notes
|
181
|
-
# Check if instance has been
|
181
|
+
# Check if instance has been acquired from the pool.
|
182
182
|
#
|
183
183
|
# ==== Returns
|
184
|
-
# <Boolean>:: true if given resource instance has been
|
184
|
+
# <Boolean>:: true if given resource instance has been acquired from pool,
|
185
185
|
# false otherwise.
|
186
|
-
def
|
186
|
+
def acquired?(instance)
|
187
187
|
@reserved.include?(instance)
|
188
188
|
end
|
189
189
|
|
@@ -208,7 +208,7 @@ class Object
|
|
208
208
|
# ==== Returns
|
209
209
|
# <Boolean>:: true if instance should be released, false otherwise.
|
210
210
|
def time_to_release?(instance)
|
211
|
-
(Time.now - instance.instance_variable_get("@
|
211
|
+
(Time.now - instance.instance_variable_get("@__pool_acquire_timestamp")) > @expiration_period
|
212
212
|
end
|
213
213
|
|
214
214
|
protected
|
@@ -220,13 +220,13 @@ class Object
|
|
220
220
|
def prepair_available_resource
|
221
221
|
if @available.size > 0
|
222
222
|
res = @available.pop
|
223
|
-
res.instance_variable_set("@
|
223
|
+
res.instance_variable_set("@__pool_acquire_timestamp", Time.now)
|
224
224
|
|
225
225
|
res
|
226
226
|
else
|
227
227
|
res = @class_of_resources.allocate
|
228
228
|
res.send(:initialize, *@initialization_args)
|
229
|
-
res.instance_variable_set("@
|
229
|
+
res.instance_variable_set("@__pool_acquire_timestamp", Time.now)
|
230
230
|
|
231
231
|
res
|
232
232
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'digest'
|
2
|
+
require 'digest/sha2'
|
2
3
|
|
3
4
|
module DataObjects
|
4
5
|
|
@@ -23,7 +24,7 @@ module DataObjects
|
|
23
24
|
#
|
24
25
|
def initialize(uri)
|
25
26
|
@connection = DataObjects::Connection.new(uri)
|
26
|
-
@id = Digest::
|
27
|
+
@id = Digest::SHA256.hexdigest("#{HOST}:#{$$}:#{Time.now.to_f}:#{@@counter += 1}")
|
27
28
|
end
|
28
29
|
|
29
30
|
def close
|
data/lib/data_objects/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module DataObjects
|
2
|
-
VERSION = "0.9.
|
3
|
-
end
|
2
|
+
VERSION = "0.9.5" unless defined?(DataObjects::VERSION)
|
3
|
+
end
|
data/spec/connection_spec.rb
CHANGED
@@ -49,7 +49,7 @@ describe DataObjects::Connection do
|
|
49
49
|
uri.path.should == '/database'
|
50
50
|
end
|
51
51
|
|
52
|
-
it "should accept a
|
52
|
+
it "should accept a connection uri as a Addressable::URI" do
|
53
53
|
c = DataObjects::Connection.new(Addressable::URI::parse('mock://localhost/database'))
|
54
54
|
# relying on the fact that mock connection sets @uri
|
55
55
|
uri = c.instance_variable_get("@uri")
|
@@ -58,17 +58,17 @@ describe DataObjects::Connection do
|
|
58
58
|
uri.to_s.should == 'mock://localhost/database'
|
59
59
|
end
|
60
60
|
|
61
|
-
it "should determine which DataObject adapter from the uri scheme" do
|
61
|
+
it "should determine which DataObject adapter to use from the uri scheme" do
|
62
62
|
DataObjects::Mock::Connection.should_receive(:__new)
|
63
63
|
DataObjects::Connection.new('mock://localhost/database')
|
64
64
|
end
|
65
65
|
|
66
|
-
it "should determine which DataObject adapter from a JDBC URL scheme" do
|
66
|
+
it "should determine which DataObject adapter to use from a JDBC URL scheme" do
|
67
67
|
DataObjects::Mock::Connection.should_receive(:__new)
|
68
68
|
DataObjects::Connection.new('jdbc:mock://localhost/database')
|
69
69
|
end
|
70
70
|
|
71
|
-
it "should
|
71
|
+
it "should acquire a connection" do
|
72
72
|
uri = Addressable::URI.parse('mock://localhost/database')
|
73
73
|
DataObjects::Mock::Connection.should_receive(:__new).with(uri)
|
74
74
|
|
@@ -33,8 +33,8 @@ describe Object::Pooling::ResourcePool do
|
|
33
33
|
@pool.should respond_to(:flush!)
|
34
34
|
end
|
35
35
|
|
36
|
-
it "responds to
|
37
|
-
@pool.should respond_to(:
|
36
|
+
it "responds to acquire" do
|
37
|
+
@pool.should respond_to(:acquire)
|
38
38
|
end
|
39
39
|
|
40
40
|
it "responds to release" do
|
@@ -100,7 +100,7 @@ end
|
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
-
describe "
|
103
|
+
describe "Acquire from constant size pool" do
|
104
104
|
before :each do
|
105
105
|
DisposableResource.initialize_pool(2)
|
106
106
|
end
|
@@ -110,53 +110,53 @@ describe "Aquire from contant size pool" do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
it "increased size of the pool" do
|
113
|
-
@time = DisposableResource.pool.
|
113
|
+
@time = DisposableResource.pool.acquire
|
114
114
|
DisposableResource.pool.size.should == 1
|
115
115
|
end
|
116
116
|
|
117
117
|
it "places initialized instance in the reserved set" do
|
118
|
-
@time = DisposableResource.pool.
|
118
|
+
@time = DisposableResource.pool.acquire
|
119
119
|
DisposableResource.pool.instance_variable_get("@reserved").size.should == 1
|
120
120
|
end
|
121
121
|
|
122
122
|
it "raises an exception when pool size limit is hit" do
|
123
|
-
@t1 = DisposableResource.pool.
|
124
|
-
@t2 = DisposableResource.pool.
|
123
|
+
@t1 = DisposableResource.pool.acquire
|
124
|
+
@t2 = DisposableResource.pool.acquire
|
125
125
|
|
126
|
-
lambda { DisposableResource.pool.
|
126
|
+
lambda { DisposableResource.pool.acquire }.should raise_error(RuntimeError)
|
127
127
|
end
|
128
128
|
|
129
129
|
it "returns last released resource" do
|
130
|
-
@t1 = DisposableResource.pool.
|
131
|
-
@t2 = DisposableResource.pool.
|
130
|
+
@t1 = DisposableResource.pool.acquire
|
131
|
+
@t2 = DisposableResource.pool.acquire
|
132
132
|
DisposableResource.pool.release(@t1)
|
133
133
|
|
134
|
-
DisposableResource.pool.
|
134
|
+
DisposableResource.pool.acquire.should == @t1
|
135
135
|
end
|
136
136
|
|
137
137
|
it "really truly returns last released resource" do
|
138
|
-
@t1 = DisposableResource.pool.
|
138
|
+
@t1 = DisposableResource.pool.acquire
|
139
139
|
DisposableResource.pool.release(@t1)
|
140
140
|
|
141
|
-
@t2 = DisposableResource.pool.
|
141
|
+
@t2 = DisposableResource.pool.acquire
|
142
142
|
DisposableResource.pool.release(@t2)
|
143
143
|
|
144
|
-
@t3 = DisposableResource.pool.
|
144
|
+
@t3 = DisposableResource.pool.acquire
|
145
145
|
DisposableResource.pool.release(@t3)
|
146
146
|
|
147
|
-
DisposableResource.pool.
|
147
|
+
DisposableResource.pool.acquire.should == @t1
|
148
148
|
@t1.should == @t3
|
149
149
|
end
|
150
150
|
|
151
151
|
it "sets allocation timestamp on resource instance" do
|
152
152
|
@t1 = DisposableResource.new
|
153
|
-
@t1.instance_variable_get("@
|
153
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 2)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
157
|
|
158
158
|
|
159
|
-
describe "Releasing from
|
159
|
+
describe "Releasing from constant size pool" do
|
160
160
|
before :each do
|
161
161
|
DisposableResource.initialize_pool(2)
|
162
162
|
end
|
@@ -166,8 +166,8 @@ describe "Releasing from contant size pool" do
|
|
166
166
|
end
|
167
167
|
|
168
168
|
it "decreases size of the pool" do
|
169
|
-
@t1 = DisposableResource.pool.
|
170
|
-
@t2 = DisposableResource.pool.
|
169
|
+
@t1 = DisposableResource.pool.acquire
|
170
|
+
@t2 = DisposableResource.pool.acquire
|
171
171
|
DisposableResource.pool.release(@t1)
|
172
172
|
|
173
173
|
DisposableResource.pool.size.should == 1
|
@@ -182,14 +182,14 @@ describe "Releasing from contant size pool" do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
it "disposes released object" do
|
185
|
-
@t1 = DisposableResource.pool.
|
185
|
+
@t1 = DisposableResource.pool.acquire
|
186
186
|
|
187
187
|
@t1.should_receive(:dispose)
|
188
188
|
DisposableResource.pool.release(@t1)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "removes released object from reserved set" do
|
192
|
-
@t1 = DisposableResource.pool.
|
192
|
+
@t1 = DisposableResource.pool.acquire
|
193
193
|
|
194
194
|
lambda {
|
195
195
|
DisposableResource.pool.release(@t1)
|
@@ -197,27 +197,27 @@ describe "Releasing from contant size pool" do
|
|
197
197
|
end
|
198
198
|
|
199
199
|
it "returns released object back to available set" do
|
200
|
-
@t1 = DisposableResource.pool.
|
200
|
+
@t1 = DisposableResource.pool.acquire
|
201
201
|
|
202
202
|
lambda {
|
203
203
|
DisposableResource.pool.release(@t1)
|
204
204
|
}.should change(DisposableResource.pool.instance_variable_get("@available"), :size).by(1)
|
205
205
|
end
|
206
206
|
|
207
|
-
it "updates
|
208
|
-
#
|
207
|
+
it "updates acquire timestamp on already allocated resource instance" do
|
208
|
+
# acquire it once
|
209
209
|
@t1 = DisposableResource.new
|
210
210
|
# wait a bit
|
211
211
|
sleep 3
|
212
212
|
|
213
213
|
# check old timestamp
|
214
|
-
@t1.instance_variable_get("@
|
214
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 4)
|
215
215
|
|
216
|
-
# re-
|
216
|
+
# re-acquire
|
217
217
|
DisposableResource.pool.release(@t1)
|
218
218
|
@t1 = DisposableResource.new
|
219
219
|
# see timestamp is updated
|
220
|
-
@t1.instance_variable_get("@
|
220
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 2)
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
@@ -238,7 +238,7 @@ describe Object::Pooling::ResourcePool, "#available?" do
|
|
238
238
|
end
|
239
239
|
|
240
240
|
it "returns false when pool is exhausted" do
|
241
|
-
#
|
241
|
+
# acquires the last available resource
|
242
242
|
DisposableResource.new
|
243
243
|
DisposableResource.pool.should_not be_available
|
244
244
|
end
|
@@ -246,7 +246,7 @@ end
|
|
246
246
|
|
247
247
|
|
248
248
|
|
249
|
-
describe "Flushing of
|
249
|
+
describe "Flushing of constant size pool" do
|
250
250
|
before :each do
|
251
251
|
DisposableResource.initialize_pool(2)
|
252
252
|
|
@@ -291,10 +291,10 @@ describe "Poolable resource class" do
|
|
291
291
|
DisposableResource.instance_variable_set("@__pool", nil)
|
292
292
|
end
|
293
293
|
|
294
|
-
it "
|
294
|
+
it "acquires new instances from pool" do
|
295
295
|
@instance_one = DisposableResource.new
|
296
296
|
|
297
|
-
DisposableResource.pool.
|
297
|
+
DisposableResource.pool.acquired?(@instance_one).should be(true)
|
298
298
|
end
|
299
299
|
|
300
300
|
it "flushed existing pool on re-initialization" do
|
@@ -344,7 +344,7 @@ describe Object::Pooling::ResourcePool, "#time_to_dispose?" do
|
|
344
344
|
DisposableResource.instance_variable_set("@__pool", nil)
|
345
345
|
end
|
346
346
|
|
347
|
-
it "returns true when object's last
|
347
|
+
it "returns true when object's last acquisition time is greater than limit" do
|
348
348
|
@t1 = DisposableResource.new
|
349
349
|
DisposableResource.pool.time_to_release?(@t1).should be(false)
|
350
350
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yehuda Katz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08-
|
12
|
+
date: 2008-08-26 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -28,9 +28,9 @@ dependencies:
|
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.
|
33
|
+
version: 0.9.5
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|