fluentd 0.12.40 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,63 @@
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/base'
18
+
19
+ require 'fluent/log'
20
+ require 'fluent/plugin_id'
21
+ require 'fluent/plugin_helper'
22
+
23
+ module Fluent
24
+ module Plugin
25
+ class BareOutput < Base
26
+ # DO NOT USE THIS plugin for normal output plugin. Use Output instead.
27
+ # This output plugin base class is only for meta-output plugins
28
+ # which cannot be implemented on MultiOutput.
29
+ # E.g,: forest, config-expander
30
+
31
+ include PluginId
32
+ include PluginLoggerMixin
33
+ include PluginHelper::Mixin
34
+
35
+ attr_reader :num_errors, :emit_count, :emit_records
36
+
37
+ def process(tag, es)
38
+ raise NotImplementedError, "BUG: output plugins MUST implement this method"
39
+ end
40
+
41
+ def initialize
42
+ super
43
+ @counters_monitor = Monitor.new
44
+ # TODO: well organized counters
45
+ @num_errors = 0
46
+ @emit_count = 0
47
+ @emit_records = 0
48
+ end
49
+
50
+ def emit_sync(tag, es)
51
+ @counters_monitor.synchronize{ @emit_count += 1 }
52
+ begin
53
+ process(tag, es)
54
+ @counters_monitor.synchronize{ @emit_records += es.size }
55
+ rescue
56
+ @counters_monitor.synchronize{ @num_errors += 1 }
57
+ raise
58
+ end
59
+ end
60
+ alias :emit_events :emit_sync
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,192 @@
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'
18
+ require 'fluent/configurable'
19
+ require 'fluent/system_config'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class Base
24
+ include Configurable
25
+ include SystemConfig::Mixin
26
+
27
+ State = Struct.new(:configure, :start, :after_start, :stop, :before_shutdown, :shutdown, :after_shutdown, :close, :terminate)
28
+
29
+ attr_accessor :under_plugin_development
30
+
31
+ def initialize
32
+ @log = nil
33
+ super
34
+ @_state = State.new(false, false, false, false, false, false, false, false, false)
35
+ @_context_router = nil
36
+ @_fluentd_worker_id = nil
37
+ @under_plugin_development = false
38
+ end
39
+
40
+ def has_router?
41
+ false
42
+ end
43
+
44
+ def plugin_root_dir
45
+ nil # override this in plugin_id.rb
46
+ end
47
+
48
+ def fluentd_worker_id
49
+ return @_fluentd_worker_id if @_fluentd_worker_id
50
+ @_fluentd_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
51
+ @_fluentd_worker_id
52
+ end
53
+
54
+ def configure(conf)
55
+ if conf.respond_to?(:for_this_worker?) && conf.for_this_worker?
56
+ workers = if conf.target_worker_ids && !conf.target_worker_ids.empty?
57
+ conf.target_worker_ids.size
58
+ else
59
+ 1
60
+ end
61
+ system_config_override(workers: workers)
62
+ end
63
+ super
64
+ @_state ||= State.new(false, false, false, false, false, false, false, false, false)
65
+ @_state.configure = true
66
+ self
67
+ end
68
+
69
+ def multi_workers_ready?
70
+ true
71
+ end
72
+
73
+ def string_safe_encoding(str)
74
+ unless str.valid_encoding?
75
+ log.info "invalid byte sequence is replaced in `#{str}`" if self.respond_to?(:log)
76
+ str = str.scrub('?')
77
+ end
78
+ yield str
79
+ end
80
+
81
+ def context_router=(router)
82
+ @_context_router = router
83
+ end
84
+
85
+ def context_router
86
+ @_context_router
87
+ end
88
+
89
+ def start
90
+ # By initialization order, plugin logger is created before set log_event_enabled.
91
+ # It causes '@id' specified plugin, it uses plugin logger instead of global logger, ignores `<label @FLUENT_LOG>` setting.
92
+ # This is adhoc approach but impact is minimal.
93
+ if @log.is_a?(Fluent::PluginLogger) && $log.respond_to?(:log_event_enabled) # log_event_enabled check for tests
94
+ @log.log_event_enabled = $log.log_event_enabled
95
+ end
96
+ @_state.start = true
97
+ self
98
+ end
99
+
100
+ def after_start
101
+ @_state.after_start = true
102
+ self
103
+ end
104
+
105
+ def stop
106
+ @_state.stop = true
107
+ self
108
+ end
109
+
110
+ def before_shutdown
111
+ @_state.before_shutdown = true
112
+ self
113
+ end
114
+
115
+ def shutdown
116
+ @_state.shutdown = true
117
+ self
118
+ end
119
+
120
+ def after_shutdown
121
+ @_state.after_shutdown = true
122
+ self
123
+ end
124
+
125
+ def close
126
+ @_state.close = true
127
+ self
128
+ end
129
+
130
+ def terminate
131
+ @_state.terminate = true
132
+ self
133
+ end
134
+
135
+ def configured?
136
+ @_state.configure
137
+ end
138
+
139
+ def started?
140
+ @_state.start
141
+ end
142
+
143
+ def after_started?
144
+ @_state.after_start
145
+ end
146
+
147
+ def stopped?
148
+ @_state.stop
149
+ end
150
+
151
+ def before_shutdown?
152
+ @_state.before_shutdown
153
+ end
154
+
155
+ def shutdown?
156
+ @_state.shutdown
157
+ end
158
+
159
+ def after_shutdown?
160
+ @_state.after_shutdown
161
+ end
162
+
163
+ def closed?
164
+ @_state.close
165
+ end
166
+
167
+ def terminated?
168
+ @_state.terminate
169
+ end
170
+
171
+ def called_in_test?
172
+ caller_locations.each do |location|
173
+ # Thread::Backtrace::Location#path returns base filename or absolute path.
174
+ # #absolute_path returns absolute_path always.
175
+ # https://bugs.ruby-lang.org/issues/12159
176
+ if location.absolute_path =~ /\/test_[^\/]+\.rb$/ # location.path =~ /test_.+\.rb$/
177
+ return true
178
+ end
179
+ end
180
+ false
181
+ end
182
+
183
+ def inspect
184
+ # Plugin instances are sometimes too big to dump because it may have too many thins (buffer,storage, ...)
185
+ # Original commit comment says that:
186
+ # To emulate normal inspect behavior `ruby -e'o=Object.new;p o;p (o.__id__<<1).to_s(16)'`.
187
+ # https://github.com/ruby/ruby/blob/trunk/gc.c#L788
188
+ "#<%s:%014x>" % [self.class.name, '0x%014x' % (__id__ << 1)]
189
+ end
190
+ end
191
+ end
192
+ end
@@ -15,218 +15,172 @@
15
15
  #
