logstash-plugins / logstash-output-file

Apache License 2.0
23 stars 53 forks source link

NoMethodError: undefined method `truncate' for #<IOWriter:0x3e9b038 @io=#<Zlib::GzipWriter:0x164b00d> #66

Open ycombinator opened 6 years ago

ycombinator commented 6 years ago

Originally reported in https://discuss.elastic.co/t/error-nomethoderror-undefined-method-truncate-for-iowriter-0x3e9b038-io-zlib-gzipwriter-0x164b00d/132392:

I'm using docker.elastic.co/logstash/logstash:6.2.4 and while running bellow pipeline configuration, I get the following:

output {
    file {
        path => "/tmp/data.json.gz"
        write_behavior => overwrite
        gzip => true
    }
}

following is last message that logstash produced:

[2018-05-17T20:00:03,025][INFO ][logstash.outputs.file ] Opening file {:path=>"/tmp/data.json.gz"}

pipeline never terminates and even though ./tmp/data.json.gz is not zero bytes (file has some data in it), output file comes out corrupted:

# gzip --test data.json.gz 

gzip: data.json.gz: unexpected end of file
# 
Please advise.

LOG_LEVEL=debug:

[2018-05-17T18:00:03,045][FATAL][logstash.runner ] An unexpected error occurred! {:error=>#<NoMethodError: undefined method `truncate' for #<IOWriter:0x3e9b038 @io=#Zlib::GzipWriter:0x164b00d>

logstash:

Did you mean? trust>, :backtrace=>["org/jruby/RubyBasicObject.java:1657:inmethod_missing'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-file-4.2.3/lib/logstash/outputs/file.rb:320:in method_missing'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-file-4.2.3/lib/logstash/outputs/file.rb:137:inblock in multi_receive_encoded'", "org/jruby/RubyHash.java:1343:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-file-4.2.3/lib/logstash/outputs/file.rb:134:inblock in multi_receive_encoded'", "org/jruby/ext/thread/Mutex.java:148:in synchronize'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-output-file-4.2.3/lib/logstash/outputs/file.rb:133:inmulti_receive_encoded'", "/usr/share/logstash/logstash-core/lib/logstash/outputs/base.rb:90:in multi_receive'", "/usr/share/logstash/logstash-core/lib/logstash/output_delegator_strategies/shared.rb:13:inmulti_receive'", "/usr/share/logstash/logstash-core/lib/logstash/output_delegator.rb:49:in multi_receive'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:477:inblock in output_batch'", "org/jruby/RubyHash.java:1343:in each'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:476:inoutput_batch'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:428:in worker_loop'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:386:inblock in start_workers'"]}`

&

[2018-05-18T04:15:31,354][ERROR][org.logstash.Logstash ] java.lang.IllegalStateException: org.jruby.exceptions.RaiseException: (SystemExit) exit

this behavior can be reproduced by changing write_behavior from default append to overwrite.

a1exus commented 6 years ago

@ycombinator thanks for filing report on my behalf, I appreciate it)

colinsurprenant commented 5 years ago

yeah - looking at the code, clearly write_behavior => overwrite is incompatible with gzip. we should either no permit this combination or fix the truncate logic to make it work correctly with gzip.