perfectqueue 0.7.15 → 0.7.16
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.rb +8 -7
- data/lib/perfectqueue/version.rb +1 -1
- data/test/stress.rb +7 -7
- metadata +5 -5
data/ChangeLog
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
|
2
|
+
== 2012-01-10 version 0.7.16
|
3
|
+
|
4
|
+
* RDBBackend: sleep 0.5 before retrying failed transaction by deadlock
|
5
|
+
* RDBBackend: release the row lock acquired by SELECT .. FOR UPDATE before retrying it
|
6
|
+
|
7
|
+
|
2
8
|
== 2012-01-10 version 0.7.15
|
3
9
|
|
4
10
|
* RDBBackend: Fixed locking routines to work with possibility of deadlocks
|
@@ -62,14 +62,15 @@ SQL
|
|
62
62
|
block.call
|
63
63
|
rescue
|
64
64
|
# workaround for "Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction" error
|
65
|
-
err = ([$!] + $!.backtrace.map {|bt| " #{bt}" }).join("\n")
|
66
65
|
if $!.to_s.include?('try restarting transaction')
|
66
|
+
err = ([$!] + $!.backtrace.map {|bt| " #{bt}" }).join("\n")
|
67
67
|
retry_count += 1
|
68
68
|
if retry_count < MAX_RETRY
|
69
|
-
STDERR.puts err + "\
|
69
|
+
STDERR.puts err + "\n retrying."
|
70
|
+
sleep 0.5
|
70
71
|
retry
|
71
72
|
else
|
72
|
-
STDERR.puts err + "\
|
73
|
+
STDERR.puts err + "\n abort."
|
73
74
|
end
|
74
75
|
end
|
75
76
|
raise
|
@@ -91,9 +92,9 @@ SQL
|
|
91
92
|
|
92
93
|
def acquire(timeout, now=Time.now.to_i)
|
93
94
|
connect {
|
94
|
-
|
95
|
-
|
96
|
-
|
95
|
+
while true
|
96
|
+
rows = 0
|
97
|
+
@db.transaction do
|
97
98
|
@db.fetch(@sql, now, now) {|row|
|
98
99
|
unless row[:created_at]
|
99
100
|
# finished/canceled task
|
@@ -110,8 +111,8 @@ SQL
|
|
110
111
|
|
111
112
|
rows += 1
|
112
113
|
}
|
113
|
-
break nil if rows < MAX_SELECT_ROW
|
114
114
|
end
|
115
|
+
break nil if rows < MAX_SELECT_ROW
|
115
116
|
end
|
116
117
|
}
|
117
118
|
end
|
data/lib/perfectqueue/version.rb
CHANGED
data/test/stress.rb
CHANGED
@@ -14,24 +14,24 @@ class StressTest
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class ThreadMain < Thread
|
17
|
-
def initialize(key_prefix, db, num
|
17
|
+
def initialize(key_prefix, db, num)
|
18
18
|
@key_prefix = key_prefix
|
19
19
|
@db = db
|
20
20
|
@num = num
|
21
|
-
@now = now
|
22
21
|
super(&method(:run))
|
23
22
|
end
|
24
23
|
|
25
24
|
def run
|
26
25
|
@num.times {|i|
|
27
|
-
|
28
|
-
|
26
|
+
now = Time.now.to_i
|
27
|
+
@db.submit("#{@key_prefix}-#{i}", "data", now)
|
28
|
+
token, task = @db.acquire(now+60)
|
29
29
|
if token == nil
|
30
30
|
puts "acquire failed"
|
31
31
|
next
|
32
32
|
end
|
33
|
-
@db.update(token,
|
34
|
-
@db.finish(token,
|
33
|
+
@db.update(token, now+70)
|
34
|
+
@db.finish(token, now+80)
|
35
35
|
}
|
36
36
|
end
|
37
37
|
end
|
@@ -41,7 +41,7 @@ class StressTest
|
|
41
41
|
key_prefix = "stress-#{'%08x'%rand(2**32)}"
|
42
42
|
now = Time.now
|
43
43
|
@thread.times {|i|
|
44
|
-
threads << ThreadMain.new("#{key_prefix}-#{i}", @db_proc.call, @npt
|
44
|
+
threads << ThreadMain.new("#{key_prefix}-#{i}", @db_proc.call, @npt)
|
45
45
|
}
|
46
46
|
threads.each {|t|
|
47
47
|
t.join
|
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.16
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-11 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|
16
|
-
requirement: &
|
16
|
+
requirement: &13164680 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.26.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *13164680
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: aws-sdk
|
27
|
-
requirement: &
|
27
|
+
requirement: &13164120 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: 1.1.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *13164120
|
36
36
|
description:
|
37
37
|
email: frsyuki@gmail.com
|
38
38
|
executables:
|