Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix a bug that BufferChunkOverflowError cause a whole data loss
In the previous version, if BufferChunkOverflowError occurs, whole data is not sent because of raised exception. For example, incoming partial data exceeds chunk_limit_size, "message a" and "message b" is lost. message a\n longer.....message data exceeds chunk_limit_size\n message b\n It is not appropriate because the problem exists only a partial split data. In this commit, when BufferChunkOverflowError is detected in write_step_by_step, collect errors and propagate it to write method scope. By this way, a valid partial split is processed and not lost. Here is the micro benchmark result: It seems that it has no performance drawbacks. Compare Before: Calculating and After: Calculating section. Each with BufferChunkOverflowError, and without BufferChunkOverflowError micro benchmark, almost same. Before: Warming up -------------------------------------- no BufferChunkOverflowError 11.488k i/100ms raise BufferChunkOverflowError in every 100 calls 4.110k i/100ms Calculating ------------------------------------- no BufferChunkOverflowError 113.353k (± 1.0%) i/s - 1.137M in 10.034300s raise BufferChunkOverflowError in every 100 calls 40.599k (± 3.5%) i/s - 406.890k in 10.034076s Comparison: no BufferChunkOverflowError: 113353.4 i/s raise BufferChunkOverflowError in every 100 calls: 40599.5 i/s - 2.79x (± 0.00) slower After: Warming up -------------------------------------- no BufferChunkOverflowError 11.399k i/100ms raise BufferChunkOverflowError in every 100 calls 4.301k i/100ms Calculating ------------------------------------- no BufferChunkOverflowError 113.855k (± 1.1%) i/s - 1.140M in 10.013090s raise BufferChunkOverflowError in every 100 calls 43.683k (± 4.0%) i/s - 438.702k in 10.059251s Comparison: no BufferChunkOverflowError: 113854.6 i/s raise BufferChunkOverflowError in every 100 calls: 43683.3 i/s - 2.61x (± 0.00) slower Here is the micro benchmark test case: test '#write BufferChunkOverflowError micro benchmark' do require 'benchmark/ips' es = Fluent::ArrayEventStream.new([ [event_time('2016-04-11 16:00:02 +0000'), {"message" => "x"}] ]) large = Fluent::ArrayEventStream.new([ [event_time('2016-04-11 16:00:02 +0000'), {"message" => "x" * 1_280_000}] ]) Benchmark.ips do |x| x.config(:time => 10, :warmup => 2) x.report("no BufferChunkOverflowError") do @p.write({@dm0 => es}, format: @Format) end x.report("raise BufferChunkOverflowError in every 100 calls") do |n| n.times do |i| if i % 100 == 0 assert_raise Fluent::Plugin::Buffer::BufferChunkOverflowError do @p.write({@dm0 => large}, format: @Format) end else @p.write({@dm0 => es}, format: @Format) end end end x.compare! end end Signed-off-by: Kentaro Hayashi <hayashi@clear-code.com>
- Loading branch information