perfectqueue 0.7.20 → 0.7.21

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.
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