logstash-integration-jdbc 5.1.5 → 5.1.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71904a199b39255cbefb08b1c43a08e0507df8af19be11ae3b57b69519d337f5
4
- data.tar.gz: 17e4ef460ad1e9d51d0ecada1d94b6d41951a65e65f316e287ad58331f5a4211
3
+ metadata.gz: 9f3116d5abaa413fd73af725208c422a1cf98961ce7095c4d88fd7f14cb6c59d
4
+ data.tar.gz: 0ef2f5fd309236b8ec0e14bb38d275e26b3d2002cdb172a2d30d53682606ddec
5
5
  SHA512:
6
- metadata.gz: 503737f45cfcba0724d533664b14bda25bf9abd0c5de549973857855f00722a666022693d1d22e517b735e6171a06d20cd31e11492c7d60321b3456627eab05f
7
- data.tar.gz: 78d36bd182723abdc72ebf7809f76b86111d3e8bc4111bb08c5a8363fe88e8fe38c4ab563f1408f60c7b0b491f3802c69a31259e4035e8bebcd4bbfc5e8636d9
6
+ metadata.gz: d701317b4edbe221b2dd9a66d6e2591a0a78e8b9502373860656a5d95f552eee06ae752904687b58b2dfda274dc7c20e5da3e5bebbefbd98c538c107f49bec7a
7
+ data.tar.gz: 22a9383f113f01025ba2f694cd61845aa4ed08474efc70cb37694993babb9ec7d6ac3d95291bbf2fe5b22835a8923ab1802061d861da2e59d5b0e3041f7b18ed
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## 5.1.10
2
+ - Refactor: to explicit Java (driver) class name loading [#96](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/96),
3
+ the change is expected to provide a more robust fix for the driver loading issue [#83](https://github.com/logstash-plugins/logstash-integration-jdbc/issues/83).
4
+
5
+ - Fix: regression due returning the Java driver class [#98](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/98)
6
+
7
+ ## 5.1.9 (yanked)
8
+ - Refactor: to explicit Java (driver) class name loading [#96](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/96),
9
+ the change is expected to provide a more robust fix for the driver loading issue [#83](https://github.com/logstash-plugins/logstash-integration-jdbc/issues/83).
10
+
11
+ ## 5.1.8
12
+ - Fix the blocking pipeline reload and shutdown when connectivity issues happen [#85](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/85)
13
+
14
+ ## 5.1.7
15
+ - Normalize jdbc_driver_class loading to support any top-level java packages [#86](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/86)
16
+
17
+ ## 5.1.6
18
+ - Fix, serialize the JDBC driver loading steps to avoid concurrency issues [#84](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/84)
19
+
1
20
  ## 5.1.5
2
21
  - Refined ECS support [#82](https://github.com/logstash-plugins/logstash-integration-jdbc/pull/82)
3
22
  - Uses shared `target` guidance when ECS compatibility is enabled
@@ -1,9 +1,14 @@
1
+ require 'jruby'
1
2
 
2
3
  module LogStash module PluginMixins module Jdbc
3
4
  module Common
4
5
 
5
6
  private
6
7
 
8
+ # NOTE: using the JRuby mechanism to load classes (through JavaSupport)
9
+ # makes the lock redundant although it does not hurt to have it around.
10
+ DRIVERS_LOADING_LOCK = java.util.concurrent.locks.ReentrantLock.new()
11
+
7
12
  def complete_sequel_opts(defaults = {})
8
13
  sequel_opts = @sequel_opts.
9
14
  map { |key,val| [key.is_a?(String) ? key.to_sym : key, val] }.
@@ -22,18 +27,25 @@ module LogStash module PluginMixins module Jdbc
22
27
  require "sequel"
23
28
  require "sequel/adapters/jdbc"
24
29
 
25
- load_driver_jars
30
+ # execute all the driver loading related duties in a serial fashion to avoid
31
+ # concurrency related problems with multiple pipelines and multiple drivers
32
+ DRIVERS_LOADING_LOCK.lock()
26
33
  begin
27
- @driver_impl = Sequel::JDBC.load_driver(@jdbc_driver_class)
28
- rescue Sequel::AdapterNotFound => e # Sequel::AdapterNotFound, "#{@jdbc_driver_class} not loaded"
29
- # fix this !!!
30
- message = if jdbc_driver_library_set?
31
- "Are you sure you've included the correct jdbc driver in :jdbc_driver_library?"
32
- else
33
- ":jdbc_driver_library is not set, are you sure you included " +
34
- "the proper driver client libraries in your classpath?"
35
- end
36
- raise LogStash::PluginLoadingError, "#{e}. #{message}"
34
+ load_driver_jars
35
+ begin
36
+ @driver_impl = load_jdbc_driver_class
37
+ rescue => e # catch java.lang.ClassNotFoundException, potential errors
38
+ # (e.g. ExceptionInInitializerError or LinkageError) won't get caught
39
+ message = if jdbc_driver_library_set?
40
+ "Are you sure you've included the correct jdbc driver in :jdbc_driver_library?"
41
+ else
42
+ ":jdbc_driver_library is not set, are you sure you included " +
43
+ "the proper driver client libraries in your classpath?"
44
+ end
45
+ raise LogStash::PluginLoadingError, "#{e.inspect}. #{message}"
46
+ end
47
+ ensure
48
+ DRIVERS_LOADING_LOCK.unlock()
37
49
  end
38
50
  end
39
51
 
@@ -62,5 +74,16 @@ module LogStash module PluginMixins module Jdbc
62
74
  !@jdbc_driver_library.nil? && !@jdbc_driver_library.empty?
63
75
  end
64
76
 
77
+ def load_jdbc_driver_class
78
+ # sub a potential: 'Java::org::my.Driver' to 'org.my.Driver'
79
+ klass = @jdbc_driver_class.gsub('::', '.').sub(/^Java\./, '')
80
+ # NOTE: JRuby's Java::JavaClass.for_name which considers the custom class-loader(s)
81
+ # in 9.3 the API changed and thus to avoid surprises we go down to the Java API :
82
+ klass = JRuby.runtime.getJavaSupport.loadJavaClass(klass) # throws ClassNotFoundException
83
+ # unfortunately we can not simply return the wrapped java.lang.Class instance as
84
+ # Sequel assumes to be able to do a `driver_class.new` which only works on the proxy,
85
+ org.jruby.javasupport.Java.getProxyClass(JRuby.runtime, klass)
86
+ end
87
+
65
88
  end
66
89
  end end end
@@ -168,8 +168,6 @@ module LogStash module PluginMixins module Jdbc
168
168
  @logger.warn("Failed test_connection with java.sql.SQLException.", :exception => e)
169
169
  rescue Sequel::DatabaseConnectionError => e
170
170
  @logger.warn("Failed test_connection.", :exception => e)
171
- close_jdbc_connection
172
-
173
171
  #TODO return false and let the plugin raise a LogStash::ConfigurationError
174
172
  raise e
175
173
  end
@@ -208,9 +206,9 @@ module LogStash module PluginMixins module Jdbc
208
206
  public
209
207
  def execute_statement
210
208
  success = false
211
- @connection_lock.lock
212
- open_jdbc_connection
213
209
  begin
210
+ @connection_lock.lock
211
+ open_jdbc_connection
214
212
  sql_last_value = @use_column_value ? @value_tracker.value : Time.now.utc
215
213
  @tracking_column_warning_sent = false
216
214
  @statement_handler.perform_query(@database, @value_tracker.value, @jdbc_paging_enabled, @jdbc_page_size) do |row|
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-integration-jdbc'
3
- s.version = '5.1.5'
3
+ s.version = '5.1.10'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Integration with JDBC - input and filter plugins"
6
6
  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"
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
41
41
  s.add_runtime_dependency "logstash-mixin-event_support", '~> 1.0'
42
42
 
43
43
  s.add_development_dependency "childprocess"
44
- s.add_development_dependency 'logstash-devutils'
44
+ s.add_development_dependency 'logstash-devutils', '>= 2.3'
45
45
  s.add_development_dependency 'timecop'
46
46
  s.add_development_dependency 'jdbc-derby'
47
47
  end
@@ -66,13 +66,13 @@ describe LogStash::Inputs::Jdbc, :integration => true do
66
66
  )
67
67
  end
68
68
 
69
- it "should not register correctly" do
69
+ it "log warning msg when plugin run" do
70
70
  plugin.register
71
- allow( plugin ).to receive(:log_java_exception)
71
+ expect( plugin ).to receive(:log_java_exception)
72
+ expect(plugin.logger).to receive(:warn).once.with("Exception when executing JDBC query",
73
+ hash_including(:exception => instance_of(String)))
72
74
  q = Queue.new
73
- expect do
74
- plugin.run(q)
75
- end.to raise_error(::Sequel::DatabaseConnectionError)
75
+ expect{ plugin.run(q) }.not_to raise_error
76
76
  end
77
77
 
78
78
  it "should log (native) Java driver error" do
@@ -85,9 +85,7 @@ describe LogStash::Inputs::Jdbc, :integration => true do
85
85
  logger
86
86
  end
87
87
  q = Queue.new
88
- expect do
89
- plugin.run(q)
90
- end.to raise_error(::Sequel::DatabaseConnectionError)
88
+ expect{ plugin.run(q) }.not_to raise_error
91
89
  end
92
90
  end
93
91
  end
@@ -14,10 +14,11 @@ require "date"
14
14
 
15
15
  describe LogStash::Inputs::Jdbc do
16
16
  let(:connection_string) { "jdbc:derby:memory:testdb;create=true" }
17
+ let(:jdbc_driver_class) { "org.apache.derby.jdbc.EmbeddedDriver" }
17
18
  let(:mixin_settings) do
18
19
  {
19
20
  "jdbc_user" => ENV['USER'],
20
- "jdbc_driver_class" => "org.apache.derby.jdbc.EmbeddedDriver",
21
+ "jdbc_driver_class" => jdbc_driver_class,
21
22
  "jdbc_connection_string" => connection_string
22
23
  }
23
24
  end
@@ -1392,10 +1393,8 @@ describe LogStash::Inputs::Jdbc do
1392
1393
  event = queue.pop
1393
1394
  expect(event.get("num")).to eq(1)
1394
1395
  expect(event.get("string")).to eq("A test")
1395
- expect(event.get("started_at")).to be_a(LogStash::Timestamp)
1396
- expect(event.get("started_at").to_s).to eq("1999-12-31T00:00:00.000Z")
1397
- expect(event.get("custom_time")).to be_a(LogStash::Timestamp)
1398
- expect(event.get("custom_time").to_s).to eq("1999-12-31T23:59:59.000Z")
1396
+ expect(event.get("started_at")).to be_a_logstash_timestamp_equivalent_to("1999-12-31T00:00:00.000Z")
1397
+ expect(event.get("custom_time")).to be_a_logstash_timestamp_equivalent_to("1999-12-31T23:59:59.000Z")
1399
1398
  expect(event.get("ranking").to_f).to eq(95.67)
1400
1399
  end
1401
1400
  end
@@ -1441,10 +1440,8 @@ describe LogStash::Inputs::Jdbc do
1441
1440
  event = queue.pop
1442
1441
  expect(event.get("num")).to eq(1)
1443
1442
  expect(event.get("string")).to eq("A test")
1444
- expect(event.get("started_at")).to be_a(LogStash::Timestamp)
1445
- expect(event.get("started_at").to_s).to eq("1999-12-31T00:00:00.000Z")
1446
- expect(event.get("custom_time")).to be_a(LogStash::Timestamp)
1447
- expect(event.get("custom_time").to_s).to eq("1999-12-31T23:59:59.000Z")
1443
+ expect(event.get("started_at")).to be_a_logstash_timestamp_equivalent_to("1999-12-31T00:00:00.000Z")
1444
+ expect(event.get("custom_time")).to be_a_logstash_timestamp_equivalent_to("1999-12-31T23:59:59.000Z")
1448
1445
  expect(event.get("ranking").to_f).to eq(95.67)
1449
1446
  end
1450
1447
  end
@@ -1619,4 +1616,40 @@ describe LogStash::Inputs::Jdbc do
1619
1616
  end
1620
1617
  end
1621
1618
  end
1619
+
1620
+ describe "jdbc_driver_class" do
1621
+ context "when not prefixed with Java::" do
1622
+ let(:jdbc_driver_class) { "org.apache.derby.jdbc.EmbeddedDriver" }
1623
+ it "loads the class" do
1624
+ expect { plugin.send(:load_driver) }.not_to raise_error
1625
+ end
1626
+ end
1627
+ context "when prefixed with Java::" do
1628
+ let(:jdbc_driver_class) { "Java::org.apache.derby.jdbc.EmbeddedDriver" }
1629
+ it "loads the class" do
1630
+ expect { plugin.send(:load_driver) }.not_to raise_error
1631
+ end
1632
+ end
1633
+ context "when prefixed with Java." do
1634
+ let(:jdbc_driver_class) { "Java.org::apache::derby::jdbc.EmbeddedDriver" }
1635
+ it "loads the class" do
1636
+ expect { plugin.send(:load_driver) }.not_to raise_error
1637
+ end
1638
+
1639
+ it "can instantiate the returned driver class" do
1640
+ # for drivers where the path through DriverManager fails, Sequel assumes
1641
+ # having a proxied Java class instance (instead of a java.lang.Class) and
1642
+ # does a driver.new.connect https://git.io/JDV6M
1643
+ driver = plugin.send(:load_driver)
1644
+ expect { driver.new }.not_to raise_error
1645
+ end
1646
+ end
1647
+ context "when class name invalid" do
1648
+ let(:jdbc_driver_class) { "org.apache.NonExistentDriver" }
1649
+ it "raises a loading error" do
1650
+ expect { plugin.send(:load_driver) }.to raise_error LogStash::PluginLoadingError,
1651
+ /java.lang.ClassNotFoundException: org.apache.NonExistentDriver/
1652
+ end
1653
+ end
1654
+ end
1622
1655
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-integration-jdbc
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.5
4
+ version: 5.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-04 00:00:00.000000000 Z
11
+ date: 2021-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -203,7 +203,7 @@ dependencies:
203
203
  requirements:
204
204
  - - ">="
205
205
  - !ruby/object:Gem::Version
206
- version: '0'
206
+ version: '2.3'
207
207
  name: logstash-devutils
208
208
  prerelease: false
209
209
  type: :development
@@ -211,7 +211,7 @@ dependencies:
211
211
  requirements:
212
212
  - - ">="
213
213
  - !ruby/object:Gem::Version
214
- version: '0'
214
+ version: '2.3'
215
215
  - !ruby/object:Gem::Dependency
216
216
  requirement: !ruby/object:Gem::Requirement
217
217
  requirements:
@@ -252,7 +252,6 @@ files:
252
252
  - CONTRIBUTORS
253
253
  - Gemfile
254
254
  - LICENSE
255
- - NOTICE.TXT
256
255
  - README.md
257
256
  - docs/filter-jdbc_static.asciidoc
258
257
  - docs/filter-jdbc_streaming.asciidoc
data/NOTICE.TXT DELETED
@@ -1,5 +0,0 @@
1
- Elasticsearch
2
- Copyright 2012-2018 Elasticsearch
3
-
4
- This product includes software developed by The Apache Software
5
- Foundation (http://www.apache.org/).