16
16
 
17
17
  require 'fileutils'
18
- require 'uri'
19
18
 
20
- require 'fluent/env'
21
- require 'fluent/plugin'
22
- require 'fluent/buffer'
19
+ require 'fluent/plugin/buffer'
20
+ require 'fluent/plugin/buffer/file_chunk'
21
+ require 'fluent/system_config'
23
22
 
24
23
  module Fluent
25
- class FileBufferChunk < BufferChunk
26
- def initialize(key, path, unique_id, mode="a+", symlink_path = nil)
27
- super(key)
28
- @path = path
29
- @unique_id = unique_id
30
- @file = File.open(@path, mode, DEFAULT_FILE_PERMISSION)
31
- @file.sync = true
32
- @size = @file.stat.size
33
- FileUtils.ln_sf(@path, symlink_path) if symlink_path
34
- end
35
-
36
- attr_reader :unique_id, :path
24
+ module Plugin
25
+ class FileBuffer < Fluent::Plugin::Buffer
26
+ Plugin.register_buffer('file', self)
37
27
 
38
- def <<(data)
39
- @file.write(data)
40
- @size += data.bytesize
41
- end
28
+ include SystemConfig::Mixin
42
29
 
43
- def size
44
- @size
45
- end
30
+ DEFAULT_CHUNK_LIMIT_SIZE = 256 * 1024 * 1024 # 256MB
31
+ DEFAULT_TOTAL_LIMIT_SIZE = 64 * 1024 * 1024 * 1024 # 64GB, same with v0.12 (TimeSlicedOutput + buf_file)
46
32
 
