boy_band 0.1.8 → 0.1.13
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 +4 -4
- data/lib/boy_band.rb +51 -46
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cd78f34f6e59840ca1c26e224ae07c6c00474d359b251cc510bbe73206b7091
|
4
|
+
data.tar.gz: d1fd4e70195819e3a7e176323e9c0a73027c18aeee6fa643e8d1bbf01669d649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6caebc3b98d4caa82b28f16a9491b35ebf82afcf0e5bbd5fbeba65389ecb6cbb103188073f4a3b55acbb8862d05fd6388a9aae9afcbd1fb871518b03ab68f266
|
7
|
+
data.tar.gz: d145d07df99f98d0827e4126d349bbf26c33a877452fbb729948c0f70992c4ee9c73aa942ff6c3ee33b3587070290060f403baa04cbf54fc2face5a2aaaef96b
|
data/lib/boy_band.rb
CHANGED
@@ -39,12 +39,22 @@ module BoyBand
|
|
39
39
|
def set_job_chain(val)
|
40
40
|
@@job_chain = val
|
41
41
|
end
|
42
|
+
|
43
|
+
def queue_size(queue)
|
44
|
+
size = Resque.redis.get("sizeof/#{queue}").to_i
|
45
|
+
if !size || size == 0
|
46
|
+
size = Resque.size(queue)
|
47
|
+
Resque.redis.setex("sizeof/#{queue}", 30.seconds.to_i, size)
|
48
|
+
end
|
49
|
+
size
|
50
|
+
end
|
42
51
|
|
43
52
|
def schedule_for(queue, klass, method_name, *args)
|
53
|
+
queue = queue.to_sym
|
44
54
|
@queue = queue.to_s
|
45
55
|
job_hash = Digest::MD5.hexdigest(args.to_json)
|
46
56
|
note_job(job_hash)
|
47
|
-
size =
|
57
|
+
size = queue_size(queue)
|
48
58
|
args.push("domain::#{self.domain_id}")
|
49
59
|
chain = self.job_chain.split(/##/)
|
50
60
|
job_id = "j#{Time.now.iso8601}_#{rand(9999)}"
|
@@ -53,14 +63,19 @@ module BoyBand
|
|
53
63
|
Resque.redis.incr("jobs_from_#{chain[0]}")
|
54
64
|
Resque.redis.expire("jobs_from_#{chain[0]}", 24.hours.to_i)
|
55
65
|
end
|
56
|
-
|
57
|
-
|
66
|
+
Resque.redis.setex("scheduled/#{klass.to_s}/#{job_hash}", 6.hours, "t")
|
67
|
+
chain_args = args[0..-2]
|
68
|
+
if chain_args.length == 1 && chain_args[0].is_a?(Hash)
|
69
|
+
chain_args = [chain_args[0]['method'],chain_args[0]['id'],chain_args[0]['arguments'].to_s[0, 20]]
|
70
|
+
end
|
71
|
+
chain.push("#{klass.to_s},#{method_name.to_s},#{chain_args.join('+')}")
|
72
|
+
# Rails.logger.warn("jobchain set, #{chain[0]} #{chain.join('##')}") if chain.length > 2
|
58
73
|
if chain.length > 5
|
59
|
-
Rails.logger.error("jobchain too deep: #{chain[
|
74
|
+
Rails.logger.error("jobchain too deep: #{chain[1]}, #{chain.length} entries")
|
60
75
|
end
|
61
76
|
job_count = Resque.redis.get("jobs_from_#{chain[0]}")
|
62
77
|
if job_count && job_count.to_i > 50
|
63
|
-
Rails.logger.error("jobchain too many sub-jobs: #{chain[
|
78
|
+
Rails.logger.error("jobchain too many sub-jobs: #{chain[1]}, #{job_count} so far")
|
64
79
|
end
|
65
80
|
args.push("chain::#{chain.join('##')}")
|
66
81
|
if queue == :slow
|
@@ -79,21 +94,21 @@ module BoyBand
|
|
79
94
|
end
|
80
95
|
|
81
96
|
def note_job(hash)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
# Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
|
88
|
-
|
97
|
+
# if Resque.redis
|
98
|
+
# timestamps = JSON.parse(Resque.redis.hget('hashed_jobs', hash) || "[]")
|
99
|
+
# cutoff = 6.hours.ago.to_i
|
100
|
+
# timestamps = timestamps.select{|ts| ts > cutoff }
|
101
|
+
# timestamps.push(Time.now.to_i)
|
102
|
+
# # Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
|
103
|
+
# end
|
89
104
|
end
|
90
105
|
|
91
106
|
def clear_job(hash)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
# Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
|
96
|
-
|
107
|
+
# if Resque.redis
|
108
|
+
# timestamps = JSON.parse(Resque.redis.hget('hashed_jobs', hash) || "[]")
|
109
|
+
# timestamps.shift
|
110
|
+
# # Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
|
111
|
+
# end
|
97
112
|
end
|
98
113
|
|
99
114
|
def schedule(klass, method_name, *args)
|
@@ -111,8 +126,13 @@ module BoyBand
|
|
111
126
|
def in_worker_process?
|
112
127
|
BoyBand.job_instigator.match(/^job/)
|
113
128
|
end
|
129
|
+
|
130
|
+
def current_speed
|
131
|
+
@speed
|
132
|
+
end
|
114
133
|
|
115
134
|
def perform_at(speed, *args)
|
135
|
+
@speed = speed
|
116
136
|
args_copy = [] + args
|
117
137
|
if args_copy[-1].is_a?(String) && args_copy[-1].match(/^chain::/)
|
118
138
|
set_job_chain(args_copy.pop.split(/::/, 2)[1])
|
@@ -124,6 +144,7 @@ module BoyBand
|
|
124
144
|
klass = Object.const_get(klass_string)
|
125
145
|
method_name = args_copy.shift
|
126
146
|
job_hash = Digest::MD5.hexdigest(args_copy.to_json)
|
147
|
+
Resque.redis.del("scheduled/#{klass_string}/#{method_name}/#{job_hash}")
|
127
148
|
hash = args_copy[0] if args_copy[0].is_a?(Hash)
|
128
149
|
hash ||= {'method' => method_name}
|
129
150
|
action = "#{klass_string} . #{hash['method']} (#{hash['id']})"
|
@@ -144,6 +165,7 @@ module BoyBand
|
|
144
165
|
set_job_chain("none")
|
145
166
|
BoyBand.set_job_instigator(pre_whodunnit)
|
146
167
|
clear_job(job_hash)
|
168
|
+
@speed = nil
|
147
169
|
rescue Resque::TermException
|
148
170
|
Resque.enqueue(self, *args)
|
149
171
|
end
|
@@ -166,14 +188,14 @@ module BoyBand
|
|
166
188
|
idx = Resque.size(queue)
|
167
189
|
idx.times do |i|
|
168
190
|
item = Resque.peek(queue, i)
|
169
|
-
if item['args'] && item['args'][-1].match(/^chain::/)
|
191
|
+
if item && item['args'] && item['args'][-1].match(/^chain::/)
|
170
192
|
chain = item['args'].pop
|
171
193
|
end
|
172
|
-
if item['args'] && item['args'][-1].match(/^domain::/)
|
194
|
+
if item && item['args'] && item['args'][-1].match(/^domain::/)
|
173
195
|
domain = item['args'].pop
|
174
196
|
item['domain_id'] = domain.split(/::/, 2)[1]
|
175
197
|
end
|
176
|
-
res << item
|
198
|
+
res << item if item
|
177
199
|
end
|
178
200
|
end
|
179
201
|
res
|
@@ -233,7 +255,7 @@ module BoyBand
|
|
233
255
|
list = []
|
234
256
|
idx.times do |i|
|
235
257
|
item = Resque.peek(queue, i)
|
236
|
-
if item['args'] && item['args'][2].is_a?(Hash) && item['args'][2]['method'] == method
|
258
|
+
if item && item['args'] && item['args'][2].is_a?(Hash) && item['args'][2]['method'] == method
|
237
259
|
list << item
|
238
260
|
puts item.to_json
|
239
261
|
end
|
@@ -250,8 +272,12 @@ module BoyBand
|
|
250
272
|
set_domain_id(args_copy.pop.split(/::/, 2)[1])
|
251
273
|
end
|
252
274
|
|
275
|
+
idx = queue_size(queue)
|
276
|
+
job_hash = args_copy.to_json
|
277
|
+
return true if Resque.redis.get("scheduled/#{klass.to_s}/#{method_name}/#{job_hash}") == "t"
|
278
|
+
return false if idx > 500 # big queues mustn't be searched this way
|
253
279
|
idx = Resque.size(queue)
|
254
|
-
queue_class = (queue ==
|
280
|
+
queue_class = (queue.to_s == 'slow' ? 'SlowWorker' : 'Worker')
|
255
281
|
if false
|
256
282
|
job_hash = args_copy.to_json
|
257
283
|
timestamps = JSON.parse(Resque.redis.hget('hashed_jobs', job_hash) || "[]")
|
@@ -390,18 +416,7 @@ module BoyBand
|
|
390
416
|
end
|
391
417
|
|
392
418
|
def schedule_once(method, *args)
|
393
|
-
|
394
|
-
already_scheduled = Worker.scheduled?(self.class, :perform_action, {
|
395
|
-
'id' => id,
|
396
|
-
'method' => method,
|
397
|
-
'scheduled' => self.class.scheduled_stamp,
|
398
|
-
'arguments' => args
|
399
|
-
})
|
400
|
-
if !already_scheduled
|
401
|
-
schedule(method, *args)
|
402
|
-
else
|
403
|
-
false
|
404
|
-
end
|
419
|
+
schedule_once_for('default', method, *args)
|
405
420
|
end
|
406
421
|
|
407
422
|
def schedule_once_for(queue, method, *args)
|
@@ -438,7 +453,7 @@ module BoyBand
|
|
438
453
|
'scheduled' => self.scheduled_stamp,
|
439
454
|
'arguments' => args
|
440
455
|
}
|
441
|
-
|
456
|
+
schedule_for('default', method, *args)
|
442
457
|
end
|
443
458
|
|
444
459
|
def schedule_for(queue, method, *args)
|
@@ -452,17 +467,7 @@ module BoyBand
|
|
452
467
|
end
|
453
468
|
|
454
469
|
def schedule_once(method, *args)
|
455
|
-
|
456
|
-
already_scheduled = Worker.scheduled?(self, :perform_action, {
|
457
|
-
'method' => method,
|
458
|
-
'scheduled' => self.scheduled_stamp,
|
459
|
-
'arguments' => args
|
460
|
-
})
|
461
|
-
if !already_scheduled
|
462
|
-
schedule(method, *args)
|
463
|
-
else
|
464
|
-
false
|
465
|
-
end
|
470
|
+
schedule_once_for('default', method, *args)
|
466
471
|
end
|
467
472
|
|
468
473
|
def schedule_once_for(queue, method, *args)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: boy_band
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Whitmer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -66,7 +66,7 @@ homepage: http://github.com/CoughDrop/boy_band
|
|
66
66
|
licenses:
|
67
67
|
- MIT
|
68
68
|
metadata: {}
|
69
|
-
post_install_message:
|
69
|
+
post_install_message:
|
70
70
|
rdoc_options: []
|
71
71
|
require_paths:
|
72
72
|
- lib
|
@@ -81,9 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
|
85
|
-
|
86
|
-
signing_key:
|
84
|
+
rubygems_version: 3.0.8
|
85
|
+
signing_key:
|
87
86
|
specification_version: 4
|
88
87
|
summary: BoyBand
|
89
88
|
test_files: []
|