sidekiq-superworker 0.0.4 → 0.0.5
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.
- data/app/models/sidekiq/superworker/subjob.rb +4 -0
- data/lib/sidekiq/superworker.rb +8 -0
- data/lib/sidekiq/superworker/logging.rb +30 -0
- data/lib/sidekiq/superworker/processor.rb +14 -7
- data/lib/sidekiq/superworker/subjob_processor.rb +11 -0
- data/lib/sidekiq/superworker/version.rb +1 -1
- metadata +3 -2
data/lib/sidekiq/superworker.rb
CHANGED
@@ -7,6 +7,14 @@ Dir.glob("#{directory}/../../app/models/sidekiq/superworker/*.rb") { |file| requ
|
|
7
7
|
|
8
8
|
module Sidekiq
|
9
9
|
module Superworker
|
10
|
+
def self.logger
|
11
|
+
Logging.logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.debug(message)
|
15
|
+
logger.debug(message)
|
16
|
+
end
|
17
|
+
|
10
18
|
def self.table_name_prefix
|
11
19
|
'sidekiq_superworker_'
|
12
20
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Sidekiq
|
2
|
+
module Superworker
|
3
|
+
class Logging
|
4
|
+
class Pretty < Logger::Formatter
|
5
|
+
def call(severity, time, program_name, message)
|
6
|
+
"#{Time.now.utc.iso8601} Superworker #{severity}: #{message}\n"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.initialize_logger(log_target = STDOUT)
|
11
|
+
@logger = Logger.new(log_target)
|
12
|
+
@logger.level = Logger::INFO
|
13
|
+
@logger.formatter = Pretty.new
|
14
|
+
@logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.logger
|
18
|
+
@logger || initialize_logger
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.logger=(log)
|
22
|
+
@logger = (log ? log : Logger.new('/dev/null'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def logger
|
26
|
+
Sidekiq::Superworker::Logging.logger
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -2,6 +2,7 @@ module Sidekiq
|
|
2
2
|
module Superworker
|
3
3
|
class Processor
|
4
4
|
def complete(item, new_thread=true)
|
5
|
+
Superworker.debug "JID ##{item['jid']}: Sidekiq job complete"
|
5
6
|
if new_thread
|
6
7
|
# Run this in a new thread so that its execution isn't considered to be part of the
|
7
8
|
# completed job's execution.
|
@@ -16,6 +17,7 @@ module Sidekiq
|
|
16
17
|
def error(worker, item, queue, exception)
|
17
18
|
raise "Job has nil jid: #{item}" if item['jid'].nil?
|
18
19
|
|
20
|
+
Superworker.debug "JID ##{item['jid']}: Error thrown"
|
19
21
|
subjob = find_subjob_by_jid(item['jid'])
|
20
22
|
SuperjobProcessor.error(subjob.superjob_id, worker, item, exception) if subjob
|
21
23
|
end
|
@@ -25,21 +27,26 @@ module Sidekiq
|
|
25
27
|
def complete_item(item)
|
26
28
|
raise "Job has nil jid: #{item}" if item['jid'].nil?
|
27
29
|
|
30
|
+
Superworker.debug "JID ##{item['jid']}: Passing job from Sidekiq to Superworker"
|
28
31
|
subjob = find_subjob_by_jid(item['jid'])
|
29
32
|
SubjobProcessor.complete(subjob) if subjob
|
30
33
|
end
|
31
34
|
|
32
|
-
# The job may've been created outside of sidekiq-superworker, so a nil return value
|
33
|
-
# this method isn't necessarily problematic
|
35
|
+
# Note: The job may've been created outside of sidekiq-superworker, so a nil return value
|
36
|
+
# for this method isn't necessarily problematic
|
34
37
|
def find_subjob_by_jid(jid)
|
38
|
+
Superworker.debug "JID ##{jid}: Trying to find Subjob"
|
35
39
|
# The job may complete before the Subjob record is created; in case that happens,
|
36
40
|
# we need to sleep briefly and requery.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
tries = 5
|
42
|
+
subjob = nil
|
43
|
+
(1..tries).each do |try|
|
44
|
+
subjob = Subjob.find_by_jid(jid)
|
45
|
+
break if subjob
|
46
|
+
Superworker.debug "JID ##{jid}: Sleeping before trying to find Subjob again"
|
47
|
+
sleep (2 ** try)
|
42
48
|
end
|
49
|
+
Superworker.debug "JID ##{jid}: Subjob found: #{subjob ? subjob.to_info : 'nil'}"
|
43
50
|
subjob
|
44
51
|
end
|
45
52
|
end
|
@@ -2,12 +2,16 @@ module Sidekiq
|
|
2
2
|
module Superworker
|
3
3
|
class SubjobProcessor
|
4
4
|
def self.enqueue(subjob)
|
5
|
+
Superworker.debug "#{subjob.to_info}: Trying to enqueue"
|
5
6
|
# Only enqueue subjobs that aren't running, complete, etc
|
6
7
|
return unless subjob.status == 'initialized'
|
7
8
|
|
9
|
+
Superworker.debug "#{subjob.to_info}: Enqueueing"
|
8
10
|
# If this is a parallel subjob, enqueue all of its children
|
9
11
|
if subjob.subworker_class == 'parallel'
|
10
12
|
subjob.update_attribute(:status, 'running')
|
13
|
+
|
14
|
+
Superworker.debug "#{subjob.to_info}: Enqueueing parallel children"
|
11
15
|
jids = subjob.children.collect do |child|
|
12
16
|
enqueue(child)
|
13
17
|
end
|
@@ -31,6 +35,8 @@ module Sidekiq
|
|
31
35
|
end
|
32
36
|
|
33
37
|
def self.enqueue_in_sidekiq(subjob, klass)
|
38
|
+
Superworker.debug "#{subjob.to_info}: Enqueueing in Sidekiq"
|
39
|
+
|
34
40
|
# If sidekiq-unique-jobs is being used for this worker, a number of issues arise if the subjob isn't
|
35
41
|
# queued, so we'll bypass the unique functionality of the worker while running the subjob.
|
36
42
|
is_unique = klass.respond_to?(:sidekiq_options_hash) && !!klass.sidekiq_options_hash['unique']
|
@@ -52,11 +58,13 @@ module Sidekiq
|
|
52
58
|
end
|
53
59
|
|
54
60
|
def self.complete(subjob)
|
61
|
+
Superworker.debug "#{subjob.to_info}: Complete"
|
55
62
|
subjob.update_attribute(:status, 'complete')
|
56
63
|
|
57
64
|
# If children are present, enqueue the first one
|
58
65
|
children = subjob.children
|
59
66
|
if children.present?
|
67
|
+
Superworker.debug "#{subjob.to_info}: Enqueueing children"
|
60
68
|
enqueue(children.first)
|
61
69
|
return
|
62
70
|
# Otherwise, set this as having its descendants complete
|
@@ -66,6 +74,7 @@ module Sidekiq
|
|
66
74
|
end
|
67
75
|
|
68
76
|
def self.descendants_are_complete(subjob)
|
77
|
+
Superworker.debug "#{subjob.to_info}: Descendants are complete"
|
69
78
|
subjob.update_attribute(:descendants_are_complete, true)
|
70
79
|
|
71
80
|
parent = subjob.parent
|
@@ -76,6 +85,7 @@ module Sidekiq
|
|
76
85
|
if parent
|
77
86
|
siblings_descendants_are_complete = parent.children.all? { |child| child.descendants_are_complete }
|
78
87
|
if siblings_descendants_are_complete
|
88
|
+
Superworker.debug "#{subjob.to_info}: Parent (#{parent.to_info}) is complete"
|
79
89
|
descendants_are_complete(parent)
|
80
90
|
parent.update_attribute(:status, 'complete') if is_child_of_parallel
|
81
91
|
end
|
@@ -94,6 +104,7 @@ module Sidekiq
|
|
94
104
|
descendants_are_complete(parent)
|
95
105
|
# Otherwise, this is the final subjob of the superjob
|
96
106
|
else
|
107
|
+
Superworker.debug "#{subjob.to_info}: Superjob is complete"
|
97
108
|
SuperjobProcessor.complete(subjob.superjob_id)
|
98
109
|
end
|
99
110
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-superworker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/generators/sidekiq/superworker/install/templates/create_sidekiq_superworker_subjobs.rb
|
104
104
|
- lib/sidekiq/superworker/dsl_evaluator.rb
|
105
105
|
- lib/sidekiq/superworker/dsl_parser.rb
|
106
|
+
- lib/sidekiq/superworker/logging.rb
|
106
107
|
- lib/sidekiq/superworker/processor.rb
|
107
108
|
- lib/sidekiq/superworker/server/middleware.rb
|
108
109
|
- lib/sidekiq/superworker/subjob_processor.rb
|