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 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
@@ -0,0 +1,5 @@
1
+ module Sidekiq
2
+ module Group
3
+ VERSION = '0.1.3'.freeze
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ module Sidekiq
2
+ module Group
3
+ class Worker
4
+ include Sidekiq::Worker
5
+
6
+ def perform(callback_class, callback_options)
7
+ callback = callback_class.constantize.new
8
+ callback.on_complete(callback_options)
9
+ end
10
+ end
11
+ end
12
+ end
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: []