Skip to content

Commit 8afdc66

Browse files
committed
fix: use readpartial instead of read to avoid IO blocking
Signed-off-by: Shizuo Fujita <fujita@clear-code.com>
1 parent 7868fa6 commit 8afdc66

2 files changed

Lines changed: 17 additions & 11 deletions

File tree

lib/fluent/compat/exec_util.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,18 @@ def each_line(line)
7676
end
7777

7878
class JSONParser < Parser
79+
BYTES_TO_READ = 8192
80+
7981
def call(io)
8082
parser = JSON::ResumableParser.new({})
81-
buffer_size = 8192
82-
83-
while (chunk = io.read(buffer_size))
84-
parser << chunk
85-
while parser.parse
86-
@on_message.call(parser.value)
83+
begin
84+
while (chunk = io.readpartial(BYTES_TO_READ))
85+
parser << chunk
86+
while parser.parse
87+
@on_message.call(parser.value)
88+
end
8789
end
90+
rescue EOFError
8891
end
8992
end
9093
end

lib/fluent/plugin/parser_json.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,16 @@ def parser_type
9292

9393
def parse_io(io, &block)
9494
parser = JSON::ResumableParser.new({})
95-
while (chunk = io.read(@stream_buffer_size))
96-
parser << chunk
95+
begin
96+
while (chunk = io.readpartial(@stream_buffer_size))
97+
parser << chunk
9798

98-
while parser.parse
99-
record = parser.value
100-
block.call(parse_time(record), record)
99+
while parser.parse
100+
record = parser.value
101+
block.call(parse_time(record), record)
102+
end
101103
end
104+
rescue EOFError
102105
end
103106
end
104107
end

0 commit comments

Comments
 (0)