sidekiq-reliable-requeue 0.5.0

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
+ SHA1:
3
+ metadata.gz: 790e70ae377335b07a2dcbceb93d017dc869d4af
4
+ data.tar.gz: 908147212792aea48eeb93b3c49f8700a8dc0bfc
5
+ SHA512:
6
+ metadata.gz: e34ffe5ba3b3a325aca30aa0dbaa22356b9252437e482ae364ce027e4acc4d3f12375dc122f1b35346ad626948f2e4ccc186576957b89faf69814936fb9cf282
7
+ data.tar.gz: bee0f73145968509c129c133cb17272110ea8646dc47a27bc5b17d9af20f7b5175f1d19784ff0eb5f138f69170591d5a6fd2534ad64cb84c54ca40d6889f03f1
@@ -0,0 +1,22 @@
1
+ module SidekiqReliableRequeue
2
+ class Middleware
3
+
4
+ def call(worker, msg, queue)
5
+ if msg['reliable_requeue']
6
+ set_stale_info(msg)
7
+ end
8
+ yield
9
+ ensure
10
+ clean_stale_info
11
+ end
12
+
13
+ def set_stale_info(msg)
14
+ @redis_key_for_check = "#{msg['class']}:#{msg['jid']}"
15
+ RedisConnection.hset(SidekiqReliableStaleJobsKey, @redis_key_for_check, msg.to_json)
16
+ end
17
+
18
+ def clean_stale_info
19
+ RedisConnection.hdel(SidekiqReliableStaleJobsKey, @redis_key_for_check)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ module SidekiqReliableRequeue
2
+ class RedisConnection
3
+ class << self
4
+ def method_missing(redis_method, *args)
5
+ Sidekiq.redis do |conn|
6
+ conn.send(redis_method, *args)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,40 @@
1
+ module SidekiqReliableRequeue
2
+ class Worker
3
+ include Sidekiq::Worker
4
+
5
+ def perform(key)
6
+ data = RedisConnection.hget(SidekiqReliableStaleJobsKey, key)
7
+ Sidekiq.logger.debug("Checking for data with key: #{key}")
8
+
9
+ unless data
10
+ Sidekiq.logger.debug("Job with key #{key} has been cleaned")
11
+ return
12
+ end
13
+
14
+ sidekiq_msg = JSON.parse(RedisConnection.hget(SidekiqReliableStaleJobsKey, key))
15
+ worker = sidekiq_msg['class'].constantize
16
+
17
+ Sidekiq.logger.info("Requeuing #{sidekiq_msg}")
18
+ worker.client_push(sidekiq_msg.except('jid'))
19
+ RedisConnection.hdel(SidekiqReliableStaleJobsKey, key)
20
+ end
21
+
22
+ def self.requeue_stale_jobs
23
+ keys = RedisConnection.hkeys(SidekiqReliableStaleJobsKey)
24
+
25
+ if keys.empty?
26
+ Sidekiq.logger.info('No stale jobs to add')
27
+ end
28
+
29
+ keys.each do |key|
30
+ data = RedisConnection.hget(SidekiqReliableStaleJobsKey, key)
31
+ next unless data
32
+
33
+ sidekiq_msg = JSON.parse(RedisConnection.hget(SidekiqReliableStaleJobsKey, key))
34
+
35
+ Sidekiq.logger.info("Preparing job #{key} to be requeued in #{sidekiq_msg['requeue_timeout']}s")
36
+ self.perform_in(sidekiq_msg['requeue_timeout'], key)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ require 'sidekiq'
2
+ require 'sidekiq-reliable-requeue/redis_connection'
3
+ require 'sidekiq-reliable-requeue/middleware'
4
+ require 'sidekiq-reliable-requeue/worker'
5
+
6
+ module SidekiqReliableRequeue
7
+ Sidekiq.default_worker_options = {
8
+ requeue_timeout: 20,
9
+ reliable_requeue: false
10
+ }
11
+
12
+ SidekiqReliableStaleJobsKey = 'sidekiq_tasks_being_performed'
13
+
14
+ def self.initialize(requeue_timeout: 20, reliable_requeue: false)
15
+ Sidekiq.default_worker_options = {
16
+ requeue_timeout: requeue_timeout,
17
+ reliable_requeue: reliable_requeue
18
+ }
19
+
20
+ Sidekiq.configure_server do |config|
21
+ config.on(:startup) do
22
+ Worker.requeue_stale_jobs
23
+ end
24
+
25
+ config.server_middleware do |chain|
26
+ chain.add Middleware
27
+ end
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq-reliable-requeue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Algayres
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sidekiq
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/sidekiq-reliable-requeue.rb
62
+ - lib/sidekiq-reliable-requeue/middleware.rb
63
+ - lib/sidekiq-reliable-requeue/redis_connection.rb
64
+ - lib/sidekiq-reliable-requeue/worker.rb
65
+ homepage:
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.4.5.1
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: Sidekiq middleware to handle requeuing of jobs if the worker gets badly terminated
89
+ or crashes
90
+ test_files: []