boy_band 0.1.8 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
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: []