perfectqueue 0.7.20 → 0.7.21
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +5 -0
- data/lib/perfectqueue/backend/null.rb +1 -1
- data/lib/perfectqueue/backend/rdb.rb +7 -6
- data/lib/perfectqueue/version.rb +1 -1
- data/test/backend_test.rb +11 -8
- metadata +17 -7
data/ChangeLog
CHANGED
@@ -15,7 +15,7 @@ class RDBBackend < Backend
|
|
15
15
|
# connection test
|
16
16
|
}
|
17
17
|
@sql = <<SQL
|
18
|
-
SELECT id, timeout, data, created_at, resource
|
18
|
+
SELECT id, timeout, data, created_at, resource, max_running-running AS runnable
|
19
19
|
FROM `#{@table}`
|
20
20
|
LEFT JOIN (
|
21
21
|
SELECT resource AS res, COUNT(1) AS running
|
@@ -23,8 +23,9 @@ LEFT JOIN (
|
|
23
23
|
WHERE timeout > ? AND created_at IS NOT NULL AND resource IS NOT NULL
|
24
24
|
GROUP BY resource
|
25
25
|
) AS R ON resource = res
|
26
|
-
WHERE timeout <= ? AND (
|
27
|
-
ORDER BY timeout ASC
|
26
|
+
WHERE timeout <= ? AND (runnable IS NULL OR runnable > 0)
|
27
|
+
ORDER BY runnable IS NOT NULL, runnable DESC, timeout ASC
|
28
|
+
LIMIT #{MAX_SELECT_ROW}
|
28
29
|
SQL
|
29
30
|
# sqlite doesn't support SELECT ... FOR UPDATE but
|
30
31
|
# sqlite doesn't need it because the db is not shared
|
@@ -41,6 +42,7 @@ SQL
|
|
41
42
|
sql << " data BLOB NOT NULL,"
|
42
43
|
sql << " created_at INT,"
|
43
44
|
sql << " resource VARCHAR(256),"
|
45
|
+
sql << " max_running INT,"
|
44
46
|
sql << " PRIMARY KEY (id)"
|
45
47
|
sql << ");"
|
46
48
|
# TODO index
|
@@ -88,7 +90,6 @@ SQL
|
|
88
90
|
end
|
89
91
|
|
90
92
|
MAX_SELECT_ROW = 8
|
91
|
-
MAX_RESOURCE = (ENV['PQ_MAX_RESOURCE'] || 4).to_i
|
92
93
|
#KEEPALIVE = 10
|
93
94
|
MAX_RETRY = 10
|
94
95
|
|
@@ -140,10 +141,10 @@ SQL
|
|
140
141
|
finish(id, delete_timeout, now)
|
141
142
|
end
|
142
143
|
|
143
|
-
def submit(id, data, time=Time.now.to_i, resource=nil)
|
144
|
+
def submit(id, data, time=Time.now.to_i, resource=nil, max_running=nil)
|
144
145
|
connect {
|
145
146
|
begin
|
146
|
-
n = @db["INSERT INTO `#{@table}` (id, timeout, data, created_at, resource) VALUES (?, ?, ?, ?, ?);", id, time, data, time, resource].insert
|
147
|
+
n = @db["INSERT INTO `#{@table}` (id, timeout, data, created_at, resource, max_running) VALUES (?, ?, ?, ?, ?, ?);", id, time, data, time, resource, max_running].insert
|
147
148
|
return true
|
148
149
|
rescue Sequel::DatabaseError
|
149
150
|
return nil
|
data/lib/perfectqueue/version.rb
CHANGED
data/test/backend_test.rb
CHANGED
@@ -223,25 +223,28 @@ class BackendTest < Test::Unit::TestCase
|
|
223
223
|
|
224
224
|
time = Time.now.to_i
|
225
225
|
|
226
|
-
|
227
|
-
ok = db1.submit(@key_prefix+'test'+i.to_s, 'data1', time-i, 'user1')
|
226
|
+
3.times do |i|
|
227
|
+
ok = db1.submit(@key_prefix+'test'+i.to_s, 'data1', time-(i+1), 'user1', 2)
|
228
228
|
assert_equal true, ok
|
229
229
|
end
|
230
|
-
ok = db1.submit(@key_prefix+'test5', 'data2', time, 'user2')
|
230
|
+
ok = db1.submit(@key_prefix+'test5', 'data2', time, 'user2', 2)
|
231
231
|
assert_equal true, ok
|
232
232
|
|
233
233
|
token_1 = nil
|
234
234
|
task_1 = nil
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
end
|
235
|
+
|
236
|
+
token_1, task_1 = db1.acquire(time+TIMEOUT, time)
|
237
|
+
assert_not_equal nil, task_1
|
238
|
+
assert_equal "user1", task_1.resource
|
240
239
|
|
241
240
|
token, task = db1.acquire(time+TIMEOUT, time)
|
242
241
|
assert_not_equal nil, task
|
243
242
|
assert_equal "user2", task.resource
|
244
243
|
|
244
|
+
token, task = db1.acquire(time+TIMEOUT, time)
|
245
|
+
assert_not_equal nil, task
|
246
|
+
assert_equal "user1", task.resource
|
247
|
+
|
245
248
|
token, task = db1.acquire(time+TIMEOUT, time)
|
246
249
|
assert_equal nil, task
|
247
250
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perfectqueue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.21
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 3.26.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.26.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: aws-sdk
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,7 +37,12 @@ dependencies:
|
|
32
37
|
version: 1.1.1
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.1.1
|
36
46
|
description:
|
37
47
|
email: frsyuki@gmail.com
|
38
48
|
executables:
|
@@ -83,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
93
|
version: '0'
|
84
94
|
requirements: []
|
85
95
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.8.
|
96
|
+
rubygems_version: 1.8.23
|
87
97
|
signing_key:
|
88
98
|
specification_version: 3
|
89
99
|
summary: Highly available distributed queue built on RDBMS or SimpleDB
|