logstash-filter-grok 4.0.0 → 4.0.1

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: d06febb2d4c48dd7c02d2d89ecbe2c379c345b980687d10e80542192f3b232d9
4
- data.tar.gz: ddb45461cff71c3fee2c7cd9e84780e0c0c216b207c23cee42ed39d499be25bf
3
+ metadata.gz: 4a821dcb7736046a21e53c4cbb4d23e9e807175c0641e4f6855674bca39e00cb
4
+ data.tar.gz: e1b8780ab43c0701dc8a4c6db7335da834fd6fb057957dbca8d61bb190c8585b
5
5
  SHA512:
6
- metadata.gz: 7db250b93474764efb1c769aab63fe9e8850fa9eac4e14ad4b5ec82bdb296d6fe6edc92e4604c7f70cc52199929b2ce31b523cd07f75abb7fd781da64f74b385
7
- data.tar.gz: 55051f431618fa87a944984de8b62ec81daaed169e719fad74d84d323b034d776d76bf26d568f5b587cabd16008ff2154c6b245f640287df36cf26ed7b7a0f9c
6
+ metadata.gz: ce2e26791c303cd15c504e136252cf01ced839481a2afd01536a76253b12f87f0d48826b522315f6b19dd0cdeefbb23ea9d7718e5dedfb3096539e077fd8f1d0
7
+ data.tar.gz: 386308027f66ec688f55712d83acca7f692f6b9fad3c0cbe0a4bc865e1beaa2c5d4c32757a572f388a73bede0788e11740ce989b84516da26e651095ed70cef1
@@ -1,3 +1,6 @@
1
+ ## 4.0.1
2
+ - Fix a potential race
3
+
1
4
  ## 4.0.0
2
5
  - Major performance improvements due to reduced locking
3
6
 
@@ -1,44 +1,37 @@
1
1
  class LogStash::Filters::Grok::TimeoutEnforcer
2
- attr_reader :running
3
-
4
2
  def initialize(logger, timeout_nanos)
5
3
  @logger = logger
6
- @running = false
4
+ @running = java.util.concurrent.atomic.AtomicBoolean.new(false)
7
5
  @timeout_nanos = timeout_nanos
8
6
 
9
7
  # Stores running matches with their start time, this is used to cancel long running matches
10
8
  # Is a map of Thread => start_time
11
9
  @threads_to_start_time = java.util.concurrent.ConcurrentHashMap.new
12
- @cancel_mutex = Mutex.new
10
+ end
11
+
12
+ def running
13
+ @running.get()
13
14
  end
14
15
 
15
16
  def grok_till_timeout(grok, field, value)
16
17
  begin
17
18
  thread = java.lang.Thread.currentThread()
18
- start_thread_groking(thread)
19
+ @threads_to_start_time.put(thread, java.lang.System.nanoTime)
19
20
  grok.execute(value)
20
- rescue InterruptedRegexpError => e
21
+ rescue InterruptedRegexpError, java.lang.InterruptedException => e
21
22
  raise ::LogStash::Filters::Grok::TimeoutException.new(grok, field, value)
22
23
  ensure
23
- unless stop_thread_groking(thread)
24
- @cancel_mutex.lock
25
- begin
26
- # Clear any interrupts from any previous invocations that were not caught by Joni
27
- # It may appear that this should go in #stop_thread_groking but that would actually
28
- # break functionality! If this were moved there we would clear the interrupt
29
- # immediately after setting it in #cancel_timed_out, hence this MUST be here
30
- java.lang.Thread.interrupted
31
- ensure
32
- @cancel_mutex.unlock
33
- end
34
- end
24
+ # If the regexp finished, but interrupt was called after, we'll want to
25
+ # clear the interrupted status anyway
26
+ @threads_to_start_time.remove(thread)
27
+ thread.interrupted
35
28
  end
36
29
  end
37
30
 
38
31
  def start!
39
- @running = true
32
+ @running.set(true)
40
33
  @timer_thread = Thread.new do
41
- while @running
34
+ while @running.get()
42
35
  begin
43
36
  cancel_timed_out!
44
37
  rescue Exception => e
@@ -54,49 +47,23 @@ class LogStash::Filters::Grok::TimeoutEnforcer
54
47
  end
55
48
 
56
49
  def stop!
57
- @running = false
50
+ @running.set(false)
58
51
  # Check for the thread mostly for a fast start/shutdown scenario
59
52
  @timer_thread.join if @timer_thread
60
53
  end
61
54
 
62
55
  private
63
56
 
64
- # These methods are private in large part because if they aren't called
65
- # in specific sequence and used together in specific ways the interrupt
66
- # behavior will be incorrect. Do NOT use or modify these methods unless
67
- # you know what you are doing!
68
-
69
- def start_thread_groking(thread)
70
- # Clear any interrupts from any previous invocations that were not caught by Joni
71
- java.lang.Thread.interrupted
72
- @threads_to_start_time.put(thread, java.lang.System.nanoTime)
73
- end
74
-
75
- # Returns falsy in case there was no Grok execution in progress for the thread
76
- def stop_thread_groking(thread)
77
- @threads_to_start_time.remove(thread)
78
- end
79
-
80
57
  def cancel_timed_out!
81
58
  now = java.lang.System.nanoTime # save ourselves some nanotime calls
82
- @threads_to_start_time.entry_set.each do |entry|
83
- start_time = entry.get_value
84
- if start_time < now && now - start_time > @timeout_nanos
85
- thread = entry.get_key
86
- # Ensure that we never attempt to cancel this thread unless a Grok execution is in progress
87
- # Theoretically there is a race condition here in case the entry's grok action changed
88
- # between evaluating the above condition on the start_time and calling stop_thread_groking
89
- # Practically this is impossible, since it would require a whole loop of writing to an
90
- # output, pulling new input events and starting a new Grok execution in worker thread
91
- # in between the above `if start_time < now && now - start_time > @timeout_nanos` and
92
- # the call to `stop_thread_groking`.
93
- if stop_thread_groking(thread)
94
- @cancel_mutex.lock
95
- begin
96
- thread.interrupt()
97
- ensure
98
- @cancel_mutex.unlock
99
- end
59
+ @threads_to_start_time.forEach do |thread, start_time|
60
+ # Use compute to lock this value
61
+ @threads_to_start_time.computeIfPresent(thread) do |thread, start_time|
62
+ if start_time < now && now - start_time > @timeout_nanos
63
+ thread.interrupt
64
+ nil # Delete the key
65
+ else
66
+ start_time # preserve the key
100
67
  end
101
68
  end
102
69
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-grok'
4
- s.version = '4.0.0'
4
+ s.version = '4.0.1'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Parses unstructured event data into fields"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-grok
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-27 00:00:00.000000000 Z
11
+ date: 2017-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement