sidekiq-group 0.1.3
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 +7 -0
- data/lib/sidekiq/group.rb +34 -0
- data/lib/sidekiq/group/collection.rb +102 -0
- data/lib/sidekiq/group/middleware.rb +37 -0
- data/lib/sidekiq/group/version.rb +5 -0
- data/lib/sidekiq/group/worker.rb +12 -0
- metadata +114 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dd109b06a1d0e8b3dfc74edf53aaf8fb57e72046c9eac0352abc79c83560fb04
|
4
|
+
data.tar.gz: 309916f9bddab5075cec3690de80b33a305986074157b3f86a0ee0a906dd72c8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d64c64fbbb3c950ad847a49ce94dea78084443de6260e513cb4575466084a0b0225cdf048aa1f9c881b9b0539feda2a43fd94c29fc161ab23b8c216c75d0c695
|
7
|
+
data.tar.gz: 2a491e6947ac7b9b27b82c3ce098b013b948a4c913606e228a1c5f8924d921fb1960093e634a68992d07c72c4b3096da7055aa3fac2766b150f786d12029eacc
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'sidekiq/logging'
|
2
|
+
require 'sidekiq/group/version'
|
3
|
+
require 'sidekiq/group/collection'
|
4
|
+
require 'sidekiq/group/middleware'
|
5
|
+
|
6
|
+
module Sidekiq
|
7
|
+
module Group
|
8
|
+
class NoBlockGivenError < StandardError; end
|
9
|
+
|
10
|
+
def sidekiq_group(options = {})
|
11
|
+
raise NoBlockGivenError unless block_given?
|
12
|
+
|
13
|
+
group = Sidekiq::Group::Collection.new
|
14
|
+
group.callback_class = self.class.name
|
15
|
+
group.callback_options = options
|
16
|
+
|
17
|
+
Thread.current[:group_collection] = group
|
18
|
+
|
19
|
+
yield(group)
|
20
|
+
|
21
|
+
group.spawned_jobs!
|
22
|
+
|
23
|
+
Thread.current[:group_collection] = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_complete(_options = {})
|
27
|
+
sidekiq_logger.warn 'on_complete function is not defined'
|
28
|
+
end
|
29
|
+
|
30
|
+
def sidekiq_logger
|
31
|
+
Sidekiq::Logging.logger
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'sidekiq/group/worker'
|
3
|
+
|
4
|
+
module Sidekiq
|
5
|
+
module Group
|
6
|
+
class Collection
|
7
|
+
CID_EXPIRE_TTL = 3600 * 24 * 30
|
8
|
+
LOCK_TTL = 3600
|
9
|
+
|
10
|
+
attr_reader :cid, :callback_class, :callback_options
|
11
|
+
|
12
|
+
def initialize(cid = nil)
|
13
|
+
@cid = cid || SecureRandom.urlsafe_base64(16)
|
14
|
+
end
|
15
|
+
|
16
|
+
def callback_class=(value)
|
17
|
+
@callback_class = value
|
18
|
+
persist('callback_class', value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def callback_options=(value)
|
22
|
+
@callback_options = value
|
23
|
+
persist('callback_options', value.to_json)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add(jid)
|
27
|
+
Sidekiq.redis do |r|
|
28
|
+
r.multi do
|
29
|
+
r.sadd("#{@cid}-jids", jid)
|
30
|
+
r.expire("#{@cid}-jids", CID_EXPIRE_TTL)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def spawned_jobs!
|
36
|
+
persist('spawned_jobs', cid)
|
37
|
+
end
|
38
|
+
|
39
|
+
def success(jid)
|
40
|
+
remove_processed(jid)
|
41
|
+
|
42
|
+
return unless processed_all_jobs?
|
43
|
+
return if locked?
|
44
|
+
|
45
|
+
callback_class, callback_options = callback_data
|
46
|
+
options = JSON(callback_options)
|
47
|
+
Sidekiq::Group::Worker.perform_async(callback_class, options)
|
48
|
+
|
49
|
+
cleanup_redis
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def remove_processed(jid)
|
55
|
+
Sidekiq.redis { |r| r.srem("#{@cid}-jids", jid) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def pending
|
59
|
+
Sidekiq.redis { |r| r.scard("#{@cid}-jids") }
|
60
|
+
end
|
61
|
+
|
62
|
+
def processed_all_jobs?
|
63
|
+
spawned_all_jobs? && pending.zero?
|
64
|
+
end
|
65
|
+
|
66
|
+
def spawned_all_jobs?
|
67
|
+
Sidekiq.redis { |r| r.hget(@cid, 'spawned_jobs') }.present?
|
68
|
+
end
|
69
|
+
|
70
|
+
def callback_data
|
71
|
+
Sidekiq.redis do |r|
|
72
|
+
r.multi do
|
73
|
+
r.hget(@cid, 'callback_class')
|
74
|
+
r.hget(@cid, 'callback_options')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def persist(attribute, value)
|
80
|
+
Sidekiq.redis do |r|
|
81
|
+
r.multi do
|
82
|
+
r.hset(@cid, attribute, value)
|
83
|
+
r.expire(@cid, CID_EXPIRE_TTL)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def cleanup_redis
|
89
|
+
Sidekiq.redis { |r| r.del(@cid, "#{@cid}-jids") }
|
90
|
+
end
|
91
|
+
|
92
|
+
def locked?
|
93
|
+
Sidekiq.redis do |r|
|
94
|
+
r.multi do
|
95
|
+
r.getset("#{@cid}-finished", 1)
|
96
|
+
r.expire("#{@cid}-finished", LOCK_TTL)
|
97
|
+
end.first
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Sidekiq
|
2
|
+
module Group
|
3
|
+
module Middleware
|
4
|
+
class ClientMiddleware
|
5
|
+
def call(_worker, msg, _queue, _redis_pool = nil)
|
6
|
+
if (group = Thread.current[:group_collection])
|
7
|
+
msg['cid'] = group.cid
|
8
|
+
end
|
9
|
+
|
10
|
+
yield
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ServerMiddleware
|
15
|
+
def call(_worker, msg, _queue)
|
16
|
+
yield
|
17
|
+
|
18
|
+
return unless msg['cid']
|
19
|
+
|
20
|
+
Sidekiq::Group::Collection.new(msg['cid']).success(msg['jid'])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.configure
|
25
|
+
Sidekiq.configure_client do |config|
|
26
|
+
config.client_middleware { |c| c.add Sidekiq::Group::Middleware::ClientMiddleware }
|
27
|
+
end
|
28
|
+
Sidekiq.configure_server do |config|
|
29
|
+
config.client_middleware { |c| c.add Sidekiq::Group::Middleware::ClientMiddleware }
|
30
|
+
config.server_middleware { |c| c.add Sidekiq::Group::Middleware::ServerMiddleware }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Sidekiq::Group::Middleware.configure
|
metadata
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sidekiq-group
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matic developers
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sidekiq
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '5.1'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '6'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '5.1'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '6'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '2.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '13.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '13.0'
|
75
|
+
description: Allows to group jobs into a set and follow their progress
|
76
|
+
email:
|
77
|
+
- yuriy.l@matic.com
|
78
|
+
- oleh.m@matic.com
|
79
|
+
- viktoriia.b@matic.com
|
80
|
+
executables: []
|
81
|
+
extensions: []
|
82
|
+
extra_rdoc_files: []
|
83
|
+
files:
|
84
|
+
- lib/sidekiq/group.rb
|
85
|
+
- lib/sidekiq/group/collection.rb
|
86
|
+
- lib/sidekiq/group/middleware.rb
|
87
|
+
- lib/sidekiq/group/version.rb
|
88
|
+
- lib/sidekiq/group/worker.rb
|
89
|
+
homepage: https://github.com/matic-insurance/sidekiq-group
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata:
|
93
|
+
allowed_push_host: https://rubygems.org
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.4.0
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubygems_version: 3.0.3
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Addon for Sidekiq that provides similar functionality to Pro version Batches
|
113
|
+
feature
|
114
|
+
test_files: []
|