que 0.7.0 → 0.7.1
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.
- checksums.yaml +13 -5
- data/CHANGELOG.md +6 -0
- data/lib/que/adapters/base.rb +22 -5
- data/lib/que/version.rb +1 -1
- data/spec/adapters/active_record_spec.rb +29 -0
- data/spec/spec_helper.rb +5 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjYzZDkwOTBkNmUxYjIxZjVkZGEzOTRiZjBmOWQ1OWZiNjUxOTRkYw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MzIyOTk0ZTE1NGIzMTIwOGEzM2ZkZTAyMzM1NDE5ZDM0YjcwZTUxMQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OGVmMTc2MzNlYjkyNTQwYzhiNDZmMDJlOTdhMDViOGFhYzYzMzgzMGQ0MzY5
|
10
|
+
YzY1OTIzYjg5YmZjZDcyNjJkOWM2ZmY4MWFjNjQ0YmYzODQ4NmM5Y2I0Yjhi
|
11
|
+
Y2Q0YTkwYTk4NDlmNDM1Y2E5OWJlYWE1OWE2MDY5YzIxYTQ0ZWE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NzlmZWZmY2RjZjc0OGJkNzJhODA5NWY5ZmZkYzY0M2VlMTk5M2NkODQyMmQ1
|
14
|
+
OWYzNjExYmMxMTdmYzQ5NGQ1NTBlNzY3NTA2MjQ5ZDQwZDM3M2FmMTY2ODUz
|
15
|
+
OTVjZjA0ZGVhM2VmZTFkMTViMmI2M2ZmYWM3M2U0N2Y4N2QyNmU=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
### 0.7.1 (2014-04-29)
|
2
|
+
|
3
|
+
* Fix errors with prepared statements when ActiveRecord reconnects to the database. (dvrensk)
|
4
|
+
|
5
|
+
* Don't use prepared statements when inside a transaction. This negates the risk of a prepared statement error harming the entire transaction. The query that benefits the most from preparation is the job-lock CTE, which is never run in a transaction, so the performance impact should be negligible.
|
6
|
+
|
1
7
|
### 0.7.0 (2014-04-09)
|
2
8
|
|
3
9
|
* `JobClass.queue(*args)` has been deprecated and will be removed in version 1.0.0. Please use `JobClass.enqueue(*args)` instead.
|
data/lib/que/adapters/base.rb
CHANGED
@@ -58,14 +58,31 @@ module Que
|
|
58
58
|
|
59
59
|
def execute_prepared(name, params)
|
60
60
|
checkout do |conn|
|
61
|
+
# Prepared statement errors have the potential to foul up the entire
|
62
|
+
# transaction, so if we're in one, err on the side of safety.
|
63
|
+
return execute_sql(SQL[name], params) if in_transaction?
|
64
|
+
|
61
65
|
statements = @prepared_statements[conn] ||= {}
|
62
66
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
+
begin
|
68
|
+
unless statements[name]
|
69
|
+
conn.prepare("que_#{name}", SQL[name])
|
70
|
+
prepared_just_now = statements[name] = true
|
71
|
+
end
|
72
|
+
|
73
|
+
conn.exec_prepared("que_#{name}", params)
|
74
|
+
rescue ::PG::InvalidSqlStatementName => error
|
75
|
+
# Reconnections on ActiveRecord can cause the same connection
|
76
|
+
# objects to refer to new backends, so recover as well as we can.
|
67
77
|
|
68
|
-
|
78
|
+
unless prepared_just_now
|
79
|
+
Que.log :level => 'warn', :event => "reprepare_statement", :name => name
|
80
|
+
statements[name] = false
|
81
|
+
retry
|
82
|
+
end
|
83
|
+
|
84
|
+
raise error
|
85
|
+
end
|
69
86
|
end
|
70
87
|
end
|
71
88
|
|
data/lib/que/version.rb
CHANGED
@@ -31,6 +31,35 @@ unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
context "if the connection goes down and is reconnected" do
|
35
|
+
before do
|
36
|
+
Que::Job.enqueue
|
37
|
+
ActiveRecord::Base.connection.reconnect!
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should recreate the prepared statements" do
|
41
|
+
expect { Que::Job.enqueue }.not_to raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should work properly even in a transaction" do
|
45
|
+
ActiveRecord::Base.transaction do
|
46
|
+
expect { Que::Job.enqueue }.not_to raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
DB[:que_jobs].count.should == 2
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should log this extraordinary event" do
|
53
|
+
$logger.messages.clear
|
54
|
+
Que::Job.enqueue
|
55
|
+
$logger.messages.count.should == 1
|
56
|
+
message = JSON.load($logger.messages.first)
|
57
|
+
message['lib'].should == 'que'
|
58
|
+
message['event'].should == 'reprepare_statement'
|
59
|
+
message['name'].should == 'insert_job'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
34
63
|
it "should instantiate args as ActiveSupport::HashWithIndifferentAccess" do
|
35
64
|
ArgsJob.enqueue :param => 2
|
36
65
|
Que::Job.work
|
data/spec/spec_helper.rb
CHANGED
@@ -63,6 +63,11 @@ def $logger.method_missing(m, message)
|
|
63
63
|
$logger_mutex.synchronize { messages << message }
|
64
64
|
end
|
65
65
|
|
66
|
+
# Object includes Kernel#warn which is not what we expect, so remove:
|
67
|
+
def $logger.warn(message)
|
68
|
+
method_missing(:warn, message)
|
69
|
+
end
|
70
|
+
|
66
71
|
|
67
72
|
|
68
73
|
# Helper to display spec descriptions.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: que
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Hanks
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -112,17 +112,17 @@ require_paths:
|
|
112
112
|
- lib
|
113
113
|
required_ruby_version: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - '>='
|
115
|
+
- - ! '>='
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
119
|
requirements:
|
120
|
-
- - '>='
|
120
|
+
- - ! '>='
|
121
121
|
- !ruby/object:Gem::Version
|
122
122
|
version: '0'
|
123
123
|
requirements: []
|
124
124
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.
|
125
|
+
rubygems_version: 2.2.2
|
126
126
|
signing_key:
|
127
127
|
specification_version: 4
|
128
128
|
summary: A PostgreSQL-based Job Queue
|