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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/boy_band.rb +51 -46
  3. metadata +6 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a930be01f9c60ee6dfd4b6a31878fd1c2cba89a431396fe9f8f70d7da777b348
4
- data.tar.gz: 58d42b0090f9fb2b8c907d0dfbdf37f832ecb398033d6d4c491215265dd5b172
3
+ metadata.gz: 4cd78f34f6e59840ca1c26e224ae07c6c00474d359b251cc510bbe73206b7091
4
+ data.tar.gz: d1fd4e70195819e3a7e176323e9c0a73027c18aeee6fa643e8d1bbf01669d649
5
5
  SHA512:
6
- metadata.gz: 9240d0607c514e5da5fc699b2e12ad9fc59abf7b41b3b2ea6a29fdd21426dc2f50bdf078a093c0b7fd6392ba26f0b86573a98ff78d6d7081512d455c64c4213c
7
- data.tar.gz: 60b7a0dcdbc2eb3a61ceed0724d4e2db28224f2143f941aeabd5538a3c73c2ffec2c9c1b8604e03ff4b6ea83a71f32b8aec4adfff38d0f7cce688576154ed42b
6
+ metadata.gz: 6caebc3b98d4caa82b28f16a9491b35ebf82afcf0e5bbd5fbeba65389ecb6cbb103188073f4a3b55acbb8862d05fd6388a9aae9afcbd1fb871518b03ab68f266
7
+ data.tar.gz: d145d07df99f98d0827e4126d349bbf26c33a877452fbb729948c0f70992c4ee9c73aa942ff6c3ee33b3587070290060f403baa04cbf54fc2face5a2aaaef96b
@@ -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 = Resque.size(queue)
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
- chain.push("#{klass.to_s},#{method_name.to_s},#{args.join('+')}")
57
- Rails.logger.warn("jobchain set, #{chain[0]} #{chain.join('##')}") if chain.length > 2
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[0]}, #{chain.length} entries")
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[0]}, #{job_count} so far")
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
- if Resque.redis
83
- timestamps = JSON.parse(Resque.redis.hget('hashed_jobs', hash) || "[]")
84
- cutoff = 6.hours.ago.to_i
85
- timestamps = timestamps.select{|ts| ts > cutoff }
86
- timestamps.push(Time.now.to_i)
87
- # Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
88
- end
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
- if Resque.redis
93
- timestamps = JSON.parse(Resque.redis.hget('hashed_jobs', hash) || "[]")
94
- timestamps.shift
95
- # Resque.redis.hset('hashed_jobs', hash, timestamps.to_json)
96
- end
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 == :slow ? 'SlowWorker' : 'Worker')
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
- return nil unless method && id
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
- Worker.schedule(self, :perform_action, settings)
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
- return nil unless method
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.8
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-02-19 00:00:00.000000000 Z
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
- rubyforge_project:
85
- rubygems_version: 2.7.7
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: []