rocketjob 3.0.0.beta3 → 3.0.0.rc1

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: 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