que 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f2f4b100178a6d42d65ee4de7c3f1d1b71cc2112
4
- data.tar.gz: c85c868eca099620035367f303f1db4ad2d73cf4
3
+ metadata.gz: ea48a3d241852be82ac3310d9a9b77dd5c752c66
4
+ data.tar.gz: 9c959569e9b5eb520dffde4a21f08875d9efbbce
5
5
  SHA512:
6
- metadata.gz: 0c88982605dabab6aa9a026859c69c0c979b6f0b85af24e444462befdc9945fb905d5ef884a7fb364c3bc00f388771c6b636d41afc09f085dd245761afbb32e9
7
- data.tar.gz: fd1695313794a1ac4e9d6bc9f3ad00c77ba8a07532a19972b8b1cefddb367bdb676f5295e62a7847b5d58be84c56baed02f35507a032f7c9ed1a52e17d95b585
6
+ metadata.gz: 794d3b3a6e55beaa75a8142324a8eac2512505114b401aa1b306ef20e0e08f58913a8bb6685dd599a4bcadbdfec295c97637b22b6ddfdf8d2862225444e76ced
7
+ data.tar.gz: b186100af249195025f731e551155dcdcd9e4797a7164d0c71a9604842e5a3d604bd47f6b5331e0773bdfad1018332d21463266675251afeb5034407fc7dcae6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ### 0.10.0 (2015-03-18)
2
+
3
+ * When working jobs via the rake task, Rails applications are now eager-loaded if present, to avoid problems with multithreading and autoloading. (#96) (hmarr)
4
+
5
+ * The que:work rake task now uses whatever logger Que is configured to use normally, rather than forcing the use of STDOUT. (#95)
6
+
7
+ * Add Que.transaction() helper method, to aid in transaction management in migrations or when the user's ORM doesn't provide one. (#81)
8
+
1
9
  ### 0.9.2 (2015-02-05)
2
10
 
3
11
  * Fix a bug wherein the at_exit hook in the railtie wasn't waiting for jobs to finish before exiting.
@@ -20,6 +20,24 @@ Unlike DelayedJob, however, there is currently no maximum number of failures aft
20
20
 
21
21
  If you're using an error notification system (highly recommended, of course), you can hook Que into it by setting a callable as the error handler:
22
22
 
23
- Que.error_handler = proc do |error|
24
- # Do whatever you want with the error object.
23
+ Que.error_handler = proc do |error, job|
24
+ # Do whatever you want with the error object or job row here.
25
+
26
+ # Note that the job passed is not the actual job object, but the hash
27
+ # representing the job row in the database, which looks like:
28
+
29
+ # {
30
+ # "queue" => "my_queue",
31
+ # "priority" => 100,
32
+ # "run_at" => 2015-03-06 11:07:08 -0500,
33
+ # "job_id" => 65,
34
+ # "job_class" => "MyJob",
35
+ # "args" => ['argument', 78],
36
+ # "error_count" => 0
37
+ # }
38
+
39
+ # This is done because the job may not have been able to be deserialized
40
+ # properly, if the name of the job class was changed or the job is being
41
+ # retrieved and worked by the wrong app. The job argument may also be
42
+ # nil, if there was a connection failure or something similar.
25
43
  end
data/lib/que.rb CHANGED
@@ -96,6 +96,32 @@ module Que
96
96
  @log_formatter ||= JSON_MODULE.method(:dump)
97
97
  end
98
98
 
99
+ # A helper method to manage transactions, used mainly by the migration
100
+ # system. It's available for general use, but if you're using an ORM that
101
+ # provides its own transaction helper, be sure to use that instead, or the
102
+ # two may interfere with one another.
103
+ def transaction
104
+ adapter.checkout do
105
+ if adapter.in_transaction?
106
+ yield
107
+ else
108
+ begin
109
+ execute "BEGIN"
110
+ yield
111
+ rescue => error
112
+ raise
113
+ ensure
114
+ # Handle a raised error or a killed thread.
115
+ if error || Thread.current.status == 'aborting'
116
+ execute "ROLLBACK"
117
+ else
118
+ execute "COMMIT"
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
99
125
  # Copy some of the Worker class' config methods here for convenience.
100
126
  [:mode, :mode=, :worker_count, :worker_count=, :wake_interval, :wake_interval=, :wake!, :wake_all!].each do |meth|
101
127
  define_method(meth) { |*args| Worker.send(meth, *args) }
@@ -7,7 +7,7 @@ module Que
7
7
 
8
8
  class << self
9
9
  def migrate!(options = {:version => CURRENT_VERSION})
10
- transaction do
10
+ Que.transaction do
11
11
  version = options[:version]
12
12
 
13
13
  if (current = db_version) == version
@@ -52,28 +52,6 @@ module Que
52
52
  i = version.to_i
53
53
  Que.execute "COMMENT ON TABLE que_jobs IS '#{i}'" unless i.zero?
54
54
  end
55
-
56
- def transaction
57
- Que.adapter.checkout do
58
- if Que.adapter.in_transaction?
59
- yield
60
- else
61
- begin
62
- Que.execute "BEGIN"
63
- yield
64
- rescue => error
65
- raise
66
- ensure
67
- # Handle a raised error or a killed thread.
68
- if error || Thread.current.status == 'aborting'
69
- Que.execute "ROLLBACK"
70
- else
71
- Que.execute "COMMIT"
72
- end
73
- end
74
- end
75
- end
76
- end
77
55
  end
78
56
  end
79
57
  end
@@ -1,9 +1,14 @@
1
1
  namespace :que do
2
2
  desc "Process Que's jobs using a worker pool"
3
3
  task :work => :environment do
4
- require 'logger'
4
+ if defined?(::Rails) && Rails.respond_to?(:application)
5
+ # ActiveSupport's dependency autoloading isn't threadsafe, and Que uses
6
+ # multiple threads, which means that eager loading is necessary. Rails
7
+ # explicitly prevents eager loading when the environment task is invoked,
8
+ # so we need to manually eager load the app here.
9
+ Rails.application.eager_load!
10
+ end
5
11
 
6
- Que.logger = Logger.new(STDOUT)
7
12
  Que.logger.level = Logger.const_get((ENV['QUE_LOG_LEVEL'] || 'INFO').upcase)
8
13
  Que.worker_count = (ENV['QUE_WORKER_COUNT'] || 4).to_i
9
14
  Que.wake_interval = (ENV['QUE_WAKE_INTERVAL'] || 0.1).to_f
data/lib/que/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Que
2
- Version = '0.9.2'
2
+ Version = '0.10.0'
3
3
  end
@@ -79,37 +79,4 @@ describe Que::Migrations do
79
79
  Que::Migrations.migrate!
80
80
  DB.table_exists?(:que_jobs).should be true
81
81
  end
82
-
83
- it "should use transactions to protect its migrations from errors" do
84
- proc do
85
- Que::Migrations.transaction do
86
- Que.execute "DROP TABLE que_jobs"
87
- Que.execute "invalid SQL syntax"
88
- end
89
- end.should raise_error(PG::Error)
90
-
91
- DB.table_exists?(:que_jobs).should be true
92
- end
93
-
94
- # In Ruby 1.9, it's impossible to tell inside an ensure block whether the
95
- # currently executing thread has been killed.
96
- unless RUBY_VERSION.start_with?('1.9')
97
- it "should use transactions to protect its migrations from killed threads" do
98
- q = Queue.new
99
-
100
- t = Thread.new do
101
- Que::Migrations.transaction do
102
- Que.execute "DROP TABLE que_jobs"
103
- q.push :go!
104
- sleep
105
- end
106
- end
107
-
108
- q.pop
109
- t.kill
110
- t.join
111
-
112
- DB.table_exists?(:que_jobs).should be true
113
- end
114
- end
115
82
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Que, '.transaction' do
4
+ it "should use a transaction to rollback changes in the event of an error" do
5
+ proc do
6
+ Que.transaction do
7
+ Que.execute "DROP TABLE que_jobs"
8
+ Que.execute "invalid SQL syntax"
9
+ end
10
+ end.should raise_error(PG::Error)
11
+
12
+ DB.table_exists?(:que_jobs).should be true
13
+ end
14
+
15
+ unless RUBY_VERSION.start_with?('1.9')
16
+ it "should rollback correctly in the event of a killed thread" do
17
+ q = Queue.new
18
+
19
+ t = Thread.new do
20
+ Que.transaction do
21
+ Que.execute "DROP TABLE que_jobs"
22
+ q.push :go!
23
+ sleep
24
+ end
25
+ end
26
+
27
+ q.pop
28
+ t.kill
29
+ t.join
30
+
31
+ DB.table_exists?(:que_jobs).should be true
32
+ end
33
+ end
34
+ end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: que
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Hanks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-06 00:00:00.000000000 Z
11
+ date: 2015-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  description: A job queue that uses PostgreSQL's advisory locks for speed and reliability.
@@ -31,9 +31,9 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
- - .gitignore
35
- - .rspec
36
- - .travis.yml
34
+ - ".gitignore"
35
+ - ".rspec"
36
+ - ".travis.yml"
37
37
  - CHANGELOG.md
38
38
  - Gemfile
39
39
  - LICENSE.txt
@@ -97,6 +97,7 @@ files:
97
97
  - spec/unit/run_spec.rb
98
98
  - spec/unit/states_spec.rb
99
99
  - spec/unit/stats_spec.rb
100
+ - spec/unit/transaction_spec.rb
100
101
  - spec/unit/work_spec.rb
101
102
  - spec/unit/worker_spec.rb
102
103
  - tasks/benchmark.rb
@@ -112,17 +113,17 @@ require_paths:
112
113
  - lib
113
114
  required_ruby_version: !ruby/object:Gem::Requirement
114
115
  requirements:
115
- - - '>='
116
+ - - ">="
116
117
  - !ruby/object:Gem::Version
117
118
  version: '0'
118
119
  required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  requirements:
120
- - - '>='
121
+ - - ">="
121
122
  - !ruby/object:Gem::Version
122
123
  version: '0'
123
124
  requirements: []
124
125
  rubyforge_project:
125
- rubygems_version: 2.2.2
126
+ rubygems_version: 2.4.6
126
127
  signing_key:
127
128
  specification_version: 4
128
129
  summary: A PostgreSQL-based Job Queue
@@ -150,5 +151,6 @@ test_files:
150
151
  - spec/unit/run_spec.rb
151
152
  - spec/unit/states_spec.rb
152
153
  - spec/unit/stats_spec.rb
154
+ - spec/unit/transaction_spec.rb
153
155
  - spec/unit/work_spec.rb
154
156
  - spec/unit/worker_spec.rb