perfectqueue 0.8.22 → 0.8.23
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 +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
|