rocketjob 3.0.0.beta3 → 3.0.0.rc1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2893cad7faa49cc61dc42a18e1769b7e4b0684cd
4
- data.tar.gz: 0484cd6616b0d1dbef6ecd67d0235ef0d3834623
3
+ metadata.gz: 5e00bccf78b1addfe4e7714526085787e009c852
4
+ data.tar.gz: bdeb1d7b808c5b589421086254f7f301837d513c
5
5
  SHA512:
6
- metadata.gz: 13e4e156847cfebb938b7700eaddda5899b79f816d690b3555d77aa6b993cc046e76c6b796404e83f3767ce482a4db50134a7037a6e7ba3ea9fd85b296834689
7
- data.tar.gz: 60856f69ce93c2c0143cbf349f8c9eb393c038e44897d3f1ab16c550cec10557656628892d92ce6fbc833c5353f7b4a936a790932c219b9df7c8384cdd6f360d
6
+ metadata.gz: 0e1a31bdef5185bf7ba414d847d49037871a6b913e3eeda57b98f4a37101b93bd63de8f55c36cfa8ee4cf9fabf55486b01ac4d1ade391104067f45b06a31bb13
7
+ data.tar.gz: 13289e381b6f879d5da29f0b633316b1b4888dac9c1f5df1bd1048bf91acd122f64ce9837edf5ef631f2f4e8811dde3a008c43bb953557a3560eba2ee25c10d8
data/README.md CHANGED
@@ -19,8 +19,22 @@ Checkout http://rocketjob.io/
19
19
 
20
20
  ## Upgrading to V3
21
21
 