47
- def empty?
48
- @size == 0
49
- end
33
+ DIR_PERMISSION = 0755
50
34
 
51
- def close
52
- stat = @file.stat
53
- @file.close
54
- if stat.size == 0
55
- File.unlink(@path)
56
- end
57
- end
35
+ desc 'The path where buffer chunks are stored.'
36
+ config_param :path, :string, default: nil
58
37
 
59
- def purge
60
- @file.close
61
- File.unlink(@path) rescue nil # TODO rescue?
62
- end
38
+ config_set_default :chunk_limit_size, DEFAULT_CHUNK_LIMIT_SIZE
39
+ config_set_default :total_limit_size, DEFAULT_TOTAL_LIMIT_SIZE
63
40
 
64
- def read
65
- @file.pos = 0
66
- @file.read
67
- end
41
+ config_param :file_permission, :string, default: nil # '0644'
42
+ config_param :dir_permission, :string, default: nil # '0755'
68
43
 
69
- def open(&block)
70
- @file.pos = 0
71
- yield @file
72
- end
44
+ @@buffer_paths = {}
73
45
 
74
- def mv(path)
75
- File.rename(@path, path)
76
- @path = path
77
- end
78
- end
46
+ def initialize
47
+ super
48
+ @symlink_path = nil
49
+ @multi_workers_available = false
50
+ @additional_resume_path = nil
51
+ end
79
52
 
80
- class FileBuffer < BasicBuffer
81
- Plugin.register_buffer('file', self)
53
+ def configure(conf)
54
+ super
82
55
 
83
- @@buffer_paths = {}
56
+ multi_workers_configured = owner.system_config.workers > 1 ? true : false
84
57
 
85
- def initialize
86
- require 'uri'
87
- super
58
+ using_plugin_root_dir = false
59
+ unless @path
60
+ if root_dir = owner.plugin_root_dir
61
+ @path = File.join(root_dir, 'buffer')
62
+ using_plugin_root_dir = true # plugin_root_dir path contains worker id
63
+ else
64
+ raise Fluent::ConfigError, "buffer path is not configured. specify 'path' in <buffer>"
65
+ end
66
+ end
88
67
 
89
- @uri_parser = URI::Parser.new
90
- end
68
+ type_of_owner = Plugin.lookup_type_from_class(@_owner.class)
69
+ if @@buffer_paths.has_key?(@path) && !called_in_test?
70
+ type_using_this_path = @@buffer_paths[@path]
71
+ raise ConfigError, "Other '#{type_using_this_path}' plugin already use same buffer path: type = #{type_of_owner}, buffer path = #{@path}"
72
+ end
91
73
 
92
- desc 'The path where buffer chunks are stored.'
93
- config_param :buffer_path, :string
94
- desc 'If true, queued chunks are flushed at shutdown process.'
95
- config_param :flush_at_shutdown, :bool, default: false
74
+ @@buffer_paths[@path] = type_of_owner
96
75
 
97
- # 'symlink_path' is currently only for out_file.
98
- # That is the reason why this is not config_param, but attr_accessor.
99
- # See: https://github.com/fluent/fluentd/pull/181
100
- attr_accessor :symlink_path
76
+ specified_directory_exists = File.exist?(@path) && File.directory?(@path)
77
+ unexisting_path_for_directory = !File.exist?(@path) && !@path.include?('.*')
101
78
 
102
- def configure(conf)
103
- super
79
+ if specified_directory_exists || unexisting_path_for_directory # directory
80
+ if using_plugin_root_dir || !multi_workers_configured
81
+ @path = File.join(@path, 'buffer.*.log')
82
+ else
83
+ @path = File.join(@path, "worker#{fluentd_worker_id}", 'buffer.*.log')
84
+ if fluentd_worker_id == 0
85
+ # worker 0 always checks unflushed buffer chunks to be resumed (might be created while non-multi-worker configuration)
86
+ @additional_resume_path = File.join(File.expand_path("../../", @path), 'buffer.*.log')
87
+ end
88
+ end
89
+ @multi_workers_available = true
90
+ else # specified path is file path
91
+ if File.basename(@path).include?('.*.')
92
+ # valid file path
93
+ elsif File.basename(@path).end_with?('.*')
94
+ @path = @path + '.log'
95
+ else
96
+ # existing file will be ignored
97
+ @path = @path + '.*.log'
98
+ end
99
+ @multi_workers_available = false
100
+ end
104
101
 
