fluentd 1.20.0-aarch64-mingw-ucrt

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +116 -0
  3. data/ADOPTERS.md +5 -0
  4. data/AGENTS.md +46 -0
  5. data/AUTHORS +2 -0
  6. data/CHANGELOG.md +3324 -0
  7. data/CONTRIBUTING.md +45 -0
  8. data/GOVERNANCE.md +55 -0
  9. data/GithubWorkflow.md +78 -0
  10. data/LICENSE +202 -0
  11. data/MAINTAINERS.md +19 -0
  12. data/README.md +73 -0
  13. data/Rakefile +89 -0
  14. data/SECURITY.md +47 -0
  15. data/bin/fluent-binlog-reader +7 -0
  16. data/bin/fluent-ca-generate +6 -0
  17. data/bin/fluent-cap-ctl +7 -0
  18. data/bin/fluent-cat +5 -0
  19. data/bin/fluent-ctl +7 -0
  20. data/bin/fluent-debug +5 -0
  21. data/bin/fluent-gem +9 -0
  22. data/bin/fluent-plugin-config-format +5 -0
  23. data/bin/fluent-plugin-generate +5 -0
  24. data/bin/fluentd +15 -0
  25. data/code-of-conduct.md +3 -0
  26. data/docs/SECURITY_AUDIT.pdf +0 -0
  27. data/example/copy_roundrobin.conf +39 -0
  28. data/example/counter.conf +18 -0
  29. data/example/filter_stdout.conf +22 -0
  30. data/example/in_forward.conf +14 -0
  31. data/example/in_forward_client.conf +37 -0
  32. data/example/in_forward_shared_key.conf +15 -0
  33. data/example/in_forward_tls.conf +14 -0
  34. data/example/in_forward_users.conf +24 -0
  35. data/example/in_forward_workers.conf +21 -0
  36. data/example/in_http.conf +16 -0
  37. data/example/in_out_forward.conf +17 -0
  38. data/example/in_sample_blocks.conf +17 -0
  39. data/example/in_sample_with_compression.conf +23 -0
  40. data/example/in_syslog.conf +15 -0
  41. data/example/in_tail.conf +14 -0
  42. data/example/in_tcp.conf +13 -0
  43. data/example/in_udp.conf +13 -0
  44. data/example/logevents.conf +25 -0
  45. data/example/multi_filters.conf +61 -0
  46. data/example/out_copy.conf +20 -0
  47. data/example/out_exec_filter.conf +42 -0
  48. data/example/out_file.conf +13 -0
  49. data/example/out_forward.conf +35 -0
  50. data/example/out_forward_buf_file.conf +23 -0
  51. data/example/out_forward_client.conf +109 -0
  52. data/example/out_forward_heartbeat_none.conf +16 -0
  53. data/example/out_forward_sd.conf +17 -0
  54. data/example/out_forward_shared_key.conf +36 -0
  55. data/example/out_forward_tls.conf +18 -0
  56. data/example/out_forward_users.conf +65 -0
  57. data/example/out_null.conf +36 -0
  58. data/example/sd.yaml +8 -0
  59. data/example/secondary_file.conf +42 -0
  60. data/example/suppress_config_dump.conf +7 -0
  61. data/example/v0_12_filter.conf +78 -0
  62. data/example/v1_literal_example.conf +36 -0
  63. data/example/worker_section.conf +36 -0
  64. data/fluent.conf +139 -0
  65. data/lib/fluent/agent.rb +168 -0
  66. data/lib/fluent/capability.rb +87 -0
  67. data/lib/fluent/clock.rb +66 -0
  68. data/lib/fluent/command/binlog_reader.rb +244 -0
  69. data/lib/fluent/command/bundler_injection.rb +45 -0
  70. data/lib/fluent/command/ca_generate.rb +184 -0
  71. data/lib/fluent/command/cap_ctl.rb +174 -0
  72. data/lib/fluent/command/cat.rb +365 -0
  73. data/lib/fluent/command/ctl.rb +180 -0
  74. data/lib/fluent/command/debug.rb +103 -0
  75. data/lib/fluent/command/fluentd.rb +385 -0
  76. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  77. data/lib/fluent/command/plugin_generator.rb +365 -0
  78. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  79. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  80. data/lib/fluent/compat/exec_util.rb +144 -0
  81. data/lib/fluent/compat/file_util.rb +54 -0
  82. data/lib/fluent/compat/filter.rb +68 -0
  83. data/lib/fluent/compat/formatter.rb +117 -0
  84. data/lib/fluent/compat/formatter_utils.rb +85 -0
  85. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  86. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  87. data/lib/fluent/compat/input.rb +49 -0
  88. data/lib/fluent/compat/output.rb +721 -0
  89. data/lib/fluent/compat/output_chain.rb +60 -0
  90. data/lib/fluent/compat/parser.rb +310 -0
  91. data/lib/fluent/compat/parser_utils.rb +40 -0
  92. data/lib/fluent/compat/propagate_default.rb +62 -0
  93. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  94. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  95. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  96. data/lib/fluent/compat/socket_util.rb +165 -0
  97. data/lib/fluent/compat/string_util.rb +34 -0
  98. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  99. data/lib/fluent/compat/type_converter.rb +90 -0
  100. data/lib/fluent/config/basic_parser.rb +122 -0
  101. data/lib/fluent/config/configure_proxy.rb +424 -0
  102. data/lib/fluent/config/dsl.rb +152 -0
  103. data/lib/fluent/config/element.rb +265 -0
  104. data/lib/fluent/config/error.rb +44 -0
  105. data/lib/fluent/config/literal_parser.rb +305 -0
  106. data/lib/fluent/config/parser.rb +119 -0
  107. data/lib/fluent/config/section.rb +272 -0
  108. data/lib/fluent/config/types.rb +257 -0
  109. data/lib/fluent/config/v1_parser.rb +200 -0
  110. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  111. data/lib/fluent/config/yaml_parser/loader.rb +124 -0
  112. data/lib/fluent/config/yaml_parser/parser.rb +179 -0
  113. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  114. data/lib/fluent/config/yaml_parser.rb +56 -0
  115. data/lib/fluent/config.rb +89 -0
  116. data/lib/fluent/configurable.rb +202 -0
  117. data/lib/fluent/counter/base_socket.rb +44 -0
  118. data/lib/fluent/counter/client.rb +297 -0
  119. data/lib/fluent/counter/error.rb +86 -0
  120. data/lib/fluent/counter/mutex_hash.rb +163 -0
  121. data/lib/fluent/counter/server.rb +273 -0
  122. data/lib/fluent/counter/store.rb +205 -0
  123. data/lib/fluent/counter/validator.rb +145 -0
  124. data/lib/fluent/counter.rb +23 -0
  125. data/lib/fluent/daemon.rb +14 -0
  126. data/lib/fluent/daemonizer.rb +88 -0
  127. data/lib/fluent/engine.rb +269 -0
  128. data/lib/fluent/env.rb +45 -0
  129. data/lib/fluent/error.rb +37 -0
  130. data/lib/fluent/event.rb +369 -0
  131. data/lib/fluent/event_router.rb +315 -0
  132. data/lib/fluent/ext_monitor_require.rb +28 -0
  133. data/lib/fluent/file_wrapper.rb +137 -0
  134. data/lib/fluent/filter.rb +21 -0
  135. data/lib/fluent/fluent_log_event_router.rb +139 -0
  136. data/lib/fluent/formatter.rb +23 -0
  137. data/lib/fluent/input.rb +21 -0
  138. data/lib/fluent/label.rb +46 -0
  139. data/lib/fluent/load.rb +33 -0
  140. data/lib/fluent/log/console_adapter.rb +66 -0
  141. data/lib/fluent/log.rb +775 -0
  142. data/lib/fluent/match.rb +187 -0
  143. data/lib/fluent/mixin.rb +31 -0
  144. data/lib/fluent/msgpack_factory.rb +111 -0
  145. data/lib/fluent/oj_options.rb +61 -0
  146. data/lib/fluent/output.rb +29 -0
  147. data/lib/fluent/output_chain.rb +23 -0
  148. data/lib/fluent/parser.rb +23 -0
  149. data/lib/fluent/plugin/bare_output.rb +88 -0
  150. data/lib/fluent/plugin/base.rb +219 -0
  151. data/lib/fluent/plugin/buf_file.rb +256 -0
  152. data/lib/fluent/plugin/buf_file_single.rb +272 -0
  153. data/lib/fluent/plugin/buf_memory.rb +34 -0
  154. data/lib/fluent/plugin/buffer/chunk.rb +313 -0
  155. data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
  156. data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
  157. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  158. data/lib/fluent/plugin/buffer.rb +1063 -0
  159. data/lib/fluent/plugin/compressable.rb +87 -0
  160. data/lib/fluent/plugin/exec_util.rb +22 -0
  161. data/lib/fluent/plugin/extractor.rb +132 -0
  162. data/lib/fluent/plugin/file_util.rb +22 -0
  163. data/lib/fluent/plugin/filter.rb +119 -0
  164. data/lib/fluent/plugin/filter_grep.rb +189 -0
  165. data/lib/fluent/plugin/filter_parser.rb +124 -0
  166. data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
  167. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  168. data/lib/fluent/plugin/formatter.rb +75 -0
  169. data/lib/fluent/plugin/formatter_csv.rb +92 -0
  170. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  171. data/lib/fluent/plugin/formatter_json.rb +62 -0
  172. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  173. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  174. data/lib/fluent/plugin/formatter_out_file.rb +55 -0
  175. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  176. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  177. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  178. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  179. data/lib/fluent/plugin/in_dummy.rb +18 -0
  180. data/lib/fluent/plugin/in_exec.rb +124 -0
  181. data/lib/fluent/plugin/in_forward.rb +489 -0
  182. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  183. data/lib/fluent/plugin/in_http.rb +737 -0
  184. data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
  185. data/lib/fluent/plugin/in_object_space.rb +93 -0
  186. data/lib/fluent/plugin/in_sample.rb +148 -0
  187. data/lib/fluent/plugin/in_syslog.rb +346 -0
  188. data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
  189. data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
  190. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  191. data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
  192. data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
  193. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  194. data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
  195. data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
  196. data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
  197. data/lib/fluent/plugin/in_tail.rb +917 -0
  198. data/lib/fluent/plugin/in_tcp.rb +230 -0
  199. data/lib/fluent/plugin/in_udp.rb +101 -0
  200. data/lib/fluent/plugin/in_unix.rb +197 -0
  201. data/lib/fluent/plugin/input.rb +71 -0
  202. data/lib/fluent/plugin/metrics.rb +119 -0
  203. data/lib/fluent/plugin/metrics_local.rb +96 -0
  204. data/lib/fluent/plugin/multi_output.rb +179 -0
  205. data/lib/fluent/plugin/out_buffer.rb +40 -0
  206. data/lib/fluent/plugin/out_copy.rb +120 -0
  207. data/lib/fluent/plugin/out_exec.rb +105 -0
  208. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  209. data/lib/fluent/plugin/out_file.rb +371 -0
  210. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  211. data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
  212. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  213. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  214. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  215. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  216. data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
  217. data/lib/fluent/plugin/out_forward.rb +865 -0
  218. data/lib/fluent/plugin/out_http.rb +419 -0
  219. data/lib/fluent/plugin/out_null.rb +74 -0
  220. data/lib/fluent/plugin/out_relabel.rb +32 -0
  221. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  222. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  223. data/lib/fluent/plugin/out_stdout.rb +81 -0
  224. data/lib/fluent/plugin/out_stream.rb +130 -0
  225. data/lib/fluent/plugin/output.rb +1688 -0
  226. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  227. data/lib/fluent/plugin/parser.rb +274 -0
  228. data/lib/fluent/plugin/parser_apache.rb +28 -0
  229. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  230. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  231. data/lib/fluent/plugin/parser_csv.rb +124 -0
  232. data/lib/fluent/plugin/parser_json.rb +118 -0
  233. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  234. data/lib/fluent/plugin/parser_msgpack.rb +72 -0
  235. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  236. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  237. data/lib/fluent/plugin/parser_none.rb +36 -0
  238. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  239. data/lib/fluent/plugin/parser_syslog.rb +543 -0
  240. data/lib/fluent/plugin/parser_tsv.rb +47 -0
  241. data/lib/fluent/plugin/sd_file.rb +157 -0
  242. data/lib/fluent/plugin/sd_srv.rb +135 -0
  243. data/lib/fluent/plugin/sd_static.rb +58 -0
  244. data/lib/fluent/plugin/service_discovery.rb +65 -0
  245. data/lib/fluent/plugin/socket_util.rb +22 -0
  246. data/lib/fluent/plugin/storage.rb +84 -0
  247. data/lib/fluent/plugin/storage_local.rb +166 -0
  248. data/lib/fluent/plugin/string_util.rb +22 -0
  249. data/lib/fluent/plugin.rb +206 -0
  250. data/lib/fluent/plugin_helper/cert_option.rb +199 -0
  251. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  252. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  253. data/lib/fluent/plugin_helper/counter.rb +51 -0
  254. data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
  255. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  256. data/lib/fluent/plugin_helper/extract.rb +104 -0
  257. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  258. data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
  259. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  260. data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
  261. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  262. data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
  263. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  264. data/lib/fluent/plugin_helper/http_server.rb +129 -0
  265. data/lib/fluent/plugin_helper/inject.rb +154 -0
  266. data/lib/fluent/plugin_helper/metrics.rb +136 -0
  267. data/lib/fluent/plugin_helper/parser.rb +147 -0
  268. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  269. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  270. data/lib/fluent/plugin_helper/server.rb +840 -0
  271. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  272. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  273. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  274. data/lib/fluent/plugin_helper/socket.rb +288 -0
  275. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  276. data/lib/fluent/plugin_helper/storage.rb +349 -0
  277. data/lib/fluent/plugin_helper/thread.rb +180 -0
  278. data/lib/fluent/plugin_helper/timer.rb +92 -0
  279. data/lib/fluent/plugin_helper.rb +75 -0
  280. data/lib/fluent/plugin_id.rb +93 -0
  281. data/lib/fluent/process.rb +22 -0
  282. data/lib/fluent/registry.rb +117 -0
  283. data/lib/fluent/root_agent.rb +468 -0
  284. data/lib/fluent/rpc.rb +95 -0
  285. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  286. data/lib/fluent/static_config_analysis.rb +195 -0
  287. data/lib/fluent/supervisor.rb +1347 -0
  288. data/lib/fluent/system_config.rb +213 -0
  289. data/lib/fluent/test/base.rb +83 -0
  290. data/lib/fluent/test/driver/base.rb +231 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +61 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +138 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +44 -0
  310. data/lib/fluent/test.rb +61 -0
  311. data/lib/fluent/time.rb +513 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +105 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/win32api.rb +38 -0
  318. data/lib/fluent/winsvc.rb +130 -0
  319. data/templates/new_gem/.gitignore +8 -0
  320. data/templates/new_gem/Gemfile +3 -0
  321. data/templates/new_gem/README.md.erb +43 -0
  322. data/templates/new_gem/Rakefile +13 -0
  323. data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
  324. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  325. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  326. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  327. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  328. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  329. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  330. data/templates/new_gem/test/helper.rb.erb +7 -0
  331. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  337. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  338. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  339. data/templates/plugin_config_formatter/param.md.erb +34 -0
  340. data/templates/plugin_config_formatter/section.md.erb +12 -0
  341. metadata +996 -0
@@ -0,0 +1,432 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/buffer/chunk'
18
+ require 'fluent/unique_id'
19
+ require 'fluent/msgpack_factory'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class Buffer
24
+ class FileChunk < Chunk
25
+ class FileChunkError < StandardError; end
26
+
27
+ BUFFER_HEADER = "\xc1\x00".force_encoding(Encoding::ASCII_8BIT).freeze
28
+
29
+ ### buffer path user specified : /path/to/directory/user_specified_prefix.*.log
30
+ ### buffer chunk path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log
31
+ ### buffer chunk metadata path : /path/to/directory/user_specified_prefix.b513b61c9791029c2513b61c9791029c2.log.meta
32
+
33
+ # NOTE: Old style buffer path of time sliced output plugins had a part of key: prefix.20150414.b513b61...suffix
34
+ # But this part is not used now for any purpose. (Now metadata is used instead.)
35
+
36
+ # state: b/q - 'b'(on stage, compatible with v0.12), 'q'(enqueued)
37
+ # path_prefix: path prefix string, ended with '.'
38
+ # path_suffix: path suffix string, like '.log' (or any other user specified)
39
+
40
+ attr_reader :path, :meta_path, :permission
41
+
42
+ def initialize(metadata, path, mode, perm: nil, compress: :text, decompression_size_limit: Compressable::DEFAULT_DECOMPRESSION_SIZE_LIMIT)
43
+ super(metadata, compress: compress, decompression_size_limit: decompression_size_limit)
44
+ perm ||= Fluent::DEFAULT_FILE_PERMISSION
45
+ @permission = perm.is_a?(String) ? perm.to_i(8) : perm
46
+ @bytesize = @size = @adding_bytes = @adding_size = 0
47
+ @meta = nil
48
+
49
+ case mode
50
+ when :create then create_new_chunk(path, @permission)
51
+ when :staged then load_existing_staged_chunk(path)
52
+ when :queued then load_existing_enqueued_chunk(path)
53
+ else
54
+ raise ArgumentError, "Invalid file chunk mode: #{mode}"
55
+ end
56
+ end
57
+
58
+ def concat(bulk, bulk_size)
59
+ raise "BUG: concatenating to unwritable chunk, now '#{self.state}'" unless self.writable?
60
+
61
+ bulk.force_encoding(Encoding::ASCII_8BIT)
62
+ @chunk.write bulk
63
+ @adding_bytes += bulk.bytesize
64
+ @adding_size += bulk_size
65
+ true
66
+ end
67
+
68
+ def commit
69
+ write_metadata # this should be at first: of course, this operation may fail
70
+
71
+ @commit_position = @chunk.pos
72
+ @size += @adding_size
73
+ @bytesize += @adding_bytes
74
+ @adding_bytes = @adding_size = 0
75
+ @modified_at = Fluent::Clock.real_now
76
+ @modified_at_object = nil
77
+
78
+ true
79
+ end
80
+
81
+ def rollback
82
+ if @chunk.pos != @commit_position
83
+ @chunk.seek(@commit_position, IO::SEEK_SET)
84
+ @chunk.truncate(@commit_position)
85
+ end
86
+ @adding_bytes = @adding_size = 0
87
+ true
88
+ end
89
+
90
+ def bytesize
91
+ @bytesize + @adding_bytes
92
+ end
93
+
94
+ def size
95
+ @size + @adding_size
96
+ end
97
+
98
+ def empty?
99
+ @bytesize == 0
100
+ end
101
+
102
+ def enqueued!
103
+ return self unless self.writable?
104
+
105
+ super
106
+ rename_to_queued_path
107
+ self
108
+ end
109
+
110
+ def rename_to_queued_path
111
+ new_chunk_path = self.class.generate_queued_chunk_path(@path, @unique_id)
112
+ new_meta_path = new_chunk_path + '.meta'
113
+
114
+ write_metadata(update: false) # re-write metadata w/ finalized records
115
+
116
+ begin
117
+ file_rename(@chunk, @path, new_chunk_path, ->(new_io) { @chunk = new_io })
118
+ rescue => e
119
+ begin
120
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
121
+ rescue => re
122
+ # In this point, restore buffer state is hard because previous `file_rename` failed by resource problem.
123
+ # Retry is one possible approach but it may cause livelock under limited resources or high load environment.
124
+ # So we ignore such errors for now and log better message instead.
125
+ # "Too many open files" should be fixed by proper buffer configuration and system setting.
126
+ raise "can't enqueue buffer file and failed to restore. This may causes inconsistent state: path = #{@path}, error = '#{e}', retry error = '#{re}'"
127
+ else
128
+ raise "can't enqueue buffer file: path = #{@path}, error = '#{e}'"
129
+ end
130
+ end
131
+
132
+ begin
133
+ file_rename(@meta, @meta_path, new_meta_path, ->(new_io) { @meta = new_io })
134
+ rescue => e
135
+ begin
136
+ file_rename(@chunk, new_chunk_path, @path, ->(new_io) { @chunk = new_io }) if File.exist?(new_chunk_path)
137
+ file_rename(@meta, new_meta_path, @meta_path, ->(new_io) { @meta = new_io }) if File.exist?(new_meta_path)
138
+ rescue => re
139
+ # See above
140
+ raise "can't enqueue buffer metadata and failed to restore. This may causes inconsistent state: path = #{@meta_path}, error = '#{e}', retry error = '#{re}'"
141
+ else
142
+ raise "can't enqueue buffer metadata: path = #{@meta_path}, error = '#{e}'"
143
+ end
144
+ end
145
+
146
+ @path = new_chunk_path
147
+ @meta_path = new_meta_path
148
+ end
149
+ private :rename_to_queued_path
150
+
151
+ def close
152
+ super
153
+ size = @chunk.size
154
+ @chunk.close
155
+ @meta.close if @meta # meta may be missing if chunk is queued at first
156
+ if size == 0
157
+ File.unlink(@path, @meta_path)
158
+ end
159
+ end
160
+
161
+ def purge
162
+ super
163
+ @chunk.close
164
+ @meta.close if @meta
165
+ @bytesize = @size = @adding_bytes = @adding_size = 0
166
+ File.unlink(@path, @meta_path)
167
+ end
168
+
169
+ def read(**kwargs)
170
+ @chunk.seek(0, IO::SEEK_SET)
171
+ @chunk.read
172
+ end
173
+
174
+ def open(**kwargs, &block)
175
+ @chunk.seek(0, IO::SEEK_SET)
176
+ begin
177
+ yield @chunk
178
+ ensure
179
+ @chunk.seek(0, IO::SEEK_END) if self.staged?
180
+ end
181
+ end
182
+
183
+ def self.assume_chunk_state(path)
184
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
185
+ $1 == 'b' ? :staged : :queued
186
+ else
187
+ # files which matches to glob of buffer file pattern
188
+ # it includes files which are created by out_file
189
+ :unknown
190
+ end
191
+ end
192
+
193
+ def self.generate_stage_chunk_path(path, unique_id)
194
+ pos = path.index('.*.')
195
+ raise "BUG: buffer chunk path on stage MUST have '.*.'" unless pos
196
+
197
+ prefix = path[0...pos]
198
+ suffix = path[(pos+3)..-1]
199
+
200
+ chunk_id = Fluent::UniqueId.hex(unique_id)
201
+ state = 'b'
202
+ "#{prefix}.#{state}#{chunk_id}.#{suffix}"
203
+ end
204
+
205
+ def self.generate_queued_chunk_path(path, unique_id)
206
+ chunk_id = Fluent::UniqueId.hex(unique_id)
207
+ if path.index(".b#{chunk_id}.")
208
+ path.sub(".b#{chunk_id}.", ".q#{chunk_id}.")
209
+ else # for unexpected cases (ex: users rename files while opened by fluentd)
210
+ path + ".q#{chunk_id}.chunk"
211
+ end
212
+ end
213
+
214
+ # used only for queued v0.12 buffer path or broken files
215
+ def self.unique_id_from_path(path)
216
+ if /\.(b|q)([0-9a-f]+)\.[^\/]*\Z/n =~ path # //n switch means explicit 'ASCII-8BIT' pattern
217
+ return $2.scan(/../).map{|x| x.to_i(16) }.pack('C*')
218
+ end
219
+ nil
220
+ end
221
+
222
+ def restore_metadata(bindata)
223
+ data = restore_metadata_with_new_format(bindata)
224
+
225
+ unless data
226
+ # old type of restore
227
+ data = Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(bindata).read rescue {}
228
+ end
229
+ raise FileChunkError, "invalid meta data" if data.nil? || !data.is_a?(Hash)
230
+ raise FileChunkError, "invalid unique_id" unless data[:id]
231
+ raise FileChunkError, "invalid created_at" unless data[:c].to_i > 0
232
+ raise FileChunkError, "invalid modified_at" unless data[:m].to_i > 0
233
+
234
+ now = Fluent::Clock.real_now
235
+
236
+ @unique_id = data[:id]
237
+ @size = data[:s] || 0
238
+ @created_at = data[:c]
239
+ @modified_at = data[:m]
240
+
241
+ @metadata.timekey = data[:timekey]
242
+ @metadata.tag = data[:tag]
243
+ @metadata.variables = data[:variables]
244
+ @metadata.seq = data[:seq] || 0
245
+ end
246
+
247
+ def restore_metadata_partially(chunk)
248
+ @unique_id = self.class.unique_id_from_path(chunk.path) || @unique_id
249
+ @size = 0
250
+ @created_at = chunk.ctime.to_i # birthtime isn't supported on Windows (and Travis?)
251
+ @modified_at = chunk.mtime.to_i
252
+
253
+ @metadata.timekey = nil
254
+ @metadata.tag = nil
255
+ @metadata.variables = nil
256
+ @metadata.seq = 0
257
+ end
258
+
259
+ def write_metadata(update: true)
260
+ data = @metadata.to_h.merge({
261
+ id: @unique_id,
262
+ s: (update ? @size + @adding_size : @size),
263
+ c: @created_at,
264
+ m: (update ? Fluent::Clock.real_now : @modified_at),
265
+ })
266
+ bin = Fluent::MessagePackFactory.thread_local_msgpack_packer.pack(data).full_pack
267
+ size = [bin.bytesize].pack('N')
268
+ @meta.seek(0, IO::SEEK_SET)
269
+ @meta.write(BUFFER_HEADER + size + bin)
270
+ end
271
+
272
+ def file_rename(file, old_path, new_path, callback=nil)
273
+ pos = file.pos
274
+ setup = ->(f) {
275
+ f.set_encoding(Encoding::ASCII_8BIT)
276
+ f.sync = true
277
+ f.binmode
278
+ f.pos = pos
279
+ callback.call(f) if callback
280
+ }
281
+ if Fluent.windows?
282
+ file.close
283
+ renamed = false
284
+ begin
285
+ File.rename(old_path, new_path)
286
+ renamed = true
287
+ ensure
288
+ setup.call(File.open(renamed ? new_path : old_path, 'rb', @permission))
289
+ end
290
+ else
291
+ File.rename(old_path, new_path)
292
+ file.reopen(new_path, 'rb')
293
+ setup.call(file)
294
+ end
295
+ end
296
+
297
+ def create_new_chunk(path, perm)
298
+ @path = self.class.generate_stage_chunk_path(path, @unique_id)
299
+ @meta_path = @path + '.meta'
300
+ begin
301
+ @chunk = File.open(@path, 'wb+', perm)
302
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
303
+ @chunk.sync = true
304
+ @chunk.binmode
305
+ rescue => e
306
+ # Here assumes "Too many open files" like recoverable error so raising BufferOverflowError.
307
+ # If other cases are possible, we will change error handling with proper classes.
308
+ raise BufferOverflowError, "can't create buffer file for #{path}. Stop creating buffer files: error = #{e}"
309
+ end
310
+ begin
311
+ @meta = File.open(@meta_path, 'wb', perm)
312
+ @meta.set_encoding(Encoding::ASCII_8BIT)
313
+ @meta.sync = true
314
+ @meta.binmode
315
+ write_metadata(update: false)
316
+ rescue => e
317
+ # This case is easier than enqueued!. Just removing pre-create buffer file
318
+ @chunk.close rescue nil
319
+ File.unlink(@path) rescue nil
320
+
321
+ if @meta
322
+ # ensure to unlink when #write_metadata fails
323
+ @meta.close rescue nil
324
+ File.unlink(@meta_path) rescue nil
325
+ end
326
+
327
+ # Same as @chunk case. See above
328
+ raise BufferOverflowError, "can't create buffer metadata for #{path}. Stop creating buffer files: error = #{e}"
329
+ end
330
+
331
+ @state = :unstaged
332
+ @bytesize = 0
333
+ @commit_position = @chunk.pos # must be 0
334
+ @adding_bytes = 0
335
+ @adding_size = 0
336
+ end
337
+
338
+ def load_existing_staged_chunk(path)
339
+ @path = path
340
+ @meta_path = @path + '.meta'
341
+
342
+ @meta = nil
343
+ # staging buffer chunk without metadata is classic buffer chunk file
344
+ # and it should be enqueued immediately
345
+ if File.exist?(@meta_path)
346
+ raise FileChunkError, "staged file chunk is empty" if File.size(@path).zero?
347
+
348
+ @chunk = File.open(@path, 'rb+')
349
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
350
+ @chunk.sync = true
351
+ @chunk.seek(0, IO::SEEK_END)
352
+ @chunk.binmode
353
+
354
+ @meta = File.open(@meta_path, 'rb+')
355
+ @meta.set_encoding(Encoding::ASCII_8BIT)
356
+ @meta.sync = true
357
+ @meta.binmode
358
+ begin
359
+ restore_metadata(@meta.read)
360
+ rescue => e
361
+ @chunk.close
362
+ @meta.close
363
+ raise FileChunkError, "staged meta file is broken. #{e.message}"
364
+ end
365
+ @meta.seek(0, IO::SEEK_SET)
366
+
367
+ @state = :staged
368
+ @bytesize = @chunk.size
369
+ @commit_position = @chunk.pos
370
+ @adding_bytes = 0
371
+ @adding_size = 0
372
+ else
373
+ # classic buffer chunk - read only chunk
374
+ @chunk = File.open(@path, 'rb')
375
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
376
+ @chunk.binmode
377
+ @chunk.seek(0, IO::SEEK_SET)
378
+ @state = :queued
379
+ @bytesize = @chunk.size
380
+
381
+ restore_metadata_partially(@chunk)
382
+
383
+ @commit_position = @chunk.size
384
+ @unique_id = self.class.unique_id_from_path(@path) || @unique_id
385
+ end
386
+ end
387
+
388
+ def load_existing_enqueued_chunk(path)
389
+ @path = path
390
+ raise FileChunkError, "enqueued file chunk is empty" if File.size(@path).zero?
391
+
392
+ @chunk = File.open(@path, 'rb')
393
+ @chunk.set_encoding(Encoding::ASCII_8BIT)
394
+ @chunk.binmode
395
+ @chunk.seek(0, IO::SEEK_SET)
396
+ @bytesize = @chunk.size
397
+ @commit_position = @chunk.size
398
+
399
+ @meta_path = @path + '.meta'
400
+ if File.readable?(@meta_path)
401
+ begin
402
+ restore_metadata(File.open(@meta_path){|f| f.set_encoding(Encoding::ASCII_8BIT); f.binmode; f.read })
403
+ rescue => e
404
+ @chunk.close
405
+ raise FileChunkError, "enqueued meta file is broken. #{e.message}"
406
+ end
407
+ else
408
+ restore_metadata_partially(@chunk)
409
+ end
410
+ @state = :queued
411
+ end
412
+
413
+ private
414
+
415
+ def restore_metadata_with_new_format(chunk)
416
+ if chunk.size <= 6 # size of BUFFER_HEADER (2) + size of data size(4)
417
+ return nil
418
+ end
419
+
420
+ if chunk.slice(0, 2) == BUFFER_HEADER
421
+ size = chunk.slice(2, 4).unpack1('N')
422
+ if size
423
+ return Fluent::MessagePackFactory.msgpack_unpacker(symbolize_keys: true).feed(chunk.slice(6, size)).read rescue nil
424
+ end
425
+ end
426
+
427
+ nil
428
+ end
429
+ end
430
+ end
431
+ end
432
+ end