que-scheduler 0.6.0 → 0.7.0

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: 0e2783e68e146ba7ba266c283c887e256963b451
4
- data.tar.gz: 55c52e08b23cab6ef75e3b9c8e8d0cc368f123c2
3
+ metadata.gz: a0e9f48536b268d1387f247f8a7ee52a55dbfef5
4
+ data.tar.gz: 148ab173c0eb5c22a6cfd6bf83fb7e846570c705
5
5
  SHA512:
6
- metadata.gz: 551365361fc0f13a520c396243577d972fed0b8b3dfe798fb92990f2d1b2779bf79544b9dfb6a258439bcd5bc17a773c45bb142fa39f3b9930eec8b7487fba5d
7
- data.tar.gz: 363661214b0d6375a813ecc68b9dbd04e1cf367dca2ff978a9047a7e2aa99825df1ae64ebda7f533919a628845f804cea4f8ea9c32a6cb805754c61a80e10f8e
6
+ metadata.gz: 508e5271f7f35b62b6704a4f7633d026e149ede22f7f6497af8296aed7fd5c1bfcd8d1fbdd6b4ce4ec03adc59dedae195500830453038bfe0f33fb77c99f49ec
7
+ data.tar.gz: f18b35343f7a9075db5771b2c2f2917fb49df8efcd81fe055e5c048e2742d21623051291d81f5527af7b15664e178cd3eeac9516cc96d5c11060cf1e233e593f
@@ -24,8 +24,15 @@ module Que
24
24
  ::ActiveRecord::Base.transaction do
25
25
  scheduler_job_args = SchedulerJobArgs.prepare_scheduler_job_args(options)
26
26
  logs = ["que-scheduler last ran at #{scheduler_job_args.last_run_time}."]
27
- result = enqueue_required_jobs(scheduler_job_args, logs)
28
- enqueue_self_again(scheduler_job_args, result.schedule_dictionary)
27
+
28
+ # It's possible one worker node has severe clock skew, and reports a time earlier than
29
+ # the last run. If so, log, and rescheduled with the same last run at.
30
+ if scheduler_job_args.as_time < scheduler_job_args.last_run_time
31
+ SchedulerJob.handle_clock_skew(scheduler_job_args, logs)
32
+ else
33
+ # Otherwise, run as normal
34
+ SchedulerJob.handle_normal_call(scheduler_job_args, logs)
35
+ end
29
36
 
30
37
  # Only now we're sure nothing errored, log the results
31
38
  logs.each { |str| Que.log(message: str) }
@@ -35,27 +42,6 @@ module Que
35
42
 
36
43
  private
37
44
 
38
- def enqueue_required_jobs(scheduler_job_args, logs)
39
- # Obtain the hash of missed jobs. Keys are the job classes, and the values are arrays
40
- # each containing more arrays for the arguments of that instance.
41
- result = ScheduleParser.parse(SchedulerJob.scheduler_config, scheduler_job_args)
42
- result.missed_jobs.each do |job_class, args_arrays|
43
- args_arrays.each do |args|
44
- logs << "que-scheduler enqueueing #{job_class} with options: #{args}"
45
- job_class.enqueue(*args)
46
- end
47
- end
48
- result
49
- end
50
-
51
- def enqueue_self_again(scheduler_job_args, new_job_dictionary)
52
- SchedulerJob.enqueue(
53
- last_run_time: scheduler_job_args.as_time.iso8601,
54
- job_dictionary: new_job_dictionary,
55
- run_at: scheduler_job_args.as_time.beginning_of_minute + SCHEDULER_FREQUENCY
56
- )
57
- end
58
-
59
45
  class << self
60
46
  def scheduler_config
61
47
  @scheduler_config ||= begin
@@ -80,6 +66,46 @@ module Que
80
66
  )
81
67
  end
82
68
  end
69
+
70
+ def handle_normal_call(scheduler_job_args, logs)
71
+ result = enqueue_required_jobs(scheduler_job_args, logs)
72
+ enqueue_self_again(
73
+ scheduler_job_args.as_time,
74
+ scheduler_job_args.as_time,
75
+ result.schedule_dictionary
76
+ )
77
+ end
78
+
79
+ def enqueue_required_jobs(scheduler_job_args, logs)
80
+ # Obtain the hash of missed jobs. Keys are the job classes, and the values are arrays
81
+ # each containing more arrays for the arguments of that instance.
82
+ result = ScheduleParser.parse(SchedulerJob.scheduler_config, scheduler_job_args)
83
+ result.missed_jobs.each do |job_class, args_arrays|
84
+ args_arrays.each do |args|
85
+ logs << "que-scheduler enqueueing #{job_class} with options: #{args}"
86
+ job_class.enqueue(*args)
87
+ end
88
+ end
89
+ result
90
+ end
91
+
92
+ def enqueue_self_again(last_full_execution, this_run_time, new_job_dictionary)
93
+ SchedulerJob.enqueue(
94
+ last_run_time: last_full_execution.iso8601,
95
+ job_dictionary: new_job_dictionary,
96
+ run_at: this_run_time.beginning_of_minute + SCHEDULER_FREQUENCY
97
+ )
98
+ end
99
+
100
+ def handle_clock_skew(scheduler_job_args, logs)
101
+ logs << 'que-scheduler detected worker with time older than last run. ' \
102
+ 'Rescheduling without enqueueing jobs.'
103
+ enqueue_self_again(
104
+ scheduler_job_args.last_run_time,
105
+ scheduler_job_args.as_time,
106
+ scheduler_job_args.job_dictionary
107
+ )
108
+ end
83
109
  end
84
110
  end
85
111
  end
@@ -1,5 +1,5 @@
1
1
  module Que
2
2
  module Scheduler
3
- VERSION = '0.6.0'.freeze
3
+ VERSION = '0.7.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: que-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Lascelles
@@ -25,61 +25,61 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: fugit
28
+ name: backports
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1'
33
+ version: '3.10'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1'
40
+ version: '3.10'
41
41
  - !ruby/object:Gem::Dependency
42
- name: hashie
42
+ name: fugit
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: '1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3'
54
+ version: '1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: que
56
+ name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.10'
61
+ version: '3'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.10'
68
+ version: '3'
69
69
  - !ruby/object:Gem::Dependency
70
- name: backports
70
+ name: que
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.10'
75
+ version: '0.10'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.10'
82
+ version: '0.10'
83
83
  description: A lightweight cron scheduler for the async job worker Que
84
84
  email:
85
85
  - harry@harrylascelles.com