22
- * V3 replaces MongoMapper with Mongoid which supports the latest MongoDB Ruby client driver.
23
- * Replase usages of `rocket_job do` to set default values:
22
+ V3 replaces MongoMapper with Mongoid which supports the latest MongoDB Ruby client driver.
23
+
24
+ ### Upgrading Mongo Config file
25
+ Replace `mongo.yml` with `mongoid.yml`.
26
+
27
+ Start with the sample [mongoid.yml](https://github.com/rocketjob/rocketjob/blob/feature/mongoid/test/config/mongoid.yml).
28
+
29
+ For more information on the new [Mongoid config file](https://docs.mongodb.com/ruby-driver/master/tutorials/5.1.0/mongoid-installation/).
30
+
31
+ Note: The `rocketjob` and `rocketjob_slices` clients in the above `mongoid.yml` file are required.
32
+
33
+ ### Other changes
34
+
35
+ * Arguments are no longer supported, use fields for defining all named arguments for a job.
36
+
37
+ * Replace usages of `rocket_job do` to set default values:
24
38
 
25
39
  ~~~ruby
26
40
  rocket_job do |job|
@@ -52,12 +66,11 @@ With:
52
66
  field :priority, type: Integer, default: 50, user_editable: true
53
67
  ~~~
54
68
 
55
-
56
69
  ## Ruby Support
57
70
 
58
71
  Rocket Job is tested and supported on the following Ruby platforms:
59
- - Ruby 2.1, 2.2, 2.3, and above
60
- - JRuby 1.7.23, 9.0.5 and above
72
+ - Ruby 2.1, 2.2, 2.3, 2.4, and above
73
+ - JRuby 9.0.5 and above
61
74
 
62
75
  ## Versioning
63
76
 
@@ -0,0 +1,74 @@
1
+ module RocketJob
2
+ # Information about a server currently working on a job
3
+ class ActiveWorker
4
+ # When this server started working on this job / slice
5
+ attr_accessor :started_at
6
+
7
+ attr_accessor :name, :job
8
+
9
+ # Returns [Hash<String:ActiveWorker>] hash of all servers sorted by name
10
+ # and what they are currently working on.
11
+ # Returns {} if no servers are currently busy doing any work
12
+ #
13
+ # Parameters
14
+ # server_name: [String]
15
+ # Only jobs running on the specified server
16
+ def self.all(server_name = nil)
17
+ servers = []
18
+ # Need paused, failed or aborted since servers may still be working on active slices
19
+ query = RocketJob::Job.where(:state.in => [:running, :paused, :failed, :aborted])
20
+ query = query.where(worker_name: /\A#{server_name}/) if server_name
21
+ query.each do |job|
22
+ servers += job.rocket_job_active_workers
23
+ end
24
+ servers
25
+ end
26
+
27
+ # Requeues all jobs for which the workers have disappeared
28
+ def self.requeue_zombies
29
+ all.each do |active_worker|
30
+ next if !active_worker.zombie? || !active_worker.job.may_requeue?
31
+ active_worker.job.requeue!(active_worker.server_name)
32
+ end
33
+ end
34
+
35
+ def initialize(name, started_at, job)
36
+ @name = name
37
+ @started_at = started_at
38
+ @job = job
39
+ end
40
+
41
+ # Duration in human readable form
42
+ def duration
43
+ RocketJob.seconds_as_duration(duration_s)
44
+ end
45
+
46
+ # Number of seconds this server has been working on this job / slice
47
+ def duration_s
48
+ Time.now - started_at
49
+ end
50
+
51
+ # Returns [String] the name of the server running this worker
52
+ def server_name
53
+ if match = name.match(/(.*:.*):.*/)
54
+ match[1]
55
+ else
56
+ name
57
+ end
58
+ end
59
+
60
+ def server
61
+ @server ||= RocketJob::Server.where(name: server_name).first
62
+ end
63
+
64
+ # The server on which this worker was running is no longer running
65
+ def zombie?
66
+ server.nil?
67
+ end
68
+
69
+ def name=(name)
70
+ @server = nil
71
+ @name = name
72
+ end
73
+ end
74
+ end
@@ -14,17 +14,12 @@ module RocketJob
14
14
  @mongo_config = 'config/mongoid.yml'
15
15
  end
16
16
 
17
+ # Loads the queue with jobs to be processed once the queue is loaded.
18
+ # Retain the first and last job for timings, all others are destroyed on completion.
17
19
  def run_test_case(count = self.count)
18
20
  raise 'Please start servers before starting the performance test' if RocketJob::Server.where(:state.in => ['running', 'paused']).count == 0
19
21
 
20
- self.servers = 0
21
- self.workers = 0
22
- RocketJob::Server.running.each do |server|
23
- next if server.zombie?
24
- self.servers += 1
25
- self.workers += server.heartbeat.workers
26
- end
27
- puts "Running: #{workers} workers, distributed across #{servers} servers"
22
+ count_running_workers
28
23
 
29
24
  puts 'Waiting for workers to pause'
30
25
  RocketJob::Server.pause_all
@@ -54,6 +49,9 @@ module RocketJob
54
49
  end
55
50
 
56
51
  duration = last.reload.completed_at - first.reload.started_at
52
+ first.destroy
53
+ last.destroy
54
+
57
55
  {count: count, duration: duration, jobs_per_second: (count.to_f / duration).to_i}
58
56
  end
59
57
 
@@ -86,5 +84,16 @@ module RocketJob
86
84
  parser.parse! argv
87
85
  end
88
86
 
87
+ def count_running_workers
88
+ self.servers = 0
89
+ self.workers = 0
90
+ RocketJob::Server.running.each do |server|
91
+ next if server.zombie?
92
+ self.servers += 1
93
+ self.workers += server.heartbeat.workers
94
+ end
95
+ puts "Running: #{workers} workers, distributed across #{servers} servers"
96
+ end
97
+
89
98
  end
90
99
  end
@@ -76,7 +76,7 @@ module RocketJob
76
76
  apply_defaults
77
77
  self
78
78
  else
79
- raise Mongoid::Error::DocumentNotFound, "Document match #{_id.inspect} does not exist in #{collection.name} collection"
79
+ raise(Mongoid::Errors::DocumentNotFound.new(self.class, id))
80
80
  end
81
81
  end
82
82
 
@@ -77,7 +77,7 @@ module RocketJob
77
77
 
78
78
  event :requeue do
79
79
  transitions from: :running, to: :queued,
80
- if: -> _worker_name { worker_name == _worker_name },
80
+ if: -> server_name { worker_name.start_with?(server_name) },
81
81
  after: :rocket_job_clear_started_at
82
82
  end
83
83
  end
@@ -43,7 +43,7 @@ module RocketJob
43
43
 
44
44
  # Throttle to add when the throttle is exceeded
45
45
  def throttle_filter
46
- {:_type.nin => self.class.name}
46
+ {:_type.nin => [self.class.name]}
47
47
  end
48
48
 
49
49
  # Returns [Boolean] whether the throttle for this job has been exceeded
@@ -62,9 +62,13 @@ module RocketJob
62
62
 
63
63
  # Merge filter(s)
64
64
  def throttle_merge_filter(target, source)
65
- source.each_key do |k, v|
66
- previous = target[k]
67
- target[k] = previous ? (Array(previous) << v) : v
65
+ source.each_pair do |k, v|
66
+ target[k] =
67
+ if previous = target[k]
68
+ v.is_a?(Array) ? previous + v : v
69
+ else
70
+ v
71
+ end
68
72
  end
69
73
  end
70
74
 
@@ -169,9 +169,9 @@ module RocketJob
169
169
  end
170
170
 
171
171
  # Returns [Hash<String:[Array<ActiveWorker>]>] All servers actively working on this job
172
- def rocket_job_active_servers
173
- return {} unless running?
174
- {worker_name => [ActiveServer.new(worker_name, started_at, self)]}
172
+ def rocket_job_active_workers(server_name = nil)
173
+ return [] if !running? || (server_name && !worker_name.start_with(server_name))
174
+ [ActiveWorker.new(worker_name, started_at, self)]
175
175
  end
176
176
 
177
177
  end
@@ -266,25 +266,23 @@ module RocketJob
266
266
  workers.shift
267
267
  else
268
268
  # Timeout waiting for worker to stop
269
- begin
270
- find_and_update(
271
- 'heartbeat.updated_at' => Time.now,
272
- 'heartbeat.workers' => worker_count
273
- )
274
- rescue Mongoid::Errors::DocumentNotFound
275
- logger.warn('Server has been destroyed. Going down hard!')
276
- break
277
- end
269
+ find_and_update(
270
+ 'heartbeat.updated_at' => Time.now,
271
+ 'heartbeat.workers' => worker_count
272
+ )
278
273
  end
279
274
  end
280
275
 
276
+ logger.info 'Shutdown'
277
+ rescue Mongoid::Errors::DocumentNotFound
278
+ logger.warn('Server has been destroyed. Going down hard!')
279
+ rescue Exception => exc
280
+ logger.error('RocketJob::Server is stopping due to an exception', exc)
281
+ ensure
281
282
  # Logs the backtrace for each running worker
282
283
  if SemanticLogger::VERSION.to_i >= 4
283
284
  workers.each { |thread| logger.backtrace(thread: thread) }
284
285
  end
285
- logger.info 'Shutdown'
286
- rescue Exception => exc
287
- logger.error('RocketJob::Server is stopping due to an exception', exc)
288
286
  end
289
287
 
290
288
  # Returns [Fixnum] number of workers (threads) that are alive
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module RocketJob #:nodoc
3
- VERSION = '3.0.0.beta3'
3
+ VERSION = '3.0.0.rc1'
4
4
  end
@@ -99,7 +99,7 @@ module RocketJob
99
99
  def process_available_jobs
100
100
  # Only clear out the current_filter after every `re_check_seconds`
101
101
  time = Time.now
102
- if (time - @re_check_start) > re_check_seconds
102
+ if (time - @re_check_start) > re_check_seconds.to_f
103
103
  @recheck_start = time
104
104
  self.current_filter = filter.dup
105
105
  end
data/lib/rocketjob.rb CHANGED
@@ -6,7 +6,7 @@ require 'rocket_job/version'
6
6
 
7
7
  # @formatter:off
8
8
  module RocketJob
9
- autoload :ActiveServer, 'rocket_job/active_server'
9
+ autoload :ActiveWorker, 'rocket_job/active_worker'
10
10
  autoload :CLI, 'rocket_job/cli'
11
11
  autoload :Config, 'rocket_job/config'
12
12
  autoload :DirmonEntry, 'rocket_job/dirmon_entry'
@@ -171,28 +171,26 @@ module Plugins
171
171
  end
172
172
  end
173
173
 
174
- describe '#rocket_job_active_servers' do
174
+ describe '#rocket_job_active_workers' do
175
175
  before do
176
176
  @job = QuietJob.create!
177
177
  @worker = RocketJob::Server.create!(name: 'worker:123')
178
178
  end
179
179
 
180
180
  it 'should return empty hash for no active jobs' do
181
- assert_equal({}, @job.rocket_job_active_servers)
181
+ assert_equal([], @job.rocket_job_active_workers)
182
182
  end
183
183
 
184
184
  it 'should return active servers' do
185
185
  assert job = RocketJob::Job.rocket_job_next_job(@worker.name)
186
- assert active = job.rocket_job_active_servers
186
+ assert active = job.rocket_job_active_workers
187
187
  assert_equal 1, active.size
188
- assert active_servers = active[@worker.name]
189
- assert_equal 1, active_servers.size
190
- assert active_server = active_servers.first
191
- assert_equal @job.id, active_server.job.id
192
- assert_equal @worker.name, active_server.name
193
- assert_equal job.started_at, active_server.started_at
194
- assert active_server.duration_s
195
- assert active_server.duration
188
+ assert active_worker = active.first
189
+ assert_equal @job.id, active_worker.job.id
190
+ assert_equal @worker.name, active_worker.name
191
+ assert_equal job.started_at, active_worker.started_at
192
+ assert active_worker.duration_s
193
+ assert active_worker.duration
196
194
  end
197
195
  end
198
196
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.beta3
4
+ version: 3.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-16 00:00:00.000000000 Z
11
+ date: 2016-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -80,7 +80,7 @@ files:
80
80
  - Rakefile
81
81
  - bin/rocketjob
82
82
  - bin/rocketjob_perf
83
- - lib/rocket_job/active_server.rb
83
+ - lib/rocket_job/active_worker.rb
84
84
  - lib/rocket_job/cli.rb
85
85
  - lib/rocket_job/config.rb
86
86
  - lib/rocket_job/dirmon_entry.rb
@@ -1,48 +0,0 @@
1
- module RocketJob
2
- # Information about a server currently working on a job
3
- class ActiveServer
4
- # When this server started working on this job / slice
5
- attr_accessor :started_at
6
-
7
- attr_accessor :name, :job
8
-
9
- # Returns [Hash<String:ActiveWorker>] hash of all servers sorted by name
10
- # and what they are currently working on.
11
- # Returns {} if no servers are currently busy doing any work
12
- def self.all
13
- servers = {}
14
- # Need paused, failed or aborted since servers may still be working on active slices
15
- RocketJob::Job.where(state: [:running, :paused, :failed, :aborted]).each do |job|
16
- job.rocket_job_active_servers.each_pair do |name, active_server|
17
- (servers[name] ||= []) << active_server
18
- end
19
- end
20
- servers
21
- end
22
-
23
- def initialize(name, started_at, job)
24
- @name = name
25
- @started_at = started_at
26
- @job = job
27
- end
28
-
29
- # Duration in human readable form
30
- def duration
31
- RocketJob.seconds_as_duration(duration_s)
32
- end
33
-
34
- # Number of seconds this server has been working on this job / slice
35
- def duration_s
36
- Time.now - started_at
37
- end
38
-
39
- def server
40
- @server ||= RocketJob::Server.find_by(name: name)
41
- end
42
-
43
- def name=(name)
44
- @server = nil
45
- @name = name
46
- end
47
- end
48
- end