105
- if @@buffer_paths.has_key?(@buffer_path)
106
- raise ConfigError, "Other '#{@@buffer_paths[@buffer_path]}' plugin already use same buffer_path: type = #{conf['@type'] || conf['type']}, buffer_path = #{@buffer_path}"
107
- else
108
- @@buffer_paths[@buffer_path] = conf['@type'] || conf['type']
102
+ if @dir_permission
103
+ @dir_permission = @dir_permission.to_i(8) if @dir_permission.is_a?(String)
104
+ else
105
+ @dir_permission = system_config.dir_permission || DIR_PERMISSION
106
+ end
109
107
  end
110
108
 
111
- if pos = @buffer_path.index('*')
112
- @buffer_path_prefix = @buffer_path[0, pos]
113
- @buffer_path_suffix = @buffer_path[(pos + 1)..-1]
114
- else
115
- @buffer_path_prefix = @buffer_path + "."
116
- @buffer_path_suffix = ".log"
109
+ # This method is called only when multi worker is configured
110
+ def multi_workers_ready?
111
+ unless @multi_workers_available
112
+ log.error "file buffer with multi workers should be configured to use directory 'path', or system root_dir and plugin id"
113
+ end
114
+ @multi_workers_available
117
115
  end
118
116
 
119
- end
120
-
121
- def start
122
- FileUtils.mkdir_p File.dirname(@buffer_path_prefix + "path"), mode: DEFAULT_DIR_PERMISSION
123
- super
124
- end
125
-
126
- # Dots are separator for many cases:
127
- # we should have to escape dots in keys...
128
- PATH_MATCH = /^([-_.%0-9a-zA-Z]*)\.(b|q)([0-9a-fA-F]{1,32})$/
117
+ def start
118
+ FileUtils.mkdir_p File.dirname(@path), mode: @dir_permission
129
119
 
130
- def new_chunk(key)
131
- encoded_key = encode_key(key)
132
- path, tsuffix = make_path(encoded_key, "b")
133
- unique_id = tsuffix_to_unique_id(tsuffix)
134
- FileBufferChunk.new(key, path, unique_id, "a+", @symlink_path)
135
- end
120
+ super
121
+ end
136
122
 
137
- def resume
138
- maps = []
139
- queues = []
140
-
141
- Dir.glob("#{@buffer_path_prefix}*#{@buffer_path_suffix}") {|path|
142
- identifier_part = chunk_identifier_in_path(path)
143
- if m = PATH_MATCH.match(identifier_part)
144
- key = decode_key(m[1])
145
- bq = m[2]
146
- tsuffix = m[3]
147
- timestamp = m[3].to_i(16)
148
- unique_id = tsuffix_to_unique_id(tsuffix)
149
-
150
- if bq == 'b'
151
- chunk = FileBufferChunk.new(key, path, unique_id, "a+")
152
- maps << [timestamp, chunk]
153
- elsif bq == 'q'
154
- chunk = FileBufferChunk.new(key, path, unique_id, "r")
155
- queues << [timestamp, chunk]
156
- end
157
- end
158
- }
159
-
160
- map = {}
161
- maps.sort_by {|(timestamp,chunk)|
162
- timestamp
163
- }.each {|(timestamp,chunk)|
164
- map[chunk.key] = chunk
165
- }
166
-
167
- queue = queues.sort_by {|(timestamp,chunk)|
168
- timestamp
169
- }.map {|(timestamp,chunk)|
170
- chunk
171
- }
172
-
173
- return queue, map
174
- end
123
+ def persistent?
124
+ true
125
+ end
175
126
 
176
- def chunk_identifier_in_path(path)
177
- pos_after_prefix = @buffer_path_prefix.length
178
- pos_before_suffix = @buffer_path_suffix.length + 1 # from tail of path
127
+ def resume
128
+ stage = {}
129
+ queue = []
179
130
 
180
- path.slice(pos_after_prefix..-pos_before_suffix)
181
- end
131
+ patterns = [@path]
132
+ patterns.unshift @additional_resume_path if @additional_resume_path
133
+ Dir.glob(patterns) do |path|
134
+ next unless File.file?(path)
182
135
 
183
- def enqueue(chunk)
184
- path = chunk.path
185
- identifier_part = chunk_identifier_in_path(path)
136
+ log.debug { "restoring buffer file: path = #{path}" }
186
137
 
187
- m = PATH_MATCH.match(identifier_part)
188
- encoded_key = m ? m[1] : ""
189
- tsuffix = m[3]
190
- npath = "#{@buffer_path_prefix}#{encoded_key}.q#{tsuffix}#{@buffer_path_suffix}"
138
+ m = new_metadata() # this metadata will be overwritten by resuming .meta file content
139
+ # so it should not added into @metadata_list for now
140
+ mode = Fluent::Plugin::Buffer::FileChunk.assume_chunk_state(path)
141
+ if mode == :unknown
142
+ log.debug "unknown state chunk found", path: path
143
+ next
144
+ end
191
145
 
192
- chunk.mv(npath)
193
- end
146
+ begin
147
+ chunk = Fluent::Plugin::Buffer::FileChunk.new(m, path, mode) # file chunk resumes contents of metadata
148
+ rescue Fluent::Plugin::Buffer::FileChunk::FileChunkError => e
149
+ handle_broken_files(path, mode, e)
150
+ next
151
+ end
194
152
 
195
- def before_shutdown(out)
196
- if @flush_at_shutdown
197
- synchronize do
198
- @map.each_key {|key|
199
- push(key)
200
- }
201
- while pop(out)
153
+ case chunk.state
154
+ when :staged
155
+ stage[chunk.metadata] = chunk
156
+ when :queued
157
+ queue << chunk
202
158
  end
203
159
  end
204
- end
205
- end
206
160
 
207
- private
161
+ queue.sort_by!{ |chunk| chunk.modified_at }
208
162
 
209
- # Dots are separator for many cases:
210
- # we should have to escape dots in keys...
211
- def encode_key(key)
212
- @uri_parser.escape(key, /[^-_.a-zA-Z0-9]/n) # //n switch means explicit 'ASCII-8BIT' pattern
213
- end
163
+ return stage, queue
164
+ end
214
165
 
215
- def decode_key(encoded_key)
216
- @uri_parser.unescape(encoded_key)
217
- end
166
+ def generate_chunk(metadata)
167
+ # FileChunk generates real path with unique_id
168
+ if @file_permission
169
+ chunk = Fluent::Plugin::Buffer::FileChunk.new(metadata, @path, :create, perm: @file_permission, compress: @compress)
170
+ else
171
+ chunk = Fluent::Plugin::Buffer::FileChunk.new(metadata, @path, :create, compress: @compress)
172
+ end
218
173
 
219
- def make_path(encoded_key, bq)
220
- now = Time.now.utc
221
- timestamp = ((now.to_i * 1000 * 1000 + now.usec) << 12 | rand(0xfff))
222
- tsuffix = timestamp.to_s(16)
223
- path = "#{@buffer_path_prefix}#{encoded_key}.#{bq}#{tsuffix}#{@buffer_path_suffix}"
224
- return path, tsuffix
225
- end
174
+ log.debug "Created new chunk", chunk_id: dump_unique_id_hex(chunk.unique_id), metadata: metadata
226
175
 
227
- def tsuffix_to_unique_id(tsuffix)
228
- # why *2 ? frsyuki said that I forgot why completely.
229
- tsuffix.scan(/../).map {|x| x.to_i(16) }.pack('C*') * 2
176
+ return chunk
177
+ end
178
+
179
+ def handle_broken_files(path, mode, e)
180
+ log.error "found broken chunk file during resume. Deleted corresponding files:", :path => path, :mode => mode, :err_msg => e.message
181
+ # After support 'backup_dir' feature, these files are moved to backup_dir instead of unlink.
182
+ File.unlink(path, path + '.meta') rescue nil
183
+ end
230
184
  end
231
185
  end
232
186
  end