logstash-integration-jdbc 5.1.5 → 5.1.10

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: 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/).