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 CHANGED
@@ -1,4 +1,9 @@
1
1
 
2
+ == 2012-07-19 version 0.7.21
3
+
4
+ * Added max_running column for fair resource restriction
5
+
6
+
2
7
  == 2012-01-24 version 0.7.20
3
8
 
4
9
  * Fixed MonitorThread
@@ -23,7 +23,7 @@ class NullBackend < Backend
23
23
  true
24
24
  end
25
25
 
26
- def submit(id, data, time=Time.now.to_i, resource=nil)
26
+ def submit(id, data, time=Time.now.to_i, resource=nil, max_running=nil)
27
27
  true
28
28
  end
29
29
  end
@@ -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 (running IS NULL OR running < #{MAX_RESOURCE})
27
- ORDER BY timeout ASC LIMIT #{MAX_SELECT_ROW}
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
@@ -1,5 +1,5 @@
1
1
  module PerfectQueue
2
2
 
3
- VERSION = '0.7.20'
3
+ VERSION = '0.7.21'
4
4
 
5
5
  end
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
- 5.times do |i|
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
- 4.times do
236
- token_1, task_1 = db1.acquire(time+TIMEOUT, time)
237
- assert_not_equal nil, task_1
238
- assert_equal "user1", task_1.resource
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.20
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-01-25 00:00:00.000000000Z
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: &70266680954860 !ruby/object:Gem::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: *70266680954860
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: &70266680954320 !ruby/object:Gem::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: *70266680954320
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.12
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