logstash-mixin-scheduler 1.0.0-java → 1.0.2-java
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/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/lib/logstash/plugin_mixins/scheduler/rufus_impl.rb +9 -1
- data/lib/logstash/plugin_mixins/scheduler.rb +12 -4
- data/spec/logstash/plugin_mixins/scheduler/rufus_impl_spec.rb +59 -2
- data/spec/logstash/plugin_mixins/scheduler_spec.rb +11 -0
- metadata +13 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a8d7af34429c215680a9297a8e942923259af00163413bebd83d5e9df5d44c34
|
|
4
|
+
data.tar.gz: 9904ef45c2aa86b0b32250564ac17b76494584141be28081f7a1274b7c20692e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e43c4643ec3c3ab0df62e7d41022734735b050c8eb3752e61ce8ebd406a6d9b29b2ef2af2827fddd7c44e7b5516c971375f36008e6bd6d0baefc9c5ab35c43bc
|
|
7
|
+
data.tar.gz: 5ce2f3c51c33b48b8aa2e0339c4c4f3210b7bc12a796559b9c40af9b61626b5010aadc309ac805700c2838f32c2866ffbc170ada9cb01f0cde1e99f486abfe7c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
## 1.0.2
|
|
2
|
+
- Fix: terminate idle scheduler work threads on plugin close, which leaked one thread per pipeline reload [#7](https://github.com/logstash-plugins/logstash-mixin-scheduler/pull/7)
|
|
3
|
+
|
|
4
|
+
## 1.0.1
|
|
5
|
+
- Refactor: initialize time zone data eagerly [#2](https://github.com/logstash-plugins/logstash-mixin-scheduler/pull/2)
|
|
6
|
+
|
|
1
7
|
## 1.0.0
|
|
2
8
|
- Feat: a common scheduler interface [#1](https://github.com/logstash-plugins/logstash-mixin-scheduler/pull/1)
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Scheduler Mixin
|
|
2
2
|
|
|
3
|
-
[](https://github.com/logstash-plugins/logstash-mixin-scheduler/actions/workflows/unit-tests.yml)
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
## Usage
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
require 'rufus/scheduler'
|
|
2
|
-
|
|
2
|
+
begin
|
|
3
|
+
require 'et-orbi.rb' # a dependency of rufus-scheduler since 3.4
|
|
4
|
+
::EtOrbi::EoTime.now # might take a long time to initialize - loading time zone
|
|
5
|
+
# data (from tz-info) and thus gets un-predictable on CI, since the scheduler worker
|
|
6
|
+
# thread might be stuck starting while we attempt to shutdown in a given time frame
|
|
7
|
+
rescue LoadError
|
|
8
|
+
end
|
|
3
9
|
require 'logstash/util/loggable'
|
|
4
10
|
|
|
5
11
|
module LogStash module PluginMixins module Scheduler module RufusImpl
|
|
@@ -43,6 +49,8 @@ module LogStash module PluginMixins module Scheduler module RufusImpl
|
|
|
43
49
|
# @overload
|
|
44
50
|
def release!; @impl.shutdown(:wait) end
|
|
45
51
|
# @overload
|
|
52
|
+
def terminate!; @impl.shutdown(:kill) end
|
|
53
|
+
# @overload
|
|
46
54
|
def running?; !@impl.down? end
|
|
47
55
|
|
|
48
56
|
# @overload
|
|
@@ -37,7 +37,7 @@ module LogStash
|
|
|
37
37
|
module CloseHook
|
|
38
38
|
def close
|
|
39
39
|
super # plugin.close
|
|
40
|
-
|
|
40
|
+
terminate_scheduler!
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
private_constant :CloseHook
|
|
@@ -47,10 +47,10 @@ module LogStash
|
|
|
47
47
|
|
|
48
48
|
private
|
|
49
49
|
|
|
50
|
-
#
|
|
50
|
+
# Terminate the scheduler, including any jobs currently executing.
|
|
51
51
|
# This method executes from the plugin's #close method.
|
|
52
|
-
def
|
|
53
|
-
@_scheduler.
|
|
52
|
+
def terminate_scheduler!
|
|
53
|
+
@_scheduler.terminate! if @_scheduler
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
# Release jobs registered by the plugin from executing.
|
|
@@ -117,6 +117,14 @@ module LogStash
|
|
|
117
117
|
# @abstract
|
|
118
118
|
def release!; release end
|
|
119
119
|
|
|
120
|
+
# Fully and immediately terminate the scheduler:
|
|
121
|
+
# - prevents additional jobs from being registered,
|
|
122
|
+
# - unschedules all future invocations of jobs previously registered,
|
|
123
|
+
# - and stops any jobs currently executing.
|
|
124
|
+
#
|
|
125
|
+
# @abstract
|
|
126
|
+
def terminate!; release! end
|
|
127
|
+
|
|
120
128
|
# Is this scheduler potentially executing our jobs.
|
|
121
129
|
#
|
|
122
130
|
# @abstract
|
|
@@ -7,7 +7,7 @@ describe LogStash::PluginMixins::Scheduler::RufusImpl do
|
|
|
7
7
|
let(:name) { '[test]<jdbc_scheduler' }
|
|
8
8
|
|
|
9
9
|
let(:opts) do
|
|
10
|
-
{ :
|
|
10
|
+
{ max_work_threads: 2, frequency: 0.2 }
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
subject(:scheduler) do
|
|
@@ -45,6 +45,47 @@ describe LogStash::PluginMixins::Scheduler::RufusImpl do
|
|
|
45
45
|
try(10) { expect(join_thread).to_not be_alive }
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
it "terminates idle work threads on terminate!" do
|
|
49
|
+
scheduler.every('0.2s') { }
|
|
50
|
+
sleep 0.5
|
|
51
|
+
scheduler.impl.jobs.each(&:unschedule)
|
|
52
|
+
sleep 0.5
|
|
53
|
+
work_threads = scheduler.impl.work_threads
|
|
54
|
+
expect( work_threads.count(&:alive?) ).to be >= 1
|
|
55
|
+
scheduler.terminate!
|
|
56
|
+
try(10) { expect( work_threads.count(&:alive?) ).to eql 0 }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with a job in flight' do
|
|
60
|
+
|
|
61
|
+
let(:started) { java.util.concurrent.CountDownLatch.new(1) }
|
|
62
|
+
let(:completed) { java.util.concurrent.atomic.AtomicBoolean.new(false) }
|
|
63
|
+
|
|
64
|
+
before do
|
|
65
|
+
scheduler.in('0.1s') do
|
|
66
|
+
started.count_down
|
|
67
|
+
sleep 2
|
|
68
|
+
completed.set(true)
|
|
69
|
+
end
|
|
70
|
+
expect( started.await(5, java.util.concurrent.TimeUnit::SECONDS) ).to be true
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "release! (from #stop) blocks until the running job finishes" do
|
|
74
|
+
work_threads = scheduler.impl.work_threads
|
|
75
|
+
scheduler.release!
|
|
76
|
+
expect( completed.get ).to be true
|
|
77
|
+
expect( work_threads.count(&:alive?) ).to eql 0
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "terminate! (from #close) stops the running job" do
|
|
81
|
+
work_threads = scheduler.impl.work_threads
|
|
82
|
+
scheduler.terminate!
|
|
83
|
+
expect( completed.get ).to be false
|
|
84
|
+
try(10) { expect( work_threads.count(&:alive?) ).to eql 0 }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
48
89
|
context 'cron schedule' do
|
|
49
90
|
|
|
50
91
|
before do
|
|
@@ -83,7 +124,10 @@ describe LogStash::PluginMixins::Scheduler::RufusImpl do
|
|
|
83
124
|
let(:counter) { java.util.concurrent.atomic.AtomicLong.new(0) }
|
|
84
125
|
|
|
85
126
|
before do
|
|
86
|
-
scheduler.cron('* * * * * *')
|
|
127
|
+
scheduler.cron('* * * * * *') do # every second
|
|
128
|
+
counter.increment_and_get
|
|
129
|
+
sleep_at_least 3.25
|
|
130
|
+
end
|
|
87
131
|
end
|
|
88
132
|
|
|
89
133
|
it "are working" do
|
|
@@ -102,4 +146,17 @@ describe LogStash::PluginMixins::Scheduler::RufusImpl do
|
|
|
102
146
|
|
|
103
147
|
end
|
|
104
148
|
|
|
149
|
+
private
|
|
150
|
+
|
|
151
|
+
# with multiple threads on JRuby 9.3 -> some tend to finish 'early'
|
|
152
|
+
def sleep_at_least(time)
|
|
153
|
+
start = Time.now
|
|
154
|
+
slept = 0
|
|
155
|
+
while slept < time
|
|
156
|
+
sleep(time - slept)
|
|
157
|
+
slept = Time.now - start
|
|
158
|
+
end
|
|
159
|
+
slept
|
|
160
|
+
end
|
|
161
|
+
|
|
105
162
|
end
|
|
@@ -55,6 +55,17 @@ describe LogStash::PluginMixins::Scheduler do
|
|
|
55
55
|
expect( scheduler.running? ).to be false
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
+
it 'terminates scheduler work threads on close' do
|
|
59
|
+
scheduler = plugin.scheduler
|
|
60
|
+
ran = java.util.concurrent.CountDownLatch.new(1)
|
|
61
|
+
scheduler.every('1s') { ran.count_down }
|
|
62
|
+
expect( ran.await(10, java.util.concurrent.TimeUnit::SECONDS) ).to be true
|
|
63
|
+
work_threads = scheduler.impl.work_threads
|
|
64
|
+
expect( work_threads.count(&:alive?) ).to be >= 1
|
|
65
|
+
plugin.do_close
|
|
66
|
+
try(10) { expect( work_threads.count(&:alive?) ).to eql 0 }
|
|
67
|
+
end
|
|
68
|
+
|
|
58
69
|
it 'shuts-down the scheduler on stop' do
|
|
59
70
|
scheduler = plugin.scheduler
|
|
60
71
|
plugin.stop
|
metadata
CHANGED
|
@@ -1,86 +1,84 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: logstash-mixin-scheduler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: java
|
|
6
6
|
authors:
|
|
7
7
|
- Elastic
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2026-09-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: logstash-core
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
18
|
version: '7.16'
|
|
19
|
-
name: logstash-core
|
|
20
|
-
prerelease: false
|
|
21
19
|
type: :runtime
|
|
20
|
+
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - ">="
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: '7.16'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rufus-scheduler
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
32
|
version: 3.0.9
|
|
33
|
-
name: rufus-scheduler
|
|
34
|
-
prerelease: false
|
|
35
33
|
type: :runtime
|
|
34
|
+
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - ">="
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
39
|
version: 3.0.9
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: logstash-devutils
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - ">="
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
46
|
version: '0'
|
|
47
|
-
name: logstash-devutils
|
|
48
|
-
prerelease: false
|
|
49
47
|
type: :development
|
|
48
|
+
prerelease: false
|
|
50
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
50
|
requirements:
|
|
52
51
|
- - ">="
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
53
|
version: '0'
|
|
55
54
|
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: logstash-codec-plain
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - ">="
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
60
|
version: '0'
|
|
61
|
-
name: logstash-codec-plain
|
|
62
|
-
prerelease: false
|
|
63
61
|
type: :development
|
|
62
|
+
prerelease: false
|
|
64
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
64
|
requirements:
|
|
66
65
|
- - ">="
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
67
|
version: '0'
|
|
69
68
|
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rspec
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
74
|
version: '3.9'
|
|
75
|
-
name: rspec
|
|
76
|
-
prerelease: false
|
|
77
75
|
type: :development
|
|
76
|
+
prerelease: false
|
|
78
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
78
|
requirements:
|
|
80
79
|
- - "~>"
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
81
|
version: '3.9'
|
|
83
|
-
description:
|
|
84
82
|
email: info@elastic.co
|
|
85
83
|
executables: []
|
|
86
84
|
extensions: []
|
|
@@ -98,7 +96,6 @@ homepage: https://github.com/logstash-plugins/logstash-mixin-scheduler
|
|
|
98
96
|
licenses:
|
|
99
97
|
- Apache-2.0
|
|
100
98
|
metadata: {}
|
|
101
|
-
post_install_message:
|
|
102
99
|
rdoc_options: []
|
|
103
100
|
require_paths:
|
|
104
101
|
- lib
|
|
@@ -113,8 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
113
110
|
- !ruby/object:Gem::Version
|
|
114
111
|
version: '0'
|
|
115
112
|
requirements: []
|
|
116
|
-
rubygems_version: 3.
|
|
117
|
-
signing_key:
|
|
113
|
+
rubygems_version: 3.6.3
|
|
118
114
|
specification_version: 4
|
|
119
115
|
summary: Scheduler for Logstash plugins
|
|
120
116
|
test_files:
|