perfectqueue 0.8.22 → 0.8.23
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -0
- data/lib/perfectqueue/backend/rdb_compat.rb +15 -9
- data/lib/perfectqueue/client.rb +2 -2
- data/lib/perfectqueue/task_metadata.rb +4 -0
- data/lib/perfectqueue/version.rb +1 -1
- data/spec/queue_spec.rb +41 -30
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -45,7 +45,7 @@ module PerfectQueue
|
|
45
45
|
|
46
46
|
if config[:disable_resource_limit]
|
47
47
|
@sql = <<SQL
|
48
|
-
SELECT id, timeout, data, created_at, resource
|
48
|
+
SELECT id, timeout, data, created_at, retry_count, resource
|
49
49
|
FROM `#{@table}`
|
50
50
|
WHERE timeout <= ? AND timeout <= ? AND created_at IS NOT NULL
|
51
51
|
ORDER BY timeout ASC
|
@@ -53,7 +53,7 @@ LIMIT ?
|
|
53
53
|
SQL
|
54
54
|
else
|
55
55
|
@sql = <<SQL
|
56
|
-
SELECT id, timeout, data, created_at, resource, max_running, max_running/running AS weight
|
56
|
+
SELECT id, timeout, data, created_at, retry_count, resource, max_running, max_running/running AS weight
|
57
57
|
FROM `#{@table}`
|
58
58
|
LEFT JOIN (
|
59
59
|
SELECT resource AS res, COUNT(1) AS running
|
@@ -100,6 +100,7 @@ SQL
|
|
100
100
|
timeout INT NOT NULL,
|
101
101
|
data BLOB NOT NULL,
|
102
102
|
created_at INT,
|
103
|
+
retry_count INT NOT NULL DEFAULT 0,
|
103
104
|
resource VARCHAR(256),
|
104
105
|
max_running INT,
|
105
106
|
PRIMARY KEY (id)
|
@@ -114,7 +115,7 @@ SQL
|
|
114
115
|
now = (options[:now] || Time.now).to_i
|
115
116
|
|
116
117
|
connect {
|
117
|
-
row = @db.fetch("SELECT timeout, data, created_at, resource, max_running FROM `#{@table}` WHERE id=? LIMIT 1", key).first
|
118
|
+
row = @db.fetch("SELECT timeout, data, created_at, retry_count, resource, max_running FROM `#{@table}` WHERE id=? LIMIT 1", key).first
|
118
119
|
unless row
|
119
120
|
raise NotFoundError, "task key=#{key} does no exist"
|
120
121
|
end
|
@@ -133,8 +134,8 @@ SQL
|
|
133
134
|
now = (options[:now] || Time.now).to_i
|
134
135
|
|
135
136
|
connect {
|
136
|
-
#@db.fetch("SELECT id, timeout, data, created_at, resource FROM `#{@table}` WHERE !(created_at IS NULL AND timeout <= ?) ORDER BY timeout ASC;", now) {|row|
|
137
|
-
@db.fetch("SELECT id, timeout, data, created_at, resource, max_running FROM `#{@table}` ORDER BY timeout ASC", now) {|row|
|
137
|
+
#@db.fetch("SELECT id, timeout, data, created_at, retry_count, resource FROM `#{@table}` WHERE !(created_at IS NULL AND timeout <= ?) ORDER BY timeout ASC;", now) {|row|
|
138
|
+
@db.fetch("SELECT id, timeout, data, created_at, retry_count, resource, max_running FROM `#{@table}` ORDER BY timeout ASC", now) {|row|
|
138
139
|
attributes = create_attributes(now, row)
|
139
140
|
task = TaskWithMetadata.new(@client, row[:id], attributes)
|
140
141
|
yield task
|
@@ -200,7 +201,7 @@ SQL
|
|
200
201
|
return nil
|
201
202
|
end
|
202
203
|
|
203
|
-
sql = "UPDATE `#{@table}` SET timeout =
|
204
|
+
sql = "UPDATE `#{@table}` SET timeout=?, retry_count=(retry_count+1) WHERE id IN ("
|
204
205
|
params = [sql, next_timeout]
|
205
206
|
tasks.each {|t| params << t.key }
|
206
207
|
sql << (1..tasks.size).map { '?' }.join(',')
|
@@ -274,6 +275,10 @@ SQL
|
|
274
275
|
nil
|
275
276
|
end
|
276
277
|
|
278
|
+
def release(task_token, alive_time, options)
|
279
|
+
heartbeat(task_token, alive_time, options)
|
280
|
+
end
|
281
|
+
|
277
282
|
protected
|
278
283
|
def connect(&block)
|
279
284
|
#now = Time.now.to_i
|
@@ -282,15 +287,15 @@ SQL
|
|
282
287
|
# @db.disconnect
|
283
288
|
#end
|
284
289
|
#@last_time = now
|
285
|
-
|
290
|
+
count = 0
|
286
291
|
begin
|
287
292
|
block.call
|
288
293
|
rescue
|
289
294
|
# workaround for "Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction" error
|
290
295
|
if $!.to_s.include?('try restarting transaction')
|
291
296
|
err = ([$!] + $!.backtrace.map {|bt| " #{bt}" }).join("\n")
|
292
|
-
|
293
|
-
if
|
297
|
+
count += 1
|
298
|
+
if count < MAX_RETRY
|
294
299
|
STDERR.puts err + "\n retrying."
|
295
300
|
sleep rand
|
296
301
|
retry
|
@@ -342,6 +347,7 @@ SQL
|
|
342
347
|
:type => type,
|
343
348
|
:user => row[:resource],
|
344
349
|
:timeout => row[:timeout],
|
350
|
+
:retry_count => row[:retry_count],
|
345
351
|
:max_running => row[:max_running],
|
346
352
|
:message => nil, # not supported
|
347
353
|
:node => nil, # not supported
|
data/lib/perfectqueue/client.rb
CHANGED
@@ -99,13 +99,13 @@ module PerfectQueue
|
|
99
99
|
def release(task_token, options={})
|
100
100
|
alive_time = options[:alive_time] || 0
|
101
101
|
|
102
|
-
@backend.
|
102
|
+
@backend.release(task_token, alive_time, options)
|
103
103
|
end
|
104
104
|
|
105
105
|
def retry(task_token, options={})
|
106
106
|
alive_time = options[:retry_wait] || @retry_wait
|
107
107
|
|
108
|
-
@backend.
|
108
|
+
@backend.release(task_token, alive_time, options)
|
109
109
|
end
|
110
110
|
|
111
111
|
def close
|
data/lib/perfectqueue/version.rb
CHANGED
data/spec/queue_spec.rb
CHANGED
@@ -39,19 +39,22 @@ describe Queue do
|
|
39
39
|
task01.finished?.should == false
|
40
40
|
task01.type == 'type1'
|
41
41
|
task01.key.should == 'task01'
|
42
|
+
task01.retry_count.should == 0
|
42
43
|
task01.data["a"].should == 1
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
task02 = a.shift
|
46
|
+
task02.finished?.should == false
|
47
|
+
task02.type == 'type1'
|
48
|
+
task02.key.should == 'task02'
|
49
|
+
task01.retry_count.should == 0
|
50
|
+
task02.data["a"].should == 2
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
task03 = a.shift
|
53
|
+
task03.finished?.should == false
|
54
|
+
task03.type == 'type1'
|
55
|
+
task03.key.should == 'task03'
|
56
|
+
task01.retry_count.should == 0
|
57
|
+
task03.data["a"].should == 3
|
55
58
|
|
56
59
|
a.empty?.should == true
|
57
60
|
end
|
@@ -65,11 +68,11 @@ describe Queue do
|
|
65
68
|
task01 = queue.poll(:now=>now+10)
|
66
69
|
task01.key.should == 'task01'
|
67
70
|
|
68
|
-
|
69
|
-
|
71
|
+
task02 = queue.poll(:now=>now+10)
|
72
|
+
task02.key.should == 'task02'
|
70
73
|
|
71
|
-
|
72
|
-
|
74
|
+
task03 = queue.poll(:now=>now+10)
|
75
|
+
task03.key.should == 'task03'
|
73
76
|
|
74
77
|
t4 = queue.poll(:now=>now+10)
|
75
78
|
t4.should == nil
|
@@ -81,14 +84,16 @@ describe Queue do
|
|
81
84
|
|
82
85
|
task01 = queue.poll(:now=>now+10)
|
83
86
|
task01.key.should == 'task01'
|
87
|
+
task01.retry_count.should == 0
|
84
88
|
|
85
|
-
|
86
|
-
|
89
|
+
task02 = queue.poll(:now=>now+10)
|
90
|
+
task02.should == nil
|
87
91
|
|
88
92
|
task01.release!(:now=>now+10)
|
89
93
|
|
90
|
-
|
91
|
-
|
94
|
+
task03 = queue.poll(:now=>now+11)
|
95
|
+
task03.key.should == 'task01'
|
96
|
+
task03.retry_count.should == 1
|
92
97
|
end
|
93
98
|
|
94
99
|
it 'timeout' do
|
@@ -97,12 +102,14 @@ describe Queue do
|
|
97
102
|
|
98
103
|
task01 = queue.poll(:now=>now+10, :alive_time=>10)
|
99
104
|
task01.key.should == 'task01'
|
105
|
+
task01.retry_count.should == 0
|
100
106
|
|
101
|
-
|
102
|
-
|
107
|
+
task02 = queue.poll(:now=>now+15)
|
108
|
+
task02.should == nil
|
103
109
|
|
104
|
-
|
105
|
-
|
110
|
+
task03 = queue.poll(:now=>now+20)
|
111
|
+
task03.key.should == 'task01'
|
112
|
+
task03.retry_count.should == 1
|
106
113
|
end
|
107
114
|
|
108
115
|
it 'heartbeat' do
|
@@ -111,14 +118,16 @@ describe Queue do
|
|
111
118
|
|
112
119
|
task01 = queue.poll(:now=>now+10, :alive_time=>10)
|
113
120
|
task01.key.should == 'task01'
|
121
|
+
task01.retry_count.should == 0
|
114
122
|
|
115
123
|
task01.heartbeat!(:alive_time=>15, :now=>now+10)
|
116
124
|
|
117
|
-
|
118
|
-
|
125
|
+
task02 = queue.poll(:now=>now+20)
|
126
|
+
task02.should == nil
|
119
127
|
|
120
|
-
|
121
|
-
|
128
|
+
task03 = queue.poll(:now=>now+30)
|
129
|
+
task03.key.should == 'task01'
|
130
|
+
task03.retry_count.should == 1
|
122
131
|
end
|
123
132
|
|
124
133
|
it 'retry' do
|
@@ -127,14 +136,16 @@ describe Queue do
|
|
127
136
|
|
128
137
|
task01 = queue.poll(:now=>now+10, :alive_time=>10)
|
129
138
|
task01.key.should == 'task01'
|
139
|
+
task01.retry_count.should == 0
|
130
140
|
|
131
141
|
task01.retry!(:retry_wait=>15, :now=>now+10)
|
132
142
|
|
133
|
-
|
134
|
-
|
143
|
+
task02 = queue.poll(:now=>now+20)
|
144
|
+
task02.should == nil
|
135
145
|
|
136
|
-
|
137
|
-
|
146
|
+
task03 = queue.poll(:now=>now+30)
|
147
|
+
task03.key.should == 'task01'
|
148
|
+
task03.retry_count.should == 1
|
138
149
|
end
|
139
150
|
|
140
151
|
it 'froce_finish' do
|
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.8.
|
4
|
+
version: 0.8.23
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|