dj_split 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc2e050c9e58032f167dc04f7d4685be6479e28bc5400fa53d7ff988fdafce7a
4
- data.tar.gz: 91cccdc1b6ed01676da03b2652ee91ac4b09cc8f3d052ada1f798a147325e92f
3
+ metadata.gz: 4e4fe039dd8c959184e603089140121b8b271f6173427817fe54c78989afba57
4
+ data.tar.gz: d18389f1d0c76235d6b937b7e65de15e7fdb883530f86b3557c30f32fe79c9d9
5
5
  SHA512:
6
- metadata.gz: dc3ef609a3fb6a3951800bb97fd711127d223735a3c2bef66b156b381d047ba7270f922c5bc776d0895725211c82feacca6a969c9f6192db5399fc040e79e148
7
- data.tar.gz: a533c0b7839dd8c491971780f63328cc2966b4fbf2f3f9176ce5f54f55d83a054348514368e59c250e1488247a2b505fd46f539b10706ea2662d519ef55ca862
6
+ metadata.gz: 6393267924205a39bd92412ab52cc843694fb54bdb6dac8d08bf83fc80098c8eac91d658b708209085d84ac80d889e68bbecb9cd0a2e0e3fef4b859df7e52b0a
7
+ data.tar.gz: af50d3434ac9ea3790ab6d4cf927fc7bafc01bdc9fb16f8d9e30e90c982229af72872a34b5484554afd24487a40acd7b65b798137ca21cf99bc54bfa000bd4c0
data/README.md CHANGED
@@ -1,4 +1,13 @@
1
- # Delayed Job Split Feature
1
+ **If you're viewing this at https://github.com/nehalamin93/dj_split,
2
+ you're reading the documentation for the master branch.
3
+ [View documentation for the latest release
4
+ (1.0.1).](https://github.com/nehalamin93/dj_split/tree/v1.0.1)**
5
+
6
+ Delayed Job Split Feature
7
+ =========================
8
+ [![Gem Version](https://badge.fury.io/rb/dj_split.png)][gem]
9
+
10
+ [gem]: https://rubygems.org/gems/dj_split
2
11
 
3
12
  Class [**"DjSplit::Split"**](https://github.com/nehalamin93/dj_split/blob/master/lib/dj_split/split.rb) is designed to **Split Time Taking Delayed Jobs, Crons, Bulk Operations, etc** into **smaller size multiple Delayed Jobs**.
4
13
  These **Sub-Jobs** should be **mutually exclusive** of each other and should be able to run **concurrently**.
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["nehalamin93@gmail.com"]
11
11
 
12
12
  spec.summary = %q{Parallelise Time Taking Job across Multiple Processes in Single or Multiple Servers by Splitting into Delayed Jobs.}
13
- spec.description = %q{Gem is designed to "Split or Break" Time Taking Jobs(Delayed Jobs, Crons, Bulk Operations, etc.) into smaller size Mutually Exclusive Delayed Jobs. These Sub-Jobs can be picked by multiple workers in Single or Multiple Servers. After splitting and enqueuing, the process will wait for the sub-jobs to complete and also processes sub-jobs instead of blocking. Parallelism can be achieved across multiple servers through Delayed Jobs which can directly impact performance. Performance can improve up to "n+1" times, where n = number of workers picking the jobs.}
13
+ spec.description = %q{Gem is designed to "Split or Break" Time Taking Jobs(Delayed Jobs, Crons, Bulk Operations, etc.) into smaller size Mutually Exclusive Delayed Jobs. These Sub-Jobs can be picked by "Multiple Workers" in "Single" or "Multiple Servers". After splitting and enqueuing, the process will wait for the sub-jobs to complete and also processes sub-jobs instead of blocking. "Parallelism" can be achieved across multiple servers through Delayed Jobs which can directly impact performance. "Performance" can improve up to "n+1" times, where n = number of workers picking the jobs.}
14
14
  spec.homepage = ""
15
15
  spec.license = "MIT"
16
16
 
@@ -25,12 +25,12 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_development_dependency "bundler", ">= 1.11"
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "minitest", "5.11.3"
28
+ spec.add_development_dependency "minitest", "~> 5.11"
29
29
  spec.add_development_dependency 'rspec', '~> 3.6'
30
30
  spec.add_development_dependency "mocha", "~> 1.2"
31
31
 
32
32
  spec.add_dependency 'delayed_job', '>= 3.0'
33
33
  spec.add_dependency 'sqlite3'
34
- spec.add_dependency 'delayed_job_active_record', '>= 0.4'
34
+ spec.add_dependency 'delayed_job_active_record', '>= 4.0'
35
35
  spec.add_development_dependency 'rails'
36
36
  end
@@ -3,6 +3,8 @@ module DjSplit
3
3
 
4
4
  OPTIMAL_SPLIT_SIZE = 200
5
5
  DEFAULT_SPLIT_INDEX = 2
6
+ STALE_JOBS_TIMEOUT = 900 # Seconds. Can be passed in options.
7
+ SLEEP_TIME = 0.2 # Seconds.
6
8
 
7
9
  def initialize(options)
8
10
  @queue_options = options[:queue_options] || {}
@@ -49,32 +51,21 @@ module DjSplit
49
51
  count = 0
50
52
  while(jobs_processed_by_other_workers_currently?)
51
53
  count += 1
52
- sleep(1.0/5.0)
53
- handle_stale_jobs if check_stale_jobs?(count)
54
+ sleep(SLEEP_TIME)
55
+ handle_stale_jobs if check_for_timeout?(count)
54
56
  end
55
57
  end
56
58
 
57
- # handles a scenario when Job is locked by a worker and worker got killed
59
+ # Raise an error in scenario such as: Job is locked by a worker and worker got killed
58
60
  def handle_stale_jobs
59
- stale_jobs = get_processing_jobs_by_other_workers.select{ |dj| !get_delayed_jobs_pids.include?(dj.locked_by.split("pid:")[1].strip) }
60
- raise "Stale Delayed Jobs of Group Id(#{@split_group_id}): #{stale_jobs.pluck(:id)}" if stale_jobs.present?
61
+ stale_jobs = get_processing_jobs_by_other_workers
62
+ raise "Stale Delayed Jobs of Group Id(#{@split_group_id}): #{stale_jobs.pluck(:id)}"
61
63
  end
62
64
 
63
65
  def get_processing_jobs_by_other_workers
64
66
  Delayed::Job.where(split_group_id: @split_group_id, failed_at: nil).where.not(locked_by: nil)
65
67
  end
66
68
 
67
- def get_delayed_jobs_pids
68
- bash_op = `ps aux | grep delayed_job | grep -v 'grep' | grep -v 'bin/sh' | grep -v 'tail' | grep -v 'ruby' | grep -v 'trace'`
69
- processes = bash_op.split("\n")
70
- pid_array = []
71
- processes.each do |process|
72
- split_process = process.split(" ")
73
- pid_array << split_process[1]
74
- end
75
- pid_array
76
- end
77
-
78
69
  def handle_failed_jobs
79
70
  failed_jobs = Delayed::Job.where(split_group_id: @split_group_id).where.not(failed_at: nil)
80
71
  raise "Failed Delayed Jobs of Group Id(#{@split_group_id}): #{failed_jobs.pluck(:id)}" if failed_jobs.exists?
@@ -88,7 +79,11 @@ module DjSplit
88
79
  @split_options[:size] || OPTIMAL_SPLIT_SIZE
89
80
  end
90
81
 
91
- def get_sliced_ids(ids)
82
+ def get_stale_job_timeout_value
83
+ @split_options[:timeout] || STALE_JOBS_TIMEOUT
84
+ end
85
+
86
+ def get_sliced_ids(ids)
92
87
  ids.each_slice(get_split_size)
93
88
  end
94
89
 
@@ -101,9 +96,9 @@ module DjSplit
101
96
  Time.now.to_i.to_s[5..-1] + rand(1000000000).to_s
102
97
  end
103
98
 
104
- # Check for stale jobs 1 out of 2000 times.
105
- def check_stale_jobs?(count)
106
- (count%2000 == 1999)
99
+ # Check whether the timeout is reached?
100
+ def check_for_timeout?(count)
101
+ (SLEEP_TIME * count) > get_stale_job_timeout_value
107
102
  end
108
103
  end
109
104
  end
@@ -1,3 +1,3 @@
1
1
  module DjSplit
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dj_split
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Md Nehal Amin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-04 00:00:00.000000000 Z
11
+ date: 2018-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 5.11.3
47
+ version: '5.11'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 5.11.3
54
+ version: '5.11'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0.4'
117
+ version: '4.0'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '0.4'
124
+ version: '4.0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rails
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -138,10 +138,10 @@ dependencies:
138
138
  version: '0'
139
139
  description: Gem is designed to "Split or Break" Time Taking Jobs(Delayed Jobs, Crons,
140
140
  Bulk Operations, etc.) into smaller size Mutually Exclusive Delayed Jobs. These
141
- Sub-Jobs can be picked by multiple workers in Single or Multiple Servers. After
142
- splitting and enqueuing, the process will wait for the sub-jobs to complete and
143
- also processes sub-jobs instead of blocking. Parallelism can be achieved across
144
- multiple servers through Delayed Jobs which can directly impact performance. Performance
141
+ Sub-Jobs can be picked by "Multiple Workers" in "Single" or "Multiple Servers".
142
+ After splitting and enqueuing, the process will wait for the sub-jobs to complete
143
+ and also processes sub-jobs instead of blocking. "Parallelism" can be achieved across
144
+ multiple servers through Delayed Jobs which can directly impact performance. "Performance"
145
145
  can improve up to "n+1" times, where n = number of workers picking the jobs.
146
146
  email:
147
147
  - nehalamin93@gmail.com