crono_trigger 0.6.2 → 0.6.3
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 +16 -30
- data/lib/crono_trigger/schedulable.rb +4 -3
- data/lib/crono_trigger/version.rb +1 -1
- data/lib/crono_trigger/worker.rb +1 -0
- 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: e08f955458cc12b3cd3f3aab84e0f662d760c7a72872c655708e70aa4d4d0ac3
|
4
|
+
data.tar.gz: de4c5fdd13008080291d3adf542e05a9fb5e233f423a8d83ea8bc0bc70a09cde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff4f9d234a111fe0d6815e8d6e4d60a003bfc1891a299b808ac89bfc62ef05f4f0146b770ea924c5a7c592852bfb613053ea41ae51344fcc86c2ed4b00c0ea6f
|
7
|
+
data.tar.gz: eed66811d98184c25ecaa8c8fcecc9a44b4dcf46f8cff4bd469af2131ce948c9eca1f0dfa3185d6e3f42f1411322934d74ba666daa0b014d2092cff0cb46a0c1
|
@@ -5,6 +5,9 @@ module CronoTrigger
|
|
5
5
|
@stop_flag = stop_flag
|
6
6
|
@logger = logger
|
7
7
|
@executor = executor
|
8
|
+
if @executor.fallback_policy != :caller_runs
|
9
|
+
raise ArgumentError, "executor's fallback policies except for :caller_runs are not supported"
|
10
|
+
end
|
8
11
|
@execution_counter = execution_counter
|
9
12
|
@quiet = Concurrent::AtomicBoolean.new(false)
|
10
13
|
end
|
@@ -50,34 +53,28 @@ module CronoTrigger
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def poll(model)
|
53
|
-
@logger.
|
54
|
-
records = []
|
55
|
-
overflowed_record_ids = []
|
56
|
+
@logger.info "(polling-thread-#{Thread.current.object_id}) Poll #{model}"
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
maybe_has_next = true
|
59
|
+
while maybe_has_next
|
60
|
+
records, maybe_has_next = model.connection_pool.with_connection do
|
61
|
+
model.executables_with_lock
|
60
62
|
end
|
61
63
|
|
62
64
|
records.each do |record|
|
63
|
-
|
64
|
-
@
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
@execution_counter.decrement
|
70
|
-
end
|
65
|
+
@executor.post do
|
66
|
+
@execution_counter.increment
|
67
|
+
begin
|
68
|
+
process_record(record)
|
69
|
+
ensure
|
70
|
+
@execution_counter.decrement
|
71
71
|
end
|
72
|
-
rescue Concurrent::RejectedExecutionError
|
73
|
-
overflowed_record_ids << record.id
|
74
72
|
end
|
75
73
|
end
|
76
|
-
|
77
|
-
end while overflowed_record_ids.empty? && records.any?
|
74
|
+
end
|
78
75
|
end
|
79
76
|
|
80
|
-
private
|
77
|
+
private
|
81
78
|
|
82
79
|
def process_record(record)
|
83
80
|
record.class.connection_pool.with_connection do
|
@@ -88,16 +85,5 @@ module CronoTrigger
|
|
88
85
|
@logger.error(ex)
|
89
86
|
CronoTrigger::GlobalExceptionHandler.handle_global_exception(ex)
|
90
87
|
end
|
91
|
-
|
92
|
-
def unlock_overflowed_records(model, overflowed_record_ids)
|
93
|
-
model.connection_pool.with_connection do
|
94
|
-
unless overflowed_record_ids.empty?
|
95
|
-
model.where(id: overflowed_record_ids).crono_trigger_unlock_all!
|
96
|
-
end
|
97
|
-
end
|
98
|
-
rescue ActiveRecord::ConnectionNotEstablished, ActiveRecord::LockWaitTimeout, ActiveRecord::StatementTimeout, ActiveRecord::Deadlocked
|
99
|
-
sleep 1
|
100
|
-
retry
|
101
|
-
end
|
102
88
|
end
|
103
89
|
end
|
@@ -34,7 +34,7 @@ module CronoTrigger
|
|
34
34
|
|
35
35
|
define_model_callbacks :execute, :retry
|
36
36
|
|
37
|
-
scope :executables, ->(from: Time.current, limit: CronoTrigger.config.executor_thread * 3
|
37
|
+
scope :executables, ->(from: Time.current, limit: CronoTrigger.config.executor_thread * 3, including_locked: false) do
|
38
38
|
t = arel_table
|
39
39
|
|
40
40
|
rel = where(t[crono_trigger_column_name(:next_execute_at)].lteq(from))
|
@@ -63,8 +63,9 @@ module CronoTrigger
|
|
63
63
|
end
|
64
64
|
|
65
65
|
module ClassMethods
|
66
|
-
def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3
|
66
|
+
def executables_with_lock(limit: CronoTrigger.config.executor_thread * 3)
|
67
67
|
ids = executables(limit: limit).pluck(:id)
|
68
|
+
maybe_has_next = !ids.empty?
|
68
69
|
records = []
|
69
70
|
ids.each do |id|
|
70
71
|
transaction do
|
@@ -75,7 +76,7 @@ module CronoTrigger
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
78
|
-
records
|
79
|
+
[records, maybe_has_next]
|
79
80
|
end
|
80
81
|
|
81
82
|
def crono_trigger_column_name(name)
|
data/lib/crono_trigger/worker.rb
CHANGED
@@ -24,6 +24,7 @@ module CronoTrigger
|
|
24
24
|
min_threads: 1,
|
25
25
|
max_threads: CronoTrigger.config.executor_thread,
|
26
26
|
max_queue: CronoTrigger.config.executor_thread * 2,
|
27
|
+
fallback_policy: :caller_runs,
|
27
28
|
)
|
28
29
|
@execution_counter = Concurrent::AtomicFixnum.new
|
29
30
|
@logger = Logger.new(STDOUT) unless @logger
|
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.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joker1007
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chrono
|