crono_trigger 0.7.1 → 0.8.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 +4 -4
- data/lib/crono_trigger/polling_thread.rb +7 -1
- data/lib/crono_trigger/schedulable.rb +7 -2
- data/lib/crono_trigger/version.rb +1 -1
- data/lib/crono_trigger/worker.rb +27 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 734da2ad0480e79b440d8ef73f9b83fb88f13e6f6510513340c62b70c3750c39
|
4
|
+
data.tar.gz: b338b9c86a9fdf01d0ba739fa9f53c9536393cec05d7fe5c8943fe05782ad7b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e73b97cece87a4b887e4cec1c5cbd153cc9ad51c3de1956c38ef2a5000fa74c0d3e52c07401c0aa033f0921852a2f6be85533aea050d425dc220c591681a210
|
7
|
+
data.tar.gz: dfbec13afaa581a544b50481fa54509ace24de39f8ecb6d99788e508bd680da1e5afd89abeb0cde7be8ad8db3c7c4b56ae67dbdf0bd087775eaeed62b92d8cac
|
@@ -10,6 +10,7 @@ module CronoTrigger
|
|
10
10
|
end
|
11
11
|
@execution_counter = execution_counter
|
12
12
|
@quiet = Concurrent::AtomicBoolean.new(false)
|
13
|
+
@worker_count = 1
|
13
14
|
end
|
14
15
|
|
15
16
|
def run
|
@@ -58,7 +59,7 @@ module CronoTrigger
|
|
58
59
|
maybe_has_next = true
|
59
60
|
while maybe_has_next && !@stop_flag.set?
|
60
61
|
records, maybe_has_next = model.connection_pool.with_connection do
|
61
|
-
model.executables_with_lock(limit: CronoTrigger.config.fetch_records || CronoTrigger.config.executor_thread * 3)
|
62
|
+
model.executables_with_lock(limit: CronoTrigger.config.fetch_records || CronoTrigger.config.executor_thread * 3, worker_count: @worker_count)
|
62
63
|
end
|
63
64
|
|
64
65
|
records.each do |record|
|
@@ -74,6 +75,11 @@ module CronoTrigger
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
78
|
+
def worker_count=(n)
|
79
|
+
raise ArgumentError, "worker_count must be greater than 0" if n <= 0
|
80
|
+
@worker_count = n
|
81
|
+
end
|
82
|
+
|
77
83
|
private
|
78
84
|
|
79
85
|
def process_record(record)
|
@@ -63,8 +63,11 @@ module CronoTrigger
|
|
63
63
|
end
|
64
64
|
|
65
65
|
module ClassMethods
|
66
|
-
def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3)
|
67
|
-
|
66
|
+
def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3, worker_count: 1)
|
67
|
+
# Fetch more than `limit` records because other workers might have acquired the lock
|
68
|
+
# and this method might not be able to return enough records for the executor to
|
69
|
+
# make the best use of the CPU.
|
70
|
+
ids = executables(limit: limit * worker_count).pluck(:id)
|
68
71
|
maybe_has_next = !ids.empty?
|
69
72
|
records = []
|
70
73
|
ids.each do |id|
|
@@ -75,6 +78,8 @@ module CronoTrigger
|
|
75
78
|
records << r
|
76
79
|
end
|
77
80
|
end
|
81
|
+
|
82
|
+
return [records, maybe_has_next] if records.size == limit
|
78
83
|
end
|
79
84
|
[records, maybe_has_next]
|
80
85
|
end
|
data/lib/crono_trigger/worker.rb
CHANGED
@@ -7,6 +7,7 @@ module CronoTrigger
|
|
7
7
|
HEARTBEAT_INTERVAL = 60
|
8
8
|
SIGNAL_FETCH_INTERVAL = 10
|
9
9
|
MONITOR_INTERVAL = 20
|
10
|
+
WORKER_COUNT_UPDATE_INTERVAL = 60
|
10
11
|
EXECUTOR_SHUTDOWN_TIMELIMIT = 300
|
11
12
|
OTHER_THREAD_SHUTDOWN_TIMELIMIT = 120
|
12
13
|
attr_reader :polling_threads
|
@@ -37,6 +38,7 @@ module CronoTrigger
|
|
37
38
|
@heartbeat_thread = run_heartbeat_thread
|
38
39
|
@signal_fetcn_thread = run_signal_fetch_thread
|
39
40
|
@monitor_thread = run_monitor_thread
|
41
|
+
@worker_count_updater_thread = run_worker_count_updater_thread
|
40
42
|
|
41
43
|
polling_thread_count = CronoTrigger.config.polling_thread || [@model_names.size, Concurrent.processor_count].min
|
42
44
|
# Assign local variable for Signal handling
|
@@ -58,6 +60,7 @@ module CronoTrigger
|
|
58
60
|
@executor.wait_for_termination(EXECUTOR_SHUTDOWN_TIMELIMIT)
|
59
61
|
@heartbeat_thread.join(OTHER_THREAD_SHUTDOWN_TIMELIMIT)
|
60
62
|
@signal_fetcn_thread.join(OTHER_THREAD_SHUTDOWN_TIMELIMIT)
|
63
|
+
@worker_count_updater_thread.join(OTHER_THREAD_SHUTDOWN_TIMELIMIT)
|
61
64
|
|
62
65
|
unregister
|
63
66
|
end
|
@@ -104,6 +107,15 @@ module CronoTrigger
|
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
110
|
+
def run_worker_count_updater_thread
|
111
|
+
update_worker_count
|
112
|
+
Thread.start do
|
113
|
+
until @stop_flag.wait_for_set(WORKER_COUNT_UPDATE_INTERVAL)
|
114
|
+
update_worker_count
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
107
119
|
def heartbeat
|
108
120
|
CronoTrigger::Models::Worker.connection_pool.with_connection do
|
109
121
|
begin
|
@@ -162,7 +174,7 @@ module CronoTrigger
|
|
162
174
|
return unless ActiveSupport::Notifications.notifier.listening?(CronoTrigger::Events::MONITOR)
|
163
175
|
|
164
176
|
CronoTrigger::Models::Worker.connection_pool.with_connection do
|
165
|
-
if
|
177
|
+
if workers_processing_same_models.order(:worker_id).limit(1).pluck(:worker_id).first != @crono_trigger_worker_id
|
166
178
|
# Return immediately to avoid redundant instruments
|
167
179
|
return
|
168
180
|
end
|
@@ -189,5 +201,19 @@ module CronoTrigger
|
|
189
201
|
rescue => ex
|
190
202
|
CronoTrigger::GlobalExceptionHandler.handle_global_exception(ex)
|
191
203
|
end
|
204
|
+
|
205
|
+
def update_worker_count
|
206
|
+
CronoTrigger::Models::Worker.connection_pool.with_connection do
|
207
|
+
worker_count = workers_processing_same_models.count
|
208
|
+
return if worker_count.zero?
|
209
|
+
@polling_threads.each { |th| th.worker_count = worker_count }
|
210
|
+
end
|
211
|
+
rescue => ex
|
212
|
+
CronoTrigger::GlobalExceptionHandler.handle_global_exception(ex)
|
213
|
+
end
|
214
|
+
|
215
|
+
def workers_processing_same_models
|
216
|
+
CronoTrigger.workers.where("polling_model_names = ?", @model_names.to_json)
|
217
|
+
end
|
192
218
|
end
|
193
219
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crono_trigger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joker1007
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chrono
|