Skip to content

SecondaryFileOutput has race condition issues in multiple threads or workers #4080

Closed
@daipom

Description

@daipom

Describe the bug

SecondaryFileOutput sometimes appends logs even when append false in multiple threads or workers

Since SecondaryFileOutput does not use any lock, race condition can occur.

Especially, this logic causes race condition issues in multiple threads or workers when append false.

def generate_path(path_without_suffix)
if @append
"#{path_without_suffix}#{@suffix}"
else
i = 0
loop do
path = "#{path_without_suffix}.#{i}#{@suffix}"
return path unless File.exist?(path)
i += 1
end
end
end

To Reproduce

Run the fluentd with the following config for about 1 minute.

Somehow make out_file plugin's output error.
I fixed the code for debugging.

--- a/lib/fluent/plugin/out_file.rb
+++ b/lib/fluent/plugin/out_file.rb
@@ -200,6 +200,7 @@ module Fluent::Plugin
     end
 
     def write(chunk)
+      raise IOError, "for debug"
       path = extract_placeholders(@path_template, chunk)
       FileUtils.mkdir_p File.dirname(path), mode: @dir_perm
bundle exec fluentd -c fluent.conf

Then we can find some files where logs with different tags are mixed in the same file although the chunk-key was tag and append was false.

2023-03-03T19:53:28+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:29+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:30+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:31+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:32+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:33+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:34+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:35+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:36+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:37+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:38+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:28+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:29+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:30+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:31+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:32+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:33+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:34+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:35+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:36+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:37+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:38+09:00	aaa.fuga.bbb	{"message":"fuga"}

Expected behavior

Each chunk is separated into a file.

File-A

2023-03-03T19:53:28+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:29+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:30+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:31+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:32+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:33+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:34+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:35+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:36+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:37+09:00	aaa.hoge.bbb	{"message":"hoge"}
2023-03-03T19:53:38+09:00	aaa.hoge.bbb	{"message":"hoge"}

File-B

2023-03-03T19:53:28+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:29+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:30+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:31+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:32+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:33+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:34+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:35+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:36+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:37+09:00	aaa.fuga.bbb	{"message":"fuga"}
2023-03-03T19:53:38+09:00	aaa.fuga.bbb	{"message":"fuga"}

Your Environment

- Fluentd version: fluentd 1.15.3
- Operating system: Ubuntu 20.04.5 LTS (Focal Fossa)
- Kernel version: 5.15.0-60-generic

Your Configuration

<system>
  workers 4
</system>

<source>
  @type sample
  tag aaa.hoge.bbb
  sample {"message": "hoge"}
</source>

<source>
  @type sample
  tag aaa.fuga.bbb
  sample {"message": "fuga"}
</source>

<source>
  @type sample
  tag aaa.foo.bbb
  sample {"message": "foo"}
</source>

<match aaa.**>
  @type file
  path /test/fluentd/log/${tag}/fluentd.log
  append true
  <buffer tag>
    @type file
    path /test/fluentd/buffer
    flush_mode interval
    flush_interval 10s
    retry_max_times 1
  </buffer>
  <secondary>
    @type secondary_file
    directory /test/fluentd/error/
    append false
  </secondary>
</match>

Your Error Log

Error logs are not related to this issue.

Additional context

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions