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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67978c6a1909fafc833c6b6ad0ea257274a7c6e9ae05dfd7c06e1a2b3d6820d0
4
- data.tar.gz: cf0dada853778214e4bef783d356f921e0d153557912a6a00c787270decfaefe
3
+ metadata.gz: a8d7af34429c215680a9297a8e942923259af00163413bebd83d5e9df5d44c34
4
+ data.tar.gz: 9904ef45c2aa86b0b32250564ac17b76494584141be28081f7a1274b7c20692e
5
5
  SHA512:
6
- metadata.gz: db8106c162a7268c40c3bfde3f7ee888d002238a9081f94eb294fa23af97eb687502a7243fd79b4e12c006574324bc1815b114966af43e42d73a837c7a4e3816
7
- data.tar.gz: 0caadfd21d2b8e49f51b2b77cc3858423b0ec7fb21ba5aeab0839e2c17d308de34ecdcdea93e26e15cbc09b4bfccc435f5a05182e93a34eac5f69c3b019247a2
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
- [![Build Status](https://travis-ci.com/logstash-plugins/logstash-mixin-scheduler.svg?branch=main)](https://travis-ci.com/logstash-plugins/logstash-mixin-scheduler)
3
+ [![Unit Tests](https://github.com/logstash-plugins/logstash-mixin-scheduler/actions/workflows/unit-tests.yml/badge.svg?branch=main)](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
- release_scheduler
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
- # Release jobs registered by the plugin from executing.
50
+ # Terminate the scheduler, including any jobs currently executing.
51
51
  # This method executes from the plugin's #close method.
52
- def release_scheduler
53
- @_scheduler.release if @_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
- { :max_work_threads => 2 }
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('* * * * * *') { counter.increment_and_get; sleep 3.25 } # every second
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.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: 2022-06-07 00:00:00.000000000 Z
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.1.6
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: