logstash-filter-grok 3.2.3 → 3.2.4

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
  SHA1:
3
- metadata.gz: e45feb32b6599f171a7d75ef08a165301a02a798
4
- data.tar.gz: d6895d5112db9412404ddb9da3806210b85a15b4
3
+ metadata.gz: b034532a205ad23ce96a26ec94a38168714f89b5
4
+ data.tar.gz: 864f130d2549eeafff4c1f4b5fdd8ab6e2646bab
5
5
  SHA512:
6
- metadata.gz: c5c7c112f2e3e3025ee58eb0ec4dd576db6073e07c3dfd40a53febeca25236aa585d4f8be56d4d6a7c55c4fb961cc665d4116655366ab899d84541da4dbd0301
7
- data.tar.gz: 0d26a71dd53d0fd60bfbeaa7c16455c94206d0149c985677b1e413379d3eef5da3371321d1780102f925be5a47e05ca71d0ae7217f6a4e58bb2e8b922eee1b7e
6
+ metadata.gz: edd8cfade5fef7b64a5199c500574db16848de04fade4cabbfae9c58f07667cc94c23a41ed117f383c683baf44ec06b1b6aeb1048349ca620d147f0139d1d2e7
7
+ data.tar.gz: 1753891e587a891e65cb57b540814d619192a9bf5ef1d71fedb703207e9d5004fd1da26f3cd0725430620555e5bad05b19c2d3b43ef0e79ab937298e71e5931f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.2.4
2
+ - Fix mutex interruption bug that could crash logstash. See: https://github.com/logstash-plugins/logstash-filter-grok/issues/97
3
+
1
4
  ## 3.2.3
2
5
  - No longer use 'trace' log level as it breaks rspec
3
6
  - Fix race conditions in timeout enforcer
@@ -1,6 +1,8 @@
1
+ java_import java.util.concurrent.locks.ReentrantLock
2
+
1
3
  class LogStash::Filters::Grok::TimeoutEnforcer
2
4
  attr_reader :running
3
-
5
+
4
6
  def initialize(logger, timeout_nanos)
5
7
  @logger = logger
6
8
  @running = true
@@ -8,8 +10,8 @@ class LogStash::Filters::Grok::TimeoutEnforcer
8
10
 
9
11
  # Stores running matches with their start time, this is used to cancel long running matches
10
12
  # Is a map of Thread => start_time
11
- @timer_mutex = Mutex.new
12
- @threads_to_start_time = {}
13
+ @threads_to_start_time = {}
14
+ @state_lock = java.util.concurrent.locks.ReentrantLock.new
13
15
  end
14
16
 
15
17
  def grok_till_timeout(event, grok, field, value)
@@ -22,26 +24,59 @@ class LogStash::Filters::Grok::TimeoutEnforcer
22
24
  ensure
23
25
  stop_thread_groking(thread)
24
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
25
30
  thread.interrupted
26
31
  end
27
32
  end
28
33
 
34
+ def start!
35
+ @timer_thread = Thread.new do
36
+ while @running
37
+ begin
38
+ cancel_timed_out!
39
+ rescue Exception => e
40
+ @logger.error("Error while attempting to check/cancel excessively long grok patterns",
41
+ :message => e.message,
42
+ :class => e.class.name,
43
+ :backtrace => e.backtrace
44
+ )
45
+ end
46
+ sleep 0.25
47
+ end
48
+ end
49
+ end
50
+
51
+ def stop!
52
+ @running = false
53
+ # Check for the thread mostly for a fast start/shutdown scenario
54
+ @timer_thread.join if @timer_thread
55
+ end
56
+
57
+ private
58
+
59
+ # These methods are private in large part because if they aren't called
60
+ # in specific sequence and used together in specific ways the interrupt
61
+ # behavior will be incorrect. Do NOT use or modify these methods unless
62
+ # you know what you are doing!
63
+
29
64
  def start_thread_groking(thread)
30
65
  # Clear any interrupts from any previous invocations that were not caught by Joni
31
66
  thread.interrupted
32
- @timer_mutex.synchronize do
67
+ synchronize do
33
68
  @threads_to_start_time[thread] = java.lang.System.nanoTime()
34
69
  end
35
70
  end
36
71
 
37
72
  def stop_thread_groking(thread)
38
- @timer_mutex.synchronize do
73
+ synchronize do
39
74
  @threads_to_start_time.delete(thread)
40
75
  end
41
76
  end
42
77
 
43
78
  def cancel_timed_out!
44
- @timer_mutex.synchronize do
79
+ synchronize do
45
80
  @threads_to_start_time.each do |thread,start_time|
46
81
  now = java.lang.System.nanoTime # save ourselves some nanotime calls
47
82
  elapsed = java.lang.System.nanoTime - start_time
@@ -56,26 +91,16 @@ class LogStash::Filters::Grok::TimeoutEnforcer
56
91
  end
57
92
  end
58
93
 
59
- def start!
60
- @timer_thread = Thread.new do
61
- while @running
62
- begin
63
- cancel_timed_out!
64
- rescue Exception => e
65
- @logger.error("Error while attempting to check/cancel excessively long grok patterns",
66
- :message => e.message,
67
- :class => e.class.name,
68
- :backtrace => e.backtrace
69
- )
70
- end
71
- sleep 0.25
72
- end
73
- end
94
+ # We use this instead of a Mutex because JRuby mutexes are interruptible
95
+ # We actually don't want that behavior since we always clear the interrupt in
96
+ # grok_till_timeout
97
+ def synchronize
98
+ # The JRuby Mutex uses lockInterruptibly which is what we DO NOT want
99
+ @state_lock.lock()
100
+ yield
101
+ ensure
102
+ @state_lock.unlock()
74
103
  end
75
104
 
76
- def stop!
77
- @running = false
78
- # Check for the thread mostly for a fast start/shutdown scenario
79
- @timer_thread.join if @timer_thread
80
- end
105
+
81
106
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-grok'
4
- s.version = '3.2.3'
4
+ s.version = '3.2.4'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Parse arbitrary text and structure it."
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: 3.2.3
4
+ version: 3.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-14 00:00:00.000000000 Z
11
+ date: 2016-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement