fluent-plugin-s3 1.1.2 → 1.1.3

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
  SHA1:
3
- metadata.gz: 29ae6edc5711fd7c6409cdcf3f592db33f50cf2c
4
- data.tar.gz: 00b0445936e92e75346e4e9fd2f3b1943031349c
3
+ metadata.gz: 16e7bfdfa2c8a9ac640bc5aab2f4f340ff764874
4
+ data.tar.gz: a4711544ff30e4312474b85a730aa00fb8cd3c1b
5
5
  SHA512:
6
- metadata.gz: 9c4d1b1d4d344cc1360db807f46512a39a203843b0a5735086814bea80b0a3940c2f50ac98f15f1c30016537d0c53e6d5589211b310b3fe1a6d9bff498445bff
7
- data.tar.gz: a4f94d231b9c0d9aef6eaee2f03aa7a75f95a88dced554731bd0b5cfabf5229063220d601317eb9d12cc18c9541a12a4b50cce53e4d902205b93d0b9ebe26e88
6
+ metadata.gz: d084d89f1fc8ba64405c417e2f71d5a2316d47de454be606d28b54ad9a52d567e09e401a5f1bf72268c638d37e5b17812e4c3d85be6221081c6921fe2160adc1
7
+ data.tar.gz: fdd479ee6b6bbae6a0d4bd2e25817d70b6f82fe2d8ab87ca835b4b803cd86f7b3432266bdd4ed099edcda8501d11d790818ed4336740f79126cc87d621c4031a
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ Release 1.1.3 - 2018/04/15
2
+
3
+ * in_s3: Fixed extracting gzip's multiple stream.
4
+
1
5
  Release 1.1.2 - 2018/04/10
2
6
 
3
7
  * out_s3: Fix memory leak when s3_object_key_format has time related placeholder
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.2
1
+ 1.1.3
@@ -284,10 +284,23 @@ module Fluent::Plugin
284
284
  'application/x-gzip'.freeze
285
285
  end
286
286
 
287
+ # https://bugs.ruby-lang.org/issues/9790
288
+ # https://bugs.ruby-lang.org/issues/11180
289
+ # https://github.com/exAspArk/multiple_files_gzip_reader
287
290
  def extract(io)
288
- Zlib::GzipReader.wrap(io) do |gz|
289
- gz.read
291
+ parts = []
292
+ loop do
293
+ unused = nil
294
+ Zlib::GzipReader.wrap(io) do |gz|
295
+ parts << gz.read
296
+ unused = gz.unused
297
+ gz.finish
298
+ end
299
+ io.pos -= unused ? unused.length : 0
300
+ break if io.eof?
290
301
  end
302
+ io.close
303
+ parts.join
291
304
  end
292
305
  end
293
306
 
@@ -89,6 +89,7 @@ class S3InputTest < Test::Unit::TestCase
89
89
 
90
90
  data("json" => ["json", "json", "application/json"],
91
91
  "text" => ["text", "txt", "text/plain"],
92
+ "gzip" => ["gzip", "gz", "application/x-gzip"],
92
93
  "gzip_command" => ["gzip_command", "gz", "application/x-gzip"],
93
94
  "lzo" => ["lzo", "lzo", "application/x-lzop"],
94
95
  "lzma2" => ["lzma2", "xz", "application/x-xz"])
@@ -262,4 +263,104 @@ class S3InputTest < Test::Unit::TestCase
262
263
  ]
263
264
  assert_equal(expected_records, events.map {|_tag, _time, record| record })
264
265
  end
266
+
267
+ def test_gzip_single_stream
268
+ setup_mocks
269
+ d = create_driver(CONFIG + "\ncheck_apikey_on_start false\nstore_as gzip\nformat none\n")
270
+
271
+ s3_object = stub(Object.new)
272
+ s3_response = stub(Object.new)
273
+ s3_response.body {
274
+ io = StringIO.new
275
+ Zlib::GzipWriter.wrap(io) do |gz|
276
+ gz.write "aaa\nbbb\n"
277
+ gz.finish
278
+ end
279
+ io.rewind
280
+ io
281
+ }
282
+ s3_object.get { s3_response }
283
+ @s3_bucket.object(anything).at_least(1) { s3_object }
284
+
285
+ body = {
286
+ "Records" => [
287
+ {
288
+ "s3" => {
289
+ "object" => {
290
+ "key" => "test_key"
291
+ }
292
+ }
293
+ }
294
+ ]
295
+ }
296
+ message = Struct::StubMessage.new(1, 1, Yajl.dump(body))
297
+ @sqs_poller.get_messages(anything, anything) do |config, stats|
298
+ config.before_request.call(stats) if config.before_request
299
+ stats.request_count += 1
300
+ if stats.request_count >= 1
301
+ d.instance.instance_variable_set(:@running, false)
302
+ end
303
+ [message]
304
+ end
305
+ d.run(expect_emits: 1)
306
+ events = d.events
307
+ expected_records = [
308
+ { "message" => "aaa\n" },
309
+ { "message" => "bbb\n" }
310
+ ]
311
+ assert_equal(expected_records, events.map {|_tag, _time, record| record })
312
+ end
313
+
314
+ def test_gzip_multiple_steams
315
+ setup_mocks
316
+ d = create_driver(CONFIG + "\ncheck_apikey_on_start false\nstore_as gzip\nformat none\n")
317
+
318
+ s3_object = stub(Object.new)
319
+ s3_response = stub(Object.new)
320
+ s3_response.body {
321
+ io = StringIO.new
322
+ Zlib::GzipWriter.wrap(io) do |gz|
323
+ gz.write "aaa\nbbb\n"
324
+ gz.finish
325
+ end
326
+ Zlib::GzipWriter.wrap(io) do |gz|
327
+ gz.write "ccc\nddd\n"
328
+ gz.finish
329
+ end
330
+ io.rewind
331
+ io
332
+ }
333
+ s3_object.get { s3_response }
334
+ @s3_bucket.object(anything).at_least(1) { s3_object }
335
+
336
+ body = {
337
+ "Records" => [
338
+ {
339
+ "s3" => {
340
+ "object" => {
341
+ "key" => "test_key"
342
+ }
343
+ }
344
+ }
345
+ ]
346
+ }
347
+ message = Struct::StubMessage.new(1, 1, Yajl.dump(body))
348
+ @sqs_poller.get_messages(anything, anything) do |config, stats|
349
+ config.before_request.call(stats) if config.before_request
350
+ stats.request_count += 1
351
+ if stats.request_count >= 1
352
+ d.instance.instance_variable_set(:@running, false)
353
+ end
354
+ [message]
355
+ end
356
+ d.run(expect_emits: 1)
357
+ events = d.events
358
+ expected_records = [
359
+ { "message" => "aaa\n" },
360
+ { "message" => "bbb\n" },
361
+ { "message" => "ccc\n" },
362
+ { "message" => "ddd\n" }
363
+ ]
364
+ assert_equal(expected_records, events.map {|_tag, _time, record| record })
365
+ end
265
366
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-04-10 00:00:00.000000000 Z
12
+ date: 2018-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -163,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  version: '0'
164
164
  requirements: []
165
165
  rubyforge_project:
166
- rubygems_version: 2.6.13
166
+ rubygems_version: 2.6.14.1
167
167
  signing_key:
168
168
  specification_version: 4
169
169
  summary: Amazon S3 output plugin for Fluentd event collector