gouda 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +18 -9
- data/.gitignore +2 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +4 -1
- data/gouda.gemspec +2 -2
- data/lib/gouda/active_job_extensions/concurrency.rb +1 -1
- data/lib/gouda/scheduler.rb +1 -1
- data/lib/gouda/version.rb +1 -1
- data/lib/gouda/worker.rb +1 -1
- data/lib/gouda/workload.rb +3 -3
- data/lib/gouda.rb +1 -1
- data/tmp/.keep +0 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69ee0eda4e10e8777d9cb1df596472103558ace52ba2fd018de2fcbc28a59ead
|
4
|
+
data.tar.gz: 7d2eb26cafd53af69e52f8a5de8adf8d08678d7618dbccc6d50c500e49780c92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bb748afdacae3fe76ee49a4b82e45c282d3feeee6fb69cb390b57e9b05db9108d692521454121724fbec81970c297117befd900dde9a687bfc51d8b08a4cd8e
|
7
|
+
data.tar.gz: f14f7bad25ba4d0b2c22ec0dad98747ef1a1e79fa3a5978b987f13fbe340220eddfe6958fa1751083402c7f65a6e3f4129fdbb53bfa0d6e87ecc45692b7d4548
|
data/.github/workflows/ci.yml
CHANGED
@@ -9,28 +9,37 @@ env:
|
|
9
9
|
jobs:
|
10
10
|
test:
|
11
11
|
name: Tests
|
12
|
-
runs-on: ubuntu-
|
12
|
+
runs-on: ubuntu-22.04
|
13
|
+
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
|
14
|
+
strategy:
|
15
|
+
matrix:
|
16
|
+
ruby:
|
17
|
+
- '2.7'
|
18
|
+
- '3.0'
|
19
|
+
- '3.1'
|
20
|
+
- '3.2'
|
21
|
+
- '3.3'
|
13
22
|
services:
|
14
23
|
postgres:
|
15
|
-
image: postgres
|
24
|
+
image: postgres
|
16
25
|
env:
|
17
26
|
POSTGRES_PASSWORD: postgres
|
27
|
+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
18
28
|
ports:
|
19
29
|
- 5432:5432
|
20
|
-
options: >-
|
21
|
-
--health-cmd pg_isready
|
22
|
-
--health-interval 100ms
|
23
|
-
--health-timeout 1s
|
24
|
-
--health-retries 100
|
25
30
|
|
26
|
-
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
|
27
31
|
steps:
|
28
32
|
- name: Checkout
|
29
33
|
uses: actions/checkout@v4
|
30
34
|
- name: Setup Ruby
|
31
35
|
uses: ruby/setup-ruby@v1
|
32
36
|
with:
|
33
|
-
ruby-version:
|
37
|
+
ruby-version: ${{ matrix.ruby }}
|
34
38
|
bundler-cache: true
|
35
39
|
- name: "Tests and Lint"
|
36
40
|
run: bundle exec rake
|
41
|
+
env:
|
42
|
+
PGHOST: localhost
|
43
|
+
PGUSER: postgres
|
44
|
+
PGPASSWORD: postgres
|
45
|
+
TESTOPTS: "--fail-fast"
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.1
|
data/CHANGELOG.md
CHANGED
data/gouda.gemspec
CHANGED
@@ -4,12 +4,12 @@ Gem::Specification.new do |spec|
|
|
4
4
|
spec.name = "gouda"
|
5
5
|
spec.version = Gouda::VERSION
|
6
6
|
spec.summary = "Job Scheduler"
|
7
|
-
spec.description = "Job Scheduler for Rails"
|
7
|
+
spec.description = "Job Scheduler for Rails and PostgreSQL"
|
8
8
|
spec.authors = ["Sebastian van Hesteren", "Julik Tarkhanov"]
|
9
9
|
spec.email = ["sebastian@cheddar.me", "me@julik.nl"]
|
10
10
|
spec.homepage = "https://rubygems.org/gems/gouda"
|
11
11
|
spec.license = "MIT"
|
12
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
12
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
13
13
|
spec.require_paths = ["lib"]
|
14
14
|
|
15
15
|
spec.metadata["homepage_uri"] = spec.homepage
|
data/lib/gouda/scheduler.rb
CHANGED
@@ -72,7 +72,7 @@ module Gouda::Scheduler
|
|
72
72
|
# `class` is a reserved keyword and a method that exists on every Ruby object so...
|
73
73
|
cron_entry_params[:job_class] ||= cron_entry_params.delete(:class)
|
74
74
|
params_with_defaults = defaults.merge(cron_entry_params)
|
75
|
-
Entry.new(name
|
75
|
+
Entry.new(name: name, **params_with_defaults)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
data/lib/gouda/version.rb
CHANGED
data/lib/gouda/worker.rb
CHANGED
@@ -135,7 +135,7 @@ module Gouda
|
|
135
135
|
break if check_shutdown.call
|
136
136
|
|
137
137
|
did_process = Gouda.config.app_executor.wrap do
|
138
|
-
Gouda::Workload.checkout_and_perform_one(executing_on: worker_id_and_thread_id, queue_constraint
|
138
|
+
Gouda::Workload.checkout_and_perform_one(executing_on: worker_id_and_thread_id, queue_constraint: queue_constraint, in_progress: executing_workload_ids)
|
139
139
|
end
|
140
140
|
|
141
141
|
# If no job was retrieved the queue is likely empty. Relax the polling then and ease off.
|
data/lib/gouda/workload.rb
CHANGED
@@ -66,7 +66,7 @@ class Gouda::Workload < ActiveRecord::Base
|
|
66
66
|
# Appsignal.increment_counter("gouda_workloads_revived", 1, job_class: workload.active_job_class_name)
|
67
67
|
|
68
68
|
interrupted_at = workload.last_execution_heartbeat_at
|
69
|
-
workload.update!(state: "finished", interrupted_at
|
69
|
+
workload.update!(state: "finished", interrupted_at: interrupted_at, last_execution_heartbeat_at: Time.now.utc, execution_finished_at: Time.now.utc)
|
70
70
|
revived_job = ActiveJob::Base.deserialize(workload.active_job_data)
|
71
71
|
# Save the interrupted_at timestamp so that upon execution the new job will raise a Gouda::Interrpupted exception.
|
72
72
|
# The exception can then be handled like any other ActiveJob exception (using rescue_from or similar).
|
@@ -116,7 +116,7 @@ class Gouda::Workload < ActiveRecord::Base
|
|
116
116
|
uncached do # Necessary because we SELECT with a clock_timestamp() which otherwise gets cached by ActiveRecord query cache
|
117
117
|
transaction do
|
118
118
|
jobs.first.tap do |job|
|
119
|
-
job&.update!(state: "executing", executing_on
|
119
|
+
job&.update!(state: "executing", executing_on: executing_on, last_execution_heartbeat_at: Time.now.utc, execution_started_at: Time.now.utc)
|
120
120
|
end
|
121
121
|
rescue ActiveRecord::RecordNotUnique
|
122
122
|
# It can happen that due to a race the `execution_concurrency_key NOT IN` does not capture
|
@@ -133,7 +133,7 @@ class Gouda::Workload < ActiveRecord::Base
|
|
133
133
|
# @param in_progress[#add,#delete] Used for tracking work in progress for heartbeats
|
134
134
|
def self.checkout_and_perform_one(executing_on:, queue_constraint: Gouda::AnyQueue, in_progress: Set.new)
|
135
135
|
# Select a job and mark it as "executing" which will make it unavailable to any other
|
136
|
-
workload = checkout_and_lock_one(executing_on
|
136
|
+
workload = checkout_and_lock_one(executing_on: executing_on, queue_constraint: queue_constraint)
|
137
137
|
if workload
|
138
138
|
in_progress.add(workload.id)
|
139
139
|
workload.perform_and_update_state!
|
data/lib/gouda.rb
CHANGED
@@ -57,7 +57,7 @@ module Gouda
|
|
57
57
|
Gouda.logger.info("Gouda version: #{Gouda::VERSION}")
|
58
58
|
Gouda.logger.info("Worker threads: #{Gouda.config.worker_thread_count}")
|
59
59
|
|
60
|
-
Gouda.worker_loop(n_threads: Gouda.config.worker_thread_count, queue_constraint:)
|
60
|
+
Gouda.worker_loop(n_threads: Gouda.config.worker_thread_count, queue_constraint: queue_constraint)
|
61
61
|
end
|
62
62
|
|
63
63
|
def self.config
|
data/tmp/.keep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gouda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian van Hesteren
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
|
-
description: Job Scheduler for Rails
|
126
|
+
description: Job Scheduler for Rails and PostgreSQL
|
127
127
|
email:
|
128
128
|
- sebastian@cheddar.me
|
129
129
|
- me@julik.nl
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/gouda/version.rb
|
158
158
|
- lib/gouda/worker.rb
|
159
159
|
- lib/gouda/workload.rb
|
160
|
+
- tmp/.keep
|
160
161
|
homepage: https://rubygems.org/gems/gouda
|
161
162
|
licenses:
|
162
163
|
- MIT
|
@@ -172,14 +173,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
173
|
requirements:
|
173
174
|
- - ">="
|
174
175
|
- !ruby/object:Gem::Version
|
175
|
-
version: 2.
|
176
|
+
version: 2.7.0
|
176
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
178
|
requirements:
|
178
179
|
- - ">="
|
179
180
|
- !ruby/object:Gem::Version
|
180
181
|
version: '0'
|
181
182
|
requirements: []
|
182
|
-
rubygems_version: 3.
|
183
|
+
rubygems_version: 3.5.9
|
183
184
|
signing_key:
|
184
185
|
specification_version: 4
|
185
186
|
summary: Job Scheduler
|