workhorse 1.2.16 → 1.2.17.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/LICENSE +1 -1
- data/README.md +24 -1
- data/RUBY_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/workhorse/daemon.rb +30 -2
- data/lib/workhorse.rb +6 -0
- data/workhorse.gemspec +18 -35
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25908f294cd9623ebde44ec8bba5181ee54965703f4fb93df18876b216718eb8
|
4
|
+
data.tar.gz: 568e620571a9ded165fee1fc4420efbb6810f073edd4365c6c8efbe7c3676052
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83b6ac441e3762f251e35f04dd213044d6fb904a005155235546391cdecd4f9c0c1db24be7c30371da4704b27e6f18aa6ce0b448b6c6c1dbc8c77eeb81faa9e3
|
7
|
+
data.tar.gz: 9c2940a6bfb7cd0be49170d81af2378f27395dbf597f6d8fa2c777bdc812b26d06cc849454ba5925fcf5f26b7724779b3d6e941bc6c9237d6dc251b7d071188f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Workhorse Changelog
|
2
2
|
|
3
|
+
## 1.2.17.rc0 - 2024-02-05
|
4
|
+
|
5
|
+
* Add option `config.max_worker_memory_mb` for automatic restart of workers
|
6
|
+
exceeding the specified memory threshold using the `watch` command. Default is
|
7
|
+
`0`, deactivating this feature. See [memory
|
8
|
+
handling](README.md#memory-handling) for more information.
|
9
|
+
|
10
|
+
Sitrox reference: #121312.
|
11
|
+
|
3
12
|
## 1.2.16 - 2023-09-18
|
4
13
|
|
5
14
|
* Add support for `--skip-initializer` flag to install generator.
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -464,6 +464,29 @@ jobs database on a regular interval. Workhorse provides the job
|
|
464
464
|
`Workhorse::Jobs::CleanupSucceededJobs` for this purpose that cleans up all
|
465
465
|
succeeded jobs. You can run this using your scheduler in a specific interval.
|
466
466
|
|
467
|
+
## Memory handling
|
468
|
+
|
469
|
+
When dealing with jobs that may exhibit a large memory footprint, it's important
|
470
|
+
to note that Ruby might not release consumed memory back to the operating
|
471
|
+
system. Consequently, your job workers could accumulate a significant amount of
|
472
|
+
memory over time. To address this, Workhorse provides the
|
473
|
+
`config.max_worker_memory_mb` option.
|
474
|
+
|
475
|
+
If `config.max_worker_memory_mb` is set to a value above `0`, the `watch`
|
476
|
+
command will check the memory footprint (RSS / resident size) of all worker
|
477
|
+
processes. If any worker exceeds the specified footprint, Workhorse will
|
478
|
+
silently restart it to ensure proper memory release. This process does not
|
479
|
+
produce any output in the `watch` command.
|
480
|
+
|
481
|
+
Example configuration:
|
482
|
+
|
483
|
+
```ruby
|
484
|
+
# config/initializers/workhorse.rb
|
485
|
+
Workhorse.setup do |config|
|
486
|
+
config.max_worker_memory_mb = 512 # Set the memory threshold to 512 megabytes
|
487
|
+
end
|
488
|
+
```
|
489
|
+
|
467
490
|
## Load hooks
|
468
491
|
|
469
492
|
Using the load hook `:workhorse_db_job`, you can inject custom code into the
|
@@ -540,4 +563,4 @@ Please consult the [FAQ](FAQ.md).
|
|
540
563
|
|
541
564
|
## Copyright
|
542
565
|
|
543
|
-
Copyright © 2017 -
|
566
|
+
Copyright © 2017 - 2024 Sitrox. See `LICENSE` for further details.
|
data/RUBY_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-3.2.1-p31
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.17.rc0
|
data/lib/workhorse/daemon.rb
CHANGED
@@ -113,10 +113,14 @@ module Workhorse
|
|
113
113
|
end
|
114
114
|
|
115
115
|
if should_be_running && status(quiet: true) != 0
|
116
|
-
|
116
|
+
code = start(quiet: Workhorse.silence_watcher)
|
117
117
|
else
|
118
|
-
|
118
|
+
code = 0
|
119
119
|
end
|
120
|
+
|
121
|
+
watch_memory! if should_be_running
|
122
|
+
|
123
|
+
return code
|
120
124
|
end
|
121
125
|
|
122
126
|
def restart
|
@@ -144,6 +148,30 @@ module Workhorse
|
|
144
148
|
|
145
149
|
private
|
146
150
|
|
151
|
+
def watch_memory!
|
152
|
+
return if Workhorse.max_worker_memory_mb == 0
|
153
|
+
|
154
|
+
for_each_worker do |worker|
|
155
|
+
pid_file, pid = read_pid(worker)
|
156
|
+
next unless pid_file && pid
|
157
|
+
|
158
|
+
memory = memory_for(pid)
|
159
|
+
next unless memory
|
160
|
+
|
161
|
+
if memory > Workhorse.max_worker_memory_mb
|
162
|
+
stop_worker pid_file, pid
|
163
|
+
start_worker worker
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Returns the memory (RSS) in MB for the given process.
|
169
|
+
def memory_for(pid)
|
170
|
+
mem = `ps -p #{pid} -o rss=`&.strip
|
171
|
+
return nil if mem.blank?
|
172
|
+
return mem.to_i / 1024
|
173
|
+
end
|
174
|
+
|
147
175
|
def for_each_worker(&block)
|
148
176
|
@workers.each(&block)
|
149
177
|
end
|
data/lib/workhorse.rb
CHANGED
@@ -75,6 +75,12 @@ module Workhorse
|
|
75
75
|
mattr_accessor :stale_detection_run_time_threshold
|
76
76
|
self.stale_detection_run_time_threshold = 12 * 60
|
77
77
|
|
78
|
+
# Maximum memory for a worker in MB. If this memory limit (RSS / resident
|
79
|
+
# size) is reached for a worker process, the 'watch' command will restart said
|
80
|
+
# worker. Set this to 0 disable this feature.
|
81
|
+
mattr_accessor :max_worker_memory_mb
|
82
|
+
self.max_worker_memory_mb = 0
|
83
|
+
|
78
84
|
def self.setup
|
79
85
|
yield self
|
80
86
|
end
|
data/workhorse.gemspec
CHANGED
@@ -1,48 +1,31 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: workhorse 1.2.
|
2
|
+
# stub: workhorse 1.2.17.rc0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "workhorse".freeze
|
6
|
-
s.version = "1.2.
|
6
|
+
s.version = "1.2.17.rc0"
|
7
7
|
|
8
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Sitrox".freeze]
|
11
|
-
s.date = "
|
11
|
+
s.date = "2024-02-05"
|
12
12
|
s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "FAQ.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/rubocop".freeze, "lib/active_job/queue_adapters/workhorse_adapter.rb".freeze, "lib/generators/workhorse/install_generator.rb".freeze, "lib/generators/workhorse/templates/bin/workhorse.rb".freeze, "lib/generators/workhorse/templates/config/initializers/workhorse.rb".freeze, "lib/generators/workhorse/templates/create_table_jobs.rb".freeze, "lib/workhorse.rb".freeze, "lib/workhorse/active_job_extension.rb".freeze, "lib/workhorse/daemon.rb".freeze, "lib/workhorse/daemon/shell_handler.rb".freeze, "lib/workhorse/db_job.rb".freeze, "lib/workhorse/enqueuer.rb".freeze, "lib/workhorse/jobs/cleanup_succeeded_jobs.rb".freeze, "lib/workhorse/jobs/detect_stale_jobs_job.rb".freeze, "lib/workhorse/jobs/run_active_job.rb".freeze, "lib/workhorse/jobs/run_rails_op.rb".freeze, "lib/workhorse/performer.rb".freeze, "lib/workhorse/poller.rb".freeze, "lib/workhorse/pool.rb".freeze, "lib/workhorse/scoped_env.rb".freeze, "lib/workhorse/worker.rb".freeze, "test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze, "workhorse.gemspec".freeze]
|
13
|
-
s.rubygems_version = "3.
|
13
|
+
s.rubygems_version = "3.4.6".freeze
|
14
14
|
s.summary = "Multi-threaded job backend with database queuing for ruby.".freeze
|
15
15
|
s.test_files = ["test/active_job/queue_adapters/workhorse_adapter_test.rb".freeze, "test/lib/db_schema.rb".freeze, "test/lib/jobs.rb".freeze, "test/lib/test_helper.rb".freeze, "test/workhorse/db_job_test.rb".freeze, "test/workhorse/enqueuer_test.rb".freeze, "test/workhorse/performer_test.rb".freeze, "test/workhorse/poller_test.rb".freeze, "test/workhorse/pool_test.rb".freeze, "test/workhorse/worker_test.rb".freeze]
|
16
16
|
|
17
|
-
|
18
|
-
s.specification_version = 4
|
19
|
-
end
|
17
|
+
s.specification_version = 4
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
34
|
-
else
|
35
|
-
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
36
|
-
s.add_dependency(%q<rake>.freeze, [">= 0"])
|
37
|
-
s.add_dependency(%q<rubocop>.freeze, ["~> 1.28.0"])
|
38
|
-
s.add_dependency(%q<minitest>.freeze, [">= 0"])
|
39
|
-
s.add_dependency(%q<mysql2>.freeze, [">= 0"])
|
40
|
-
s.add_dependency(%q<colorize>.freeze, [">= 0"])
|
41
|
-
s.add_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
42
|
-
s.add_dependency(%q<activejob>.freeze, [">= 0"])
|
43
|
-
s.add_dependency(%q<pry>.freeze, [">= 0"])
|
44
|
-
s.add_dependency(%q<activesupport>.freeze, [">= 0"])
|
45
|
-
s.add_dependency(%q<activerecord>.freeze, [">= 0"])
|
46
|
-
s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
47
|
-
end
|
19
|
+
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
20
|
+
s.add_development_dependency(%q<rake>.freeze, [">= 0"])
|
21
|
+
s.add_development_dependency(%q<rubocop>.freeze, ["~> 1.28.0"])
|
22
|
+
s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<mysql2>.freeze, [">= 0"])
|
24
|
+
s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
|
25
|
+
s.add_development_dependency(%q<benchmark-ips>.freeze, [">= 0"])
|
26
|
+
s.add_development_dependency(%q<activejob>.freeze, [">= 0"])
|
27
|
+
s.add_development_dependency(%q<pry>.freeze, [">= 0"])
|
28
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
|
30
|
+
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 0"])
|
48
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workhorse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.17.rc0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -242,11 +242,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
242
242
|
version: '0'
|
243
243
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
244
244
|
requirements:
|
245
|
-
- - "
|
245
|
+
- - ">"
|
246
246
|
- !ruby/object:Gem::Version
|
247
|
-
version:
|
247
|
+
version: 1.3.1
|
248
248
|
requirements: []
|
249
|
-
rubygems_version: 3.4.
|
249
|
+
rubygems_version: 3.4.10
|
250
250
|
signing_key:
|
251
251
|
specification_version: 4
|
252
252
|
summary: Multi-threaded job backend with database queuing for ruby.
|