opendal 0.1.6.pre.rc.1

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 (809) hide show
  1. checksums.yaml +7 -0
  2. data/.standard.yml +20 -0
  3. data/.tool-versions +1 -0
  4. data/.yardopts +1 -0
  5. data/Cargo.toml +65 -0
  6. data/DEPENDENCIES.md +9 -0
  7. data/DEPENDENCIES.rust.tsv +277 -0
  8. data/Gemfile +35 -0
  9. data/README.md +159 -0
  10. data/Rakefile +149 -0
  11. data/build.rs +22 -0
  12. data/core/CHANGELOG.md +4929 -0
  13. data/core/CONTRIBUTING.md +61 -0
  14. data/core/Cargo.lock +10259 -0
  15. data/core/Cargo.toml +437 -0
  16. data/core/DEPENDENCIES.md +3 -0
  17. data/core/DEPENDENCIES.rust.tsv +185 -0
  18. data/core/LICENSE +201 -0
  19. data/core/README.md +228 -0
  20. data/core/benches/README.md +18 -0
  21. data/core/benches/ops/README.md +26 -0
  22. data/core/benches/ops/main.rs +25 -0
  23. data/core/benches/ops/read.rs +100 -0
  24. data/core/benches/ops/utils.rs +59 -0
  25. data/core/benches/ops/write.rs +106 -0
  26. data/core/benches/types/README.md +9 -0
  27. data/core/benches/types/buffer.rs +114 -0
  28. data/core/benches/types/main.rs +23 -0
  29. data/core/benches/types/tasks.rs +64 -0
  30. data/core/benches/vs_fs/Cargo.toml +32 -0
  31. data/core/benches/vs_fs/README.md +35 -0
  32. data/core/benches/vs_fs/src/main.rs +83 -0
  33. data/core/benches/vs_s3/Cargo.toml +38 -0
  34. data/core/benches/vs_s3/README.md +55 -0
  35. data/core/benches/vs_s3/src/main.rs +123 -0
  36. data/core/edge/README.md +3 -0
  37. data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
  38. data/core/edge/file_write_on_full_disk/README.md +14 -0
  39. data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
  40. data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
  41. data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
  42. data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
  43. data/core/edge/s3_read_on_wasm/.gitignore +3 -0
  44. data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
  45. data/core/edge/s3_read_on_wasm/README.md +42 -0
  46. data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
  47. data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
  48. data/core/examples/README.md +23 -0
  49. data/core/examples/basic/Cargo.toml +29 -0
  50. data/core/examples/basic/README.md +15 -0
  51. data/core/examples/basic/src/main.rs +51 -0
  52. data/core/examples/concurrent-upload/Cargo.toml +29 -0
  53. data/core/examples/concurrent-upload/README.md +15 -0
  54. data/core/examples/concurrent-upload/src/main.rs +68 -0
  55. data/core/examples/multipart-upload/Cargo.toml +29 -0
  56. data/core/examples/multipart-upload/README.md +15 -0
  57. data/core/examples/multipart-upload/src/main.rs +56 -0
  58. data/core/fuzz/.gitignore +5 -0
  59. data/core/fuzz/Cargo.toml +92 -0
  60. data/core/fuzz/README.md +68 -0
  61. data/core/fuzz/fuzz_reader.rs +102 -0
  62. data/core/fuzz/fuzz_writer.rs +123 -0
  63. data/core/src/blocking/delete.rs +74 -0
  64. data/core/src/blocking/list.rs +71 -0
  65. data/core/src/blocking/mod.rs +33 -0
  66. data/core/src/blocking/operator.rs +729 -0
  67. data/core/src/blocking/read/buffer_iterator.rs +66 -0
  68. data/core/src/blocking/read/mod.rs +27 -0
  69. data/core/src/blocking/read/reader.rs +124 -0
  70. data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
  71. data/core/src/blocking/read/std_reader.rs +95 -0
  72. data/core/src/blocking/write/mod.rs +22 -0
  73. data/core/src/blocking/write/std_writer.rs +82 -0
  74. data/core/src/blocking/write/writer.rs +109 -0
  75. data/core/src/docs/comparisons/mod.rs +30 -0
  76. data/core/src/docs/comparisons/vs_object_store.md +183 -0
  77. data/core/src/docs/concepts.rs +135 -0
  78. data/core/src/docs/internals/accessor.rs +306 -0
  79. data/core/src/docs/internals/layer.rs +42 -0
  80. data/core/src/docs/internals/mod.rs +62 -0
  81. data/core/src/docs/mod.rs +43 -0
  82. data/core/src/docs/performance/concurrent_write.md +101 -0
  83. data/core/src/docs/performance/http_optimization.md +124 -0
  84. data/core/src/docs/performance/mod.rs +32 -0
  85. data/core/src/docs/rfcs/0000_example.md +74 -0
  86. data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
  87. data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
  88. data/core/src/docs/rfcs/0044_error_handle.md +198 -0
  89. data/core/src/docs/rfcs/0057_auto_region.md +160 -0
  90. data/core/src/docs/rfcs/0069_object_stream.md +145 -0
  91. data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
  92. data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
  93. data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
  94. data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
  95. data/core/src/docs/rfcs/0221_create_dir.md +89 -0
  96. data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
  97. data/core/src/docs/rfcs/0293_object_id.md +67 -0
  98. data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
  99. data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
  100. data/core/src/docs/rfcs/0413_presign.md +154 -0
  101. data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
  102. data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
  103. data/core/src/docs/rfcs/0438_multipart.md +163 -0
  104. data/core/src/docs/rfcs/0443_gateway.md +73 -0
  105. data/core/src/docs/rfcs/0501_new_builder.md +111 -0
  106. data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
  107. data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
  108. data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
  109. data/core/src/docs/rfcs/0623_redis_service.md +300 -0
  110. data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
  111. data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
  112. data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
  113. data/core/src/docs/rfcs/0926_object_reader.md +93 -0
  114. data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
  115. data/core/src/docs/rfcs/1085_object_handler.md +73 -0
  116. data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
  117. data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
  118. data/core/src/docs/rfcs/1420_object_writer.md +147 -0
  119. data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
  120. data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
  121. data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
  122. data/core/src/docs/rfcs/2133_append_api.md +88 -0
  123. data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
  124. data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
  125. data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
  126. data/core/src/docs/rfcs/2774_lister_api.md +66 -0
  127. data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
  128. data/core/src/docs/rfcs/2852_native_capability.md +58 -0
  129. data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
  130. data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
  131. data/core/src/docs/rfcs/3197_config.md +237 -0
  132. data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
  133. data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
  134. data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
  135. data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
  136. data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
  137. data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
  138. data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
  139. data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
  140. data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
  141. data/core/src/docs/rfcs/4638_executor.md +215 -0
  142. data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
  143. data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
  144. data/core/src/docs/rfcs/5479_context.md +140 -0
  145. data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
  146. data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
  147. data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
  148. data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
  149. data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
  150. data/core/src/docs/rfcs/6209_glob_support.md +132 -0
  151. data/core/src/docs/rfcs/6213_options_api.md +142 -0
  152. data/core/src/docs/rfcs/README.md +62 -0
  153. data/core/src/docs/rfcs/mod.rs +278 -0
  154. data/core/src/docs/upgrade.md +1556 -0
  155. data/core/src/layers/async_backtrace.rs +174 -0
  156. data/core/src/layers/await_tree.rs +202 -0
  157. data/core/src/layers/capability_check.rs +239 -0
  158. data/core/src/layers/chaos.rs +170 -0
  159. data/core/src/layers/complete.rs +385 -0
  160. data/core/src/layers/concurrent_limit.rs +322 -0
  161. data/core/src/layers/correctness_check.rs +440 -0
  162. data/core/src/layers/dtrace.rs +294 -0
  163. data/core/src/layers/error_context.rs +310 -0
  164. data/core/src/layers/fastmetrics.rs +525 -0
  165. data/core/src/layers/fastrace.rs +271 -0
  166. data/core/src/layers/http_client.rs +206 -0
  167. data/core/src/layers/immutable_index.rs +408 -0
  168. data/core/src/layers/logging.rs +842 -0
  169. data/core/src/layers/metrics.rs +182 -0
  170. data/core/src/layers/mime_guess.rs +199 -0
  171. data/core/src/layers/mod.rs +130 -0
  172. data/core/src/layers/observe/metrics.rs +936 -0
  173. data/core/src/layers/observe/mod.rs +93 -0
  174. data/core/src/layers/otelmetrics.rs +496 -0
  175. data/core/src/layers/oteltrace.rs +203 -0
  176. data/core/src/layers/prometheus.rs +686 -0
  177. data/core/src/layers/prometheus_client.rs +519 -0
  178. data/core/src/layers/retry.rs +933 -0
  179. data/core/src/layers/throttle.rs +204 -0
  180. data/core/src/layers/timeout.rs +513 -0
  181. data/core/src/layers/tracing.rs +349 -0
  182. data/core/src/layers/type_eraser.rs +91 -0
  183. data/core/src/lib.rs +204 -0
  184. data/core/src/raw/accessor.rs +856 -0
  185. data/core/src/raw/adapters/kv/api.rs +164 -0
  186. data/core/src/raw/adapters/kv/backend.rs +253 -0
  187. data/core/src/raw/adapters/kv/mod.rs +31 -0
  188. data/core/src/raw/adapters/mod.rs +50 -0
  189. data/core/src/raw/adapters/typed_kv/api.rs +171 -0
  190. data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
  191. data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
  192. data/core/src/raw/atomic_util.rs +57 -0
  193. data/core/src/raw/azure.rs +570 -0
  194. data/core/src/raw/chrono_util.rs +109 -0
  195. data/core/src/raw/enum_utils.rs +201 -0
  196. data/core/src/raw/futures_util.rs +470 -0
  197. data/core/src/raw/http_util/body.rs +144 -0
  198. data/core/src/raw/http_util/bytes_content_range.rs +239 -0
  199. data/core/src/raw/http_util/bytes_range.rs +260 -0
  200. data/core/src/raw/http_util/client.rs +276 -0
  201. data/core/src/raw/http_util/error.rs +68 -0
  202. data/core/src/raw/http_util/header.rs +356 -0
  203. data/core/src/raw/http_util/mod.rs +78 -0
  204. data/core/src/raw/http_util/multipart.rs +1180 -0
  205. data/core/src/raw/http_util/uri.rs +190 -0
  206. data/core/src/raw/layer.rs +295 -0
  207. data/core/src/raw/mod.rs +101 -0
  208. data/core/src/raw/oio/buf/flex_buf.rs +118 -0
  209. data/core/src/raw/oio/buf/mod.rs +25 -0
  210. data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
  211. data/core/src/raw/oio/buf/queue_buf.rs +117 -0
  212. data/core/src/raw/oio/delete/api.rs +102 -0
  213. data/core/src/raw/oio/delete/batch_delete.rs +127 -0
  214. data/core/src/raw/oio/delete/mod.rs +30 -0
  215. data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
  216. data/core/src/raw/oio/entry.rs +89 -0
  217. data/core/src/raw/oio/list/api.rs +69 -0
  218. data/core/src/raw/oio/list/flat_list.rs +137 -0
  219. data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
  220. data/core/src/raw/oio/list/mod.rs +35 -0
  221. data/core/src/raw/oio/list/page_list.rs +105 -0
  222. data/core/src/raw/oio/list/prefix_list.rs +64 -0
  223. data/core/src/raw/oio/mod.rs +40 -0
  224. data/core/src/raw/oio/read/api.rs +119 -0
  225. data/core/src/raw/oio/read/mod.rs +21 -0
  226. data/core/src/raw/oio/write/api.rs +103 -0
  227. data/core/src/raw/oio/write/append_write.rs +111 -0
  228. data/core/src/raw/oio/write/block_write.rs +405 -0
  229. data/core/src/raw/oio/write/mod.rs +42 -0
  230. data/core/src/raw/oio/write/multipart_write.rs +518 -0
  231. data/core/src/raw/oio/write/one_shot_write.rs +77 -0
  232. data/core/src/raw/oio/write/position_write.rs +284 -0
  233. data/core/src/raw/operation.rs +88 -0
  234. data/core/src/raw/ops.rs +917 -0
  235. data/core/src/raw/path.rs +451 -0
  236. data/core/src/raw/path_cache.rs +244 -0
  237. data/core/src/raw/rps.rs +249 -0
  238. data/core/src/raw/serde_util.rs +423 -0
  239. data/core/src/raw/std_io_util.rs +65 -0
  240. data/core/src/raw/tests/mod.rs +30 -0
  241. data/core/src/raw/tests/read.rs +116 -0
  242. data/core/src/raw/tests/utils.rs +80 -0
  243. data/core/src/raw/tests/write.rs +79 -0
  244. data/core/src/raw/tokio_util.rs +24 -0
  245. data/core/src/raw/version.rs +19 -0
  246. data/core/src/services/aliyun_drive/backend.rs +421 -0
  247. data/core/src/services/aliyun_drive/config.rs +72 -0
  248. data/core/src/services/aliyun_drive/core.rs +651 -0
  249. data/core/src/services/aliyun_drive/delete.rs +51 -0
  250. data/core/src/services/aliyun_drive/docs.md +61 -0
  251. data/core/src/services/aliyun_drive/error.rs +56 -0
  252. data/core/src/services/aliyun_drive/lister.rs +134 -0
  253. data/core/src/services/aliyun_drive/mod.rs +39 -0
  254. data/core/src/services/aliyun_drive/writer.rs +114 -0
  255. data/core/src/services/alluxio/backend.rs +257 -0
  256. data/core/src/services/alluxio/config.rs +50 -0
  257. data/core/src/services/alluxio/core.rs +367 -0
  258. data/core/src/services/alluxio/delete.rs +38 -0
  259. data/core/src/services/alluxio/docs.md +45 -0
  260. data/core/src/services/alluxio/error.rs +99 -0
  261. data/core/src/services/alluxio/lister.rs +73 -0
  262. data/core/src/services/alluxio/mod.rs +39 -0
  263. data/core/src/services/alluxio/writer.rs +74 -0
  264. data/core/src/services/azblob/backend.rs +594 -0
  265. data/core/src/services/azblob/config.rs +220 -0
  266. data/core/src/services/azblob/core.rs +937 -0
  267. data/core/src/services/azblob/delete.rs +108 -0
  268. data/core/src/services/azblob/docs.md +77 -0
  269. data/core/src/services/azblob/error.rs +164 -0
  270. data/core/src/services/azblob/lister.rs +107 -0
  271. data/core/src/services/azblob/mod.rs +38 -0
  272. data/core/src/services/azblob/writer.rs +177 -0
  273. data/core/src/services/azdls/backend.rs +435 -0
  274. data/core/src/services/azdls/config.rs +89 -0
  275. data/core/src/services/azdls/core.rs +388 -0
  276. data/core/src/services/azdls/delete.rs +48 -0
  277. data/core/src/services/azdls/docs.md +73 -0
  278. data/core/src/services/azdls/error.rs +107 -0
  279. data/core/src/services/azdls/lister.rs +165 -0
  280. data/core/src/services/azdls/mod.rs +38 -0
  281. data/core/src/services/azdls/writer.rs +129 -0
  282. data/core/src/services/azfile/backend.rs +373 -0
  283. data/core/src/services/azfile/config.rs +61 -0
  284. data/core/src/services/azfile/core.rs +435 -0
  285. data/core/src/services/azfile/delete.rs +51 -0
  286. data/core/src/services/azfile/docs.md +65 -0
  287. data/core/src/services/azfile/error.rs +108 -0
  288. data/core/src/services/azfile/lister.rs +217 -0
  289. data/core/src/services/azfile/mod.rs +39 -0
  290. data/core/src/services/azfile/writer.rs +92 -0
  291. data/core/src/services/b2/backend.rs +434 -0
  292. data/core/src/services/b2/config.rs +64 -0
  293. data/core/src/services/b2/core.rs +742 -0
  294. data/core/src/services/b2/delete.rs +56 -0
  295. data/core/src/services/b2/docs.md +54 -0
  296. data/core/src/services/b2/error.rs +132 -0
  297. data/core/src/services/b2/lister.rs +110 -0
  298. data/core/src/services/b2/mod.rs +39 -0
  299. data/core/src/services/b2/writer.rs +189 -0
  300. data/core/src/services/cacache/backend.rs +160 -0
  301. data/core/src/services/cacache/config.rs +28 -0
  302. data/core/src/services/cacache/core.rs +96 -0
  303. data/core/src/services/cacache/delete.rs +39 -0
  304. data/core/src/services/cacache/docs.md +38 -0
  305. data/core/src/services/cacache/mod.rs +34 -0
  306. data/core/src/services/cacache/writer.rs +61 -0
  307. data/core/src/services/cloudflare_kv/backend.rs +513 -0
  308. data/core/src/services/cloudflare_kv/config.rs +55 -0
  309. data/core/src/services/cloudflare_kv/core.rs +168 -0
  310. data/core/src/services/cloudflare_kv/delete.rs +119 -0
  311. data/core/src/services/cloudflare_kv/docs.md +21 -0
  312. data/core/src/services/cloudflare_kv/error.rs +79 -0
  313. data/core/src/services/cloudflare_kv/lister.rs +170 -0
  314. data/core/src/services/cloudflare_kv/mod.rs +39 -0
  315. data/core/src/services/cloudflare_kv/model.rs +76 -0
  316. data/core/src/services/cloudflare_kv/writer.rs +68 -0
  317. data/core/src/services/compfs/backend.rs +290 -0
  318. data/core/src/services/compfs/config.rs +30 -0
  319. data/core/src/services/compfs/core.rs +159 -0
  320. data/core/src/services/compfs/delete.rs +53 -0
  321. data/core/src/services/compfs/lister.rs +98 -0
  322. data/core/src/services/compfs/mod.rs +38 -0
  323. data/core/src/services/compfs/reader.rs +79 -0
  324. data/core/src/services/compfs/writer.rs +90 -0
  325. data/core/src/services/cos/backend.rs +442 -0
  326. data/core/src/services/cos/config.rs +54 -0
  327. data/core/src/services/cos/core.rs +761 -0
  328. data/core/src/services/cos/delete.rs +48 -0
  329. data/core/src/services/cos/docs.md +55 -0
  330. data/core/src/services/cos/error.rs +105 -0
  331. data/core/src/services/cos/lister.rs +237 -0
  332. data/core/src/services/cos/mod.rs +39 -0
  333. data/core/src/services/cos/writer.rs +234 -0
  334. data/core/src/services/d1/backend.rs +330 -0
  335. data/core/src/services/d1/config.rs +55 -0
  336. data/core/src/services/d1/docs.md +48 -0
  337. data/core/src/services/d1/error.rs +79 -0
  338. data/core/src/services/d1/mod.rs +29 -0
  339. data/core/src/services/d1/model.rs +125 -0
  340. data/core/src/services/dashmap/backend.rs +203 -0
  341. data/core/src/services/dashmap/config.rs +37 -0
  342. data/core/src/services/dashmap/core.rs +61 -0
  343. data/core/src/services/dashmap/delete.rs +40 -0
  344. data/core/src/services/dashmap/docs.md +38 -0
  345. data/core/src/services/dashmap/lister.rs +63 -0
  346. data/core/src/services/dashmap/mod.rs +36 -0
  347. data/core/src/services/dashmap/writer.rs +87 -0
  348. data/core/src/services/dbfs/backend.rs +258 -0
  349. data/core/src/services/dbfs/config.rs +48 -0
  350. data/core/src/services/dbfs/core.rs +191 -0
  351. data/core/src/services/dbfs/delete.rs +49 -0
  352. data/core/src/services/dbfs/docs.md +57 -0
  353. data/core/src/services/dbfs/error.rs +74 -0
  354. data/core/src/services/dbfs/lister.rs +96 -0
  355. data/core/src/services/dbfs/mod.rs +38 -0
  356. data/core/src/services/dbfs/writer.rs +64 -0
  357. data/core/src/services/dropbox/backend.rs +187 -0
  358. data/core/src/services/dropbox/builder.rs +222 -0
  359. data/core/src/services/dropbox/config.rs +47 -0
  360. data/core/src/services/dropbox/core.rs +496 -0
  361. data/core/src/services/dropbox/delete.rs +54 -0
  362. data/core/src/services/dropbox/docs.md +64 -0
  363. data/core/src/services/dropbox/error.rs +85 -0
  364. data/core/src/services/dropbox/lister.rs +117 -0
  365. data/core/src/services/dropbox/mod.rs +40 -0
  366. data/core/src/services/dropbox/writer.rs +51 -0
  367. data/core/src/services/etcd/backend.rs +345 -0
  368. data/core/src/services/etcd/config.rs +86 -0
  369. data/core/src/services/etcd/core.rs +143 -0
  370. data/core/src/services/etcd/deleter.rs +41 -0
  371. data/core/src/services/etcd/docs.md +45 -0
  372. data/core/src/services/etcd/error.rs +26 -0
  373. data/core/src/services/etcd/lister.rs +79 -0
  374. data/core/src/services/etcd/mod.rs +36 -0
  375. data/core/src/services/etcd/writer.rs +61 -0
  376. data/core/src/services/foundationdb/backend.rs +171 -0
  377. data/core/src/services/foundationdb/config.rs +45 -0
  378. data/core/src/services/foundationdb/docs.md +42 -0
  379. data/core/src/services/foundationdb/mod.rs +24 -0
  380. data/core/src/services/fs/backend.rs +299 -0
  381. data/core/src/services/fs/config.rs +33 -0
  382. data/core/src/services/fs/core.rs +227 -0
  383. data/core/src/services/fs/delete.rs +53 -0
  384. data/core/src/services/fs/docs.md +49 -0
  385. data/core/src/services/fs/error.rs +31 -0
  386. data/core/src/services/fs/lister.rs +81 -0
  387. data/core/src/services/fs/mod.rs +40 -0
  388. data/core/src/services/fs/reader.rs +83 -0
  389. data/core/src/services/fs/writer.rs +212 -0
  390. data/core/src/services/ftp/backend.rs +388 -0
  391. data/core/src/services/ftp/config.rs +46 -0
  392. data/core/src/services/ftp/core.rs +136 -0
  393. data/core/src/services/ftp/delete.rs +62 -0
  394. data/core/src/services/ftp/docs.md +42 -0
  395. data/core/src/services/ftp/err.rs +47 -0
  396. data/core/src/services/ftp/lister.rs +72 -0
  397. data/core/src/services/ftp/mod.rs +41 -0
  398. data/core/src/services/ftp/reader.rs +84 -0
  399. data/core/src/services/ftp/writer.rs +122 -0
  400. data/core/src/services/gcs/backend.rs +499 -0
  401. data/core/src/services/gcs/config.rs +168 -0
  402. data/core/src/services/gcs/core.rs +1079 -0
  403. data/core/src/services/gcs/delete.rs +98 -0
  404. data/core/src/services/gcs/docs.md +76 -0
  405. data/core/src/services/gcs/error.rs +122 -0
  406. data/core/src/services/gcs/lister.rs +136 -0
  407. data/core/src/services/gcs/mod.rs +40 -0
  408. data/core/src/services/gcs/uri.rs +75 -0
  409. data/core/src/services/gcs/writer.rs +163 -0
  410. data/core/src/services/gdrive/backend.rs +176 -0
  411. data/core/src/services/gdrive/builder.rs +228 -0
  412. data/core/src/services/gdrive/config.rs +47 -0
  413. data/core/src/services/gdrive/core.rs +499 -0
  414. data/core/src/services/gdrive/delete.rs +57 -0
  415. data/core/src/services/gdrive/docs.md +65 -0
  416. data/core/src/services/gdrive/error.rs +80 -0
  417. data/core/src/services/gdrive/lister.rs +110 -0
  418. data/core/src/services/gdrive/mod.rs +40 -0
  419. data/core/src/services/gdrive/writer.rs +77 -0
  420. data/core/src/services/ghac/backend.rs +285 -0
  421. data/core/src/services/ghac/config.rs +36 -0
  422. data/core/src/services/ghac/core.rs +459 -0
  423. data/core/src/services/ghac/docs.md +84 -0
  424. data/core/src/services/ghac/error.rs +52 -0
  425. data/core/src/services/ghac/mod.rs +35 -0
  426. data/core/src/services/ghac/writer.rs +201 -0
  427. data/core/src/services/github/backend.rs +285 -0
  428. data/core/src/services/github/config.rs +59 -0
  429. data/core/src/services/github/core.rs +351 -0
  430. data/core/src/services/github/delete.rs +41 -0
  431. data/core/src/services/github/docs.md +52 -0
  432. data/core/src/services/github/error.rs +101 -0
  433. data/core/src/services/github/lister.rs +112 -0
  434. data/core/src/services/github/mod.rs +38 -0
  435. data/core/src/services/github/writer.rs +51 -0
  436. data/core/src/services/gridfs/backend.rs +166 -0
  437. data/core/src/services/gridfs/config.rs +50 -0
  438. data/core/src/services/gridfs/core.rs +154 -0
  439. data/core/src/services/gridfs/docs.md +46 -0
  440. data/core/src/services/gridfs/mod.rs +26 -0
  441. data/core/src/services/hdfs/backend.rs +413 -0
  442. data/core/src/services/hdfs/config.rs +59 -0
  443. data/core/src/services/hdfs/delete.rs +62 -0
  444. data/core/src/services/hdfs/docs.md +140 -0
  445. data/core/src/services/hdfs/lister.rs +70 -0
  446. data/core/src/services/hdfs/mod.rs +36 -0
  447. data/core/src/services/hdfs/reader.rs +79 -0
  448. data/core/src/services/hdfs/writer.rs +104 -0
  449. data/core/src/services/hdfs_native/backend.rs +340 -0
  450. data/core/src/services/hdfs_native/config.rs +45 -0
  451. data/core/src/services/hdfs_native/delete.rs +47 -0
  452. data/core/src/services/hdfs_native/docs.md +35 -0
  453. data/core/src/services/hdfs_native/error.rs +59 -0
  454. data/core/src/services/hdfs_native/lister.rs +85 -0
  455. data/core/src/services/hdfs_native/mod.rs +39 -0
  456. data/core/src/services/hdfs_native/reader.rs +62 -0
  457. data/core/src/services/hdfs_native/writer.rs +61 -0
  458. data/core/src/services/http/backend.rs +291 -0
  459. data/core/src/services/http/config.rs +49 -0
  460. data/core/src/services/http/core.rs +125 -0
  461. data/core/src/services/http/docs.md +45 -0
  462. data/core/src/services/http/error.rs +53 -0
  463. data/core/src/services/http/mod.rs +32 -0
  464. data/core/src/services/huggingface/backend.rs +289 -0
  465. data/core/src/services/huggingface/config.rs +75 -0
  466. data/core/src/services/huggingface/core.rs +406 -0
  467. data/core/src/services/huggingface/docs.md +61 -0
  468. data/core/src/services/huggingface/error.rs +93 -0
  469. data/core/src/services/huggingface/lister.rs +91 -0
  470. data/core/src/services/huggingface/mod.rs +34 -0
  471. data/core/src/services/ipfs/backend.rs +257 -0
  472. data/core/src/services/ipfs/config.rs +32 -0
  473. data/core/src/services/ipfs/core.rs +239 -0
  474. data/core/src/services/ipfs/docs.md +45 -0
  475. data/core/src/services/ipfs/error.rs +52 -0
  476. data/core/src/services/ipfs/ipld.rs +162 -0
  477. data/core/src/services/ipfs/mod.rs +34 -0
  478. data/core/src/services/ipmfs/backend.rs +147 -0
  479. data/core/src/services/ipmfs/builder.rs +166 -0
  480. data/core/src/services/ipmfs/config.rs +32 -0
  481. data/core/src/services/ipmfs/core.rs +142 -0
  482. data/core/src/services/ipmfs/delete.rs +48 -0
  483. data/core/src/services/ipmfs/docs.md +14 -0
  484. data/core/src/services/ipmfs/error.rs +83 -0
  485. data/core/src/services/ipmfs/lister.rs +135 -0
  486. data/core/src/services/ipmfs/mod.rs +40 -0
  487. data/core/src/services/ipmfs/writer.rs +49 -0
  488. data/core/src/services/koofr/backend.rs +361 -0
  489. data/core/src/services/koofr/config.rs +50 -0
  490. data/core/src/services/koofr/core.rs +458 -0
  491. data/core/src/services/koofr/delete.rs +50 -0
  492. data/core/src/services/koofr/docs.md +51 -0
  493. data/core/src/services/koofr/error.rs +72 -0
  494. data/core/src/services/koofr/lister.rs +88 -0
  495. data/core/src/services/koofr/mod.rs +38 -0
  496. data/core/src/services/koofr/writer.rs +53 -0
  497. data/core/src/services/lakefs/backend.rs +309 -0
  498. data/core/src/services/lakefs/config.rs +81 -0
  499. data/core/src/services/lakefs/core.rs +261 -0
  500. data/core/src/services/lakefs/delete.rs +54 -0
  501. data/core/src/services/lakefs/docs.md +62 -0
  502. data/core/src/services/lakefs/error.rs +93 -0
  503. data/core/src/services/lakefs/lister.rs +120 -0
  504. data/core/src/services/lakefs/mod.rs +38 -0
  505. data/core/src/services/lakefs/writer.rs +50 -0
  506. data/core/src/services/memcached/backend.rs +284 -0
  507. data/core/src/services/memcached/binary.rs +289 -0
  508. data/core/src/services/memcached/config.rs +43 -0
  509. data/core/src/services/memcached/docs.md +47 -0
  510. data/core/src/services/memcached/mod.rs +27 -0
  511. data/core/src/services/memory/backend.rs +205 -0
  512. data/core/src/services/memory/config.rs +30 -0
  513. data/core/src/services/memory/core.rs +80 -0
  514. data/core/src/services/memory/delete.rs +42 -0
  515. data/core/src/services/memory/docs.md +36 -0
  516. data/core/src/services/memory/lister.rs +56 -0
  517. data/core/src/services/memory/mod.rs +36 -0
  518. data/core/src/services/memory/writer.rs +85 -0
  519. data/core/src/services/mini_moka/backend.rs +260 -0
  520. data/core/src/services/mini_moka/config.rs +56 -0
  521. data/core/src/services/mini_moka/core.rs +52 -0
  522. data/core/src/services/mini_moka/delete.rs +42 -0
  523. data/core/src/services/mini_moka/docs.md +19 -0
  524. data/core/src/services/mini_moka/lister.rs +68 -0
  525. data/core/src/services/mini_moka/mod.rs +36 -0
  526. data/core/src/services/mini_moka/writer.rs +84 -0
  527. data/core/src/services/mod.rs +206 -0
  528. data/core/src/services/moka/backend.rs +326 -0
  529. data/core/src/services/moka/config.rs +59 -0
  530. data/core/src/services/moka/core.rs +62 -0
  531. data/core/src/services/moka/delete.rs +42 -0
  532. data/core/src/services/moka/docs.md +42 -0
  533. data/core/src/services/moka/lister.rs +65 -0
  534. data/core/src/services/moka/mod.rs +41 -0
  535. data/core/src/services/moka/writer.rs +83 -0
  536. data/core/src/services/mongodb/backend.rs +291 -0
  537. data/core/src/services/mongodb/config.rs +54 -0
  538. data/core/src/services/mongodb/docs.md +49 -0
  539. data/core/src/services/mongodb/mod.rs +24 -0
  540. data/core/src/services/monoiofs/backend.rs +238 -0
  541. data/core/src/services/monoiofs/config.rs +34 -0
  542. data/core/src/services/monoiofs/core.rs +313 -0
  543. data/core/src/services/monoiofs/delete.rs +64 -0
  544. data/core/src/services/monoiofs/docs.md +46 -0
  545. data/core/src/services/monoiofs/mod.rs +36 -0
  546. data/core/src/services/monoiofs/reader.rs +147 -0
  547. data/core/src/services/monoiofs/writer.rs +189 -0
  548. data/core/src/services/mysql/backend.rs +256 -0
  549. data/core/src/services/mysql/config.rs +66 -0
  550. data/core/src/services/mysql/docs.md +47 -0
  551. data/core/src/services/mysql/mod.rs +24 -0
  552. data/core/src/services/obs/backend.rs +442 -0
  553. data/core/src/services/obs/config.rs +53 -0
  554. data/core/src/services/obs/core.rs +608 -0
  555. data/core/src/services/obs/delete.rs +48 -0
  556. data/core/src/services/obs/docs.md +54 -0
  557. data/core/src/services/obs/error.rs +106 -0
  558. data/core/src/services/obs/lister.rs +101 -0
  559. data/core/src/services/obs/mod.rs +38 -0
  560. data/core/src/services/obs/writer.rs +235 -0
  561. data/core/src/services/onedrive/backend.rs +127 -0
  562. data/core/src/services/onedrive/builder.rs +236 -0
  563. data/core/src/services/onedrive/config.rs +49 -0
  564. data/core/src/services/onedrive/core.rs +691 -0
  565. data/core/src/services/onedrive/delete.rs +47 -0
  566. data/core/src/services/onedrive/docs.md +115 -0
  567. data/core/src/services/onedrive/error.rs +61 -0
  568. data/core/src/services/onedrive/graph_model.rs +425 -0
  569. data/core/src/services/onedrive/lister.rs +150 -0
  570. data/core/src/services/onedrive/mod.rs +42 -0
  571. data/core/src/services/onedrive/writer.rs +168 -0
  572. data/core/src/services/opfs/backend.rs +50 -0
  573. data/core/src/services/opfs/config.rs +25 -0
  574. data/core/src/services/opfs/core.rs +74 -0
  575. data/core/src/services/opfs/docs.md +18 -0
  576. data/core/src/services/opfs/error.rs +27 -0
  577. data/core/src/services/opfs/mod.rs +30 -0
  578. data/core/src/services/opfs/utils.rs +70 -0
  579. data/core/src/services/oss/backend.rs +734 -0
  580. data/core/src/services/oss/config.rs +113 -0
  581. data/core/src/services/oss/core.rs +1088 -0
  582. data/core/src/services/oss/delete.rs +109 -0
  583. data/core/src/services/oss/docs.md +74 -0
  584. data/core/src/services/oss/error.rs +109 -0
  585. data/core/src/services/oss/lister.rs +256 -0
  586. data/core/src/services/oss/mod.rs +38 -0
  587. data/core/src/services/oss/writer.rs +228 -0
  588. data/core/src/services/pcloud/backend.rs +358 -0
  589. data/core/src/services/pcloud/config.rs +51 -0
  590. data/core/src/services/pcloud/core.rs +461 -0
  591. data/core/src/services/pcloud/delete.rs +66 -0
  592. data/core/src/services/pcloud/docs.md +51 -0
  593. data/core/src/services/pcloud/error.rs +88 -0
  594. data/core/src/services/pcloud/lister.rs +95 -0
  595. data/core/src/services/pcloud/mod.rs +38 -0
  596. data/core/src/services/pcloud/writer.rs +66 -0
  597. data/core/src/services/persy/backend.rs +226 -0
  598. data/core/src/services/persy/config.rs +32 -0
  599. data/core/src/services/persy/docs.md +43 -0
  600. data/core/src/services/persy/mod.rs +24 -0
  601. data/core/src/services/postgresql/backend.rs +258 -0
  602. data/core/src/services/postgresql/config.rs +66 -0
  603. data/core/src/services/postgresql/docs.md +47 -0
  604. data/core/src/services/postgresql/mod.rs +24 -0
  605. data/core/src/services/redb/backend.rs +280 -0
  606. data/core/src/services/redb/config.rs +34 -0
  607. data/core/src/services/redb/docs.md +41 -0
  608. data/core/src/services/redb/mod.rs +24 -0
  609. data/core/src/services/redis/backend.rs +442 -0
  610. data/core/src/services/redis/config.rs +79 -0
  611. data/core/src/services/redis/core.rs +209 -0
  612. data/core/src/services/redis/delete.rs +40 -0
  613. data/core/src/services/redis/docs.md +43 -0
  614. data/core/src/services/redis/mod.rs +34 -0
  615. data/core/src/services/redis/writer.rs +57 -0
  616. data/core/src/services/rocksdb/backend.rs +159 -0
  617. data/core/src/services/rocksdb/config.rs +34 -0
  618. data/core/src/services/rocksdb/docs.md +54 -0
  619. data/core/src/services/rocksdb/mod.rs +24 -0
  620. data/core/src/services/s3/backend.rs +1293 -0
  621. data/core/src/services/s3/compatible_services.md +126 -0
  622. data/core/src/services/s3/config.rs +327 -0
  623. data/core/src/services/s3/core.rs +1741 -0
  624. data/core/src/services/s3/delete.rs +109 -0
  625. data/core/src/services/s3/docs.md +244 -0
  626. data/core/src/services/s3/error.rs +171 -0
  627. data/core/src/services/s3/lister.rs +405 -0
  628. data/core/src/services/s3/mod.rs +38 -0
  629. data/core/src/services/s3/writer.rs +262 -0
  630. data/core/src/services/seafile/backend.rs +297 -0
  631. data/core/src/services/seafile/config.rs +56 -0
  632. data/core/src/services/seafile/core.rs +475 -0
  633. data/core/src/services/seafile/delete.rs +40 -0
  634. data/core/src/services/seafile/docs.md +54 -0
  635. data/core/src/services/seafile/error.rs +86 -0
  636. data/core/src/services/seafile/lister.rs +83 -0
  637. data/core/src/services/seafile/mod.rs +38 -0
  638. data/core/src/services/seafile/writer.rs +55 -0
  639. data/core/src/services/sftp/backend.rs +397 -0
  640. data/core/src/services/sftp/config.rs +50 -0
  641. data/core/src/services/sftp/core.rs +154 -0
  642. data/core/src/services/sftp/delete.rs +55 -0
  643. data/core/src/services/sftp/docs.md +49 -0
  644. data/core/src/services/sftp/error.rs +57 -0
  645. data/core/src/services/sftp/lister.rs +88 -0
  646. data/core/src/services/sftp/mod.rs +42 -0
  647. data/core/src/services/sftp/reader.rs +78 -0
  648. data/core/src/services/sftp/utils.rs +51 -0
  649. data/core/src/services/sftp/writer.rs +67 -0
  650. data/core/src/services/sled/backend.rs +194 -0
  651. data/core/src/services/sled/config.rs +45 -0
  652. data/core/src/services/sled/docs.md +39 -0
  653. data/core/src/services/sled/mod.rs +24 -0
  654. data/core/src/services/sqlite/backend.rs +326 -0
  655. data/core/src/services/sqlite/config.rs +70 -0
  656. data/core/src/services/sqlite/docs.md +46 -0
  657. data/core/src/services/sqlite/mod.rs +24 -0
  658. data/core/src/services/surrealdb/backend.rs +365 -0
  659. data/core/src/services/surrealdb/config.rs +64 -0
  660. data/core/src/services/surrealdb/docs.md +54 -0
  661. data/core/src/services/surrealdb/mod.rs +24 -0
  662. data/core/src/services/swift/backend.rs +275 -0
  663. data/core/src/services/swift/compatible_services.md +53 -0
  664. data/core/src/services/swift/config.rs +53 -0
  665. data/core/src/services/swift/core.rs +310 -0
  666. data/core/src/services/swift/delete.rs +49 -0
  667. data/core/src/services/swift/docs.md +52 -0
  668. data/core/src/services/swift/error.rs +90 -0
  669. data/core/src/services/swift/lister.rs +119 -0
  670. data/core/src/services/swift/mod.rs +38 -0
  671. data/core/src/services/swift/writer.rs +53 -0
  672. data/core/src/services/tikv/backend.rs +237 -0
  673. data/core/src/services/tikv/config.rs +52 -0
  674. data/core/src/services/tikv/docs.md +43 -0
  675. data/core/src/services/tikv/mod.rs +24 -0
  676. data/core/src/services/upyun/backend.rs +317 -0
  677. data/core/src/services/upyun/config.rs +51 -0
  678. data/core/src/services/upyun/core.rs +521 -0
  679. data/core/src/services/upyun/delete.rs +50 -0
  680. data/core/src/services/upyun/docs.md +51 -0
  681. data/core/src/services/upyun/error.rs +97 -0
  682. data/core/src/services/upyun/lister.rs +101 -0
  683. data/core/src/services/upyun/mod.rs +38 -0
  684. data/core/src/services/upyun/writer.rs +127 -0
  685. data/core/src/services/vercel_artifacts/backend.rs +99 -0
  686. data/core/src/services/vercel_artifacts/builder.rs +117 -0
  687. data/core/src/services/vercel_artifacts/config.rs +39 -0
  688. data/core/src/services/vercel_artifacts/core.rs +112 -0
  689. data/core/src/services/vercel_artifacts/docs.md +40 -0
  690. data/core/src/services/vercel_artifacts/error.rs +50 -0
  691. data/core/src/services/vercel_artifacts/mod.rs +36 -0
  692. data/core/src/services/vercel_artifacts/writer.rs +58 -0
  693. data/core/src/services/vercel_blob/backend.rs +251 -0
  694. data/core/src/services/vercel_blob/config.rs +45 -0
  695. data/core/src/services/vercel_blob/core.rs +449 -0
  696. data/core/src/services/vercel_blob/delete.rs +38 -0
  697. data/core/src/services/vercel_blob/docs.md +45 -0
  698. data/core/src/services/vercel_blob/error.rs +110 -0
  699. data/core/src/services/vercel_blob/lister.rs +69 -0
  700. data/core/src/services/vercel_blob/mod.rs +38 -0
  701. data/core/src/services/vercel_blob/writer.rs +143 -0
  702. data/core/src/services/webdav/backend.rs +318 -0
  703. data/core/src/services/webdav/config.rs +53 -0
  704. data/core/src/services/webdav/core.rs +859 -0
  705. data/core/src/services/webdav/delete.rs +47 -0
  706. data/core/src/services/webdav/docs.md +49 -0
  707. data/core/src/services/webdav/error.rs +53 -0
  708. data/core/src/services/webdav/lister.rs +106 -0
  709. data/core/src/services/webdav/mod.rs +38 -0
  710. data/core/src/services/webdav/writer.rs +56 -0
  711. data/core/src/services/webhdfs/backend.rs +376 -0
  712. data/core/src/services/webhdfs/config.rs +52 -0
  713. data/core/src/services/webhdfs/core.rs +398 -0
  714. data/core/src/services/webhdfs/delete.rs +46 -0
  715. data/core/src/services/webhdfs/docs.md +90 -0
  716. data/core/src/services/webhdfs/error.rs +126 -0
  717. data/core/src/services/webhdfs/lister.rs +130 -0
  718. data/core/src/services/webhdfs/message.rs +249 -0
  719. data/core/src/services/webhdfs/mod.rs +41 -0
  720. data/core/src/services/webhdfs/writer.rs +177 -0
  721. data/core/src/services/yandex_disk/backend.rs +267 -0
  722. data/core/src/services/yandex_disk/config.rs +45 -0
  723. data/core/src/services/yandex_disk/core.rs +340 -0
  724. data/core/src/services/yandex_disk/delete.rs +54 -0
  725. data/core/src/services/yandex_disk/docs.md +45 -0
  726. data/core/src/services/yandex_disk/error.rs +104 -0
  727. data/core/src/services/yandex_disk/lister.rs +113 -0
  728. data/core/src/services/yandex_disk/mod.rs +38 -0
  729. data/core/src/services/yandex_disk/writer.rs +52 -0
  730. data/core/src/types/buffer.rs +991 -0
  731. data/core/src/types/builder.rs +152 -0
  732. data/core/src/types/capability.rs +209 -0
  733. data/core/src/types/context/mod.rs +22 -0
  734. data/core/src/types/context/read.rs +231 -0
  735. data/core/src/types/context/write.rs +441 -0
  736. data/core/src/types/delete/deleter.rs +220 -0
  737. data/core/src/types/delete/futures_delete_sink.rs +176 -0
  738. data/core/src/types/delete/input.rs +97 -0
  739. data/core/src/types/delete/mod.rs +26 -0
  740. data/core/src/types/entry.rs +69 -0
  741. data/core/src/types/error.rs +570 -0
  742. data/core/src/types/execute/api.rs +110 -0
  743. data/core/src/types/execute/executor.rs +96 -0
  744. data/core/src/types/execute/executors/mod.rs +27 -0
  745. data/core/src/types/execute/executors/tokio_executor.rs +60 -0
  746. data/core/src/types/execute/mod.rs +25 -0
  747. data/core/src/types/list.rs +137 -0
  748. data/core/src/types/metadata.rs +436 -0
  749. data/core/src/types/mod.rs +72 -0
  750. data/core/src/types/mode.rs +68 -0
  751. data/core/src/types/operator/builder.rs +535 -0
  752. data/core/src/types/operator/info.rs +63 -0
  753. data/core/src/types/operator/mod.rs +33 -0
  754. data/core/src/types/operator/operator.rs +2236 -0
  755. data/core/src/types/operator/operator_futures.rs +1430 -0
  756. data/core/src/types/operator/registry.rs +129 -0
  757. data/core/src/types/options.rs +548 -0
  758. data/core/src/types/read/buffer_stream.rs +273 -0
  759. data/core/src/types/read/futures_async_reader.rs +289 -0
  760. data/core/src/types/read/futures_bytes_stream.rs +157 -0
  761. data/core/src/types/read/mod.rs +29 -0
  762. data/core/src/types/read/reader.rs +604 -0
  763. data/core/src/types/scheme.rs +475 -0
  764. data/core/src/types/write/buffer_sink.rs +188 -0
  765. data/core/src/types/write/futures_async_writer.rs +136 -0
  766. data/core/src/types/write/futures_bytes_sink.rs +103 -0
  767. data/core/src/types/write/mod.rs +26 -0
  768. data/core/src/types/write/writer.rs +411 -0
  769. data/core/tests/behavior/README.md +77 -0
  770. data/core/tests/behavior/async_copy.rs +314 -0
  771. data/core/tests/behavior/async_create_dir.rs +53 -0
  772. data/core/tests/behavior/async_delete.rs +354 -0
  773. data/core/tests/behavior/async_list.rs +739 -0
  774. data/core/tests/behavior/async_presign.rs +175 -0
  775. data/core/tests/behavior/async_read.rs +871 -0
  776. data/core/tests/behavior/async_rename.rs +210 -0
  777. data/core/tests/behavior/async_stat.rs +628 -0
  778. data/core/tests/behavior/async_write.rs +819 -0
  779. data/core/tests/behavior/main.rs +78 -0
  780. data/core/tests/behavior/utils.rs +187 -0
  781. data/core/tests/data/normal_dir/.gitkeep +0 -0
  782. data/core/tests/data/normal_file.txt +1041 -0
  783. data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
  784. data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
  785. data/core/users.md +13 -0
  786. data/extconf.rb +24 -0
  787. data/lib/opendal.rb +25 -0
  788. data/lib/opendal_ruby/entry.rb +35 -0
  789. data/lib/opendal_ruby/io.rb +70 -0
  790. data/lib/opendal_ruby/metadata.rb +44 -0
  791. data/lib/opendal_ruby/operator.rb +29 -0
  792. data/lib/opendal_ruby/operator_info.rb +26 -0
  793. data/src/capability.rs +146 -0
  794. data/src/io.rs +464 -0
  795. data/src/lib.rs +63 -0
  796. data/src/lister.rs +141 -0
  797. data/src/metadata.rs +111 -0
  798. data/src/middlewares.rs +174 -0
  799. data/src/operator.rs +310 -0
  800. data/src/operator_info.rs +83 -0
  801. data/test/blocking_op_test.rb +112 -0
  802. data/test/capability_test.rb +42 -0
  803. data/test/io_test.rb +172 -0
  804. data/test/lister_test.rb +77 -0
  805. data/test/metadata_test.rb +78 -0
  806. data/test/middlewares_test.rb +46 -0
  807. data/test/operator_info_test.rb +35 -0
  808. data/test/test_helper.rb +36 -0
  809. metadata +857 -0
@@ -0,0 +1,936 @@
1
+ // Licensed to the Apache Software Foundation (ASF) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The ASF licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ use std::fmt::Debug;
19
+ use std::fmt::Formatter;
20
+ use std::pin::Pin;
21
+ use std::sync::Arc;
22
+ use std::task::ready;
23
+ use std::task::Context;
24
+ use std::task::Poll;
25
+ use std::time::Duration;
26
+ use std::time::Instant;
27
+
28
+ use futures::Stream;
29
+ use futures::StreamExt;
30
+ use http::StatusCode;
31
+
32
+ use crate::raw::*;
33
+ use crate::*;
34
+
35
+ const KIB: f64 = 1024.0;
36
+ const MIB: f64 = 1024.0 * KIB;
37
+ const GIB: f64 = 1024.0 * MIB;
38
+
39
+ /// Buckets for data size metrics like OperationBytes
40
+ /// Covers typical file and object sizes from small files to large objects
41
+ pub const DEFAULT_BYTES_BUCKETS: &[f64] = &[
42
+ 4.0 * KIB, // Small files
43
+ 64.0 * KIB, // File system block size
44
+ 256.0 * KIB, //
45
+ 1.0 * MIB, // Common size threshold for many systems
46
+ 4.0 * MIB, // Best size for most http based systems
47
+ 16.0 * MIB, //
48
+ 64.0 * MIB, // Widely used threshold for multipart uploads
49
+ 256.0 * MIB, //
50
+ 1.0 * GIB, // Considered large for many systems
51
+ 5.0 * GIB, // Maximum size in single upload for many cloud storage services
52
+ ];
53
+
54
+ /// Buckets for data transfer rate metrics like OperationBytesRate
55
+ ///
56
+ /// Covers various network speeds from slow connections to high-speed transfers
57
+ ///
58
+ /// Note: this is for single operation rate, not for total bandwidth.
59
+ pub const DEFAULT_BYTES_RATE_BUCKETS: &[f64] = &[
60
+ // Low-speed network range (mobile/weak connections)
61
+ 8.0 * KIB, // ~64Kbps - 2G networks
62
+ 32.0 * KIB, // ~256Kbps - 3G networks
63
+ 128.0 * KIB, // ~1Mbps - Basic broadband
64
+ // Standard broadband range
65
+ 1.0 * MIB, // ~8Mbps - Entry-level broadband
66
+ 8.0 * MIB, // ~64Mbps - Fast broadband
67
+ 32.0 * MIB, // ~256Mbps - Gigabit broadband
68
+ // High-performance network range
69
+ 128.0 * MIB, // ~1Gbps - Standard datacenter
70
+ 512.0 * MIB, // ~4Gbps - Fast datacenter
71
+ 2.0 * GIB, // ~16Gbps - High-end interconnects
72
+ // Ultra-high-speed range
73
+ 8.0 * GIB, // ~64Gbps - InfiniBand/RDMA
74
+ 32.0 * GIB, // ~256Gbps - Top-tier datacenters
75
+ ];
76
+
77
+ /// Buckets for batch operation entry counts (OperationEntriesCount)
78
+ /// Covers scenarios from single entry operations to large batch operations
79
+ pub const DEFAULT_ENTRIES_BUCKETS: &[f64] = &[
80
+ 1.0, // Single item operations
81
+ 5.0, // Very small batches
82
+ 10.0, // Small batches
83
+ 50.0, // Medium batches
84
+ 100.0, // Standard batch size
85
+ 500.0, // Large batches
86
+ 1000.0, // Very large batches, API limits for some services
87
+ 5000.0, // Huge batches, multi-page operations
88
+ 10000.0, // Extremely large operations, multi-request batches
89
+ ];
90
+
91
+ /// Buckets for batch operation processing rates (OperationEntriesRate)
92
+ /// Measures how many entries can be processed per second
93
+ pub const DEFAULT_ENTRIES_RATE_BUCKETS: &[f64] = &[
94
+ 1.0, // Slowest processing, heavy operations per entry
95
+ 10.0, // Slow processing, complex operations
96
+ 50.0, // Moderate processing speed
97
+ 100.0, // Good processing speed, efficient operations
98
+ 500.0, // Fast processing, optimized operations
99
+ 1000.0, // Very fast processing, simple operations
100
+ 5000.0, // Extremely fast processing, bulk operations
101
+ 10000.0, // Maximum speed, listing operations, local systems
102
+ ];
103
+
104
+ /// Buckets for operation duration metrics like OperationDurationSeconds
105
+ /// Covers timeframes from fast metadata operations to long-running transfers
106
+ pub const DEFAULT_DURATION_SECONDS_BUCKETS: &[f64] = &[
107
+ 0.001, // 1ms - Fastest operations, cached responses
108
+ 0.01, // 10ms - Fast metadata operations, local operations
109
+ 0.05, // 50ms - Quick operations, nearby cloud resources
110
+ 0.1, // 100ms - Standard API response times, typical cloud latency
111
+ 0.25, // 250ms - Medium operations, small data transfers
112
+ 0.5, // 500ms - Medium-long operations, larger metadata operations
113
+ 1.0, // 1s - Long operations, small file transfers
114
+ 2.5, // 2.5s - Extended operations, medium file transfers
115
+ 5.0, // 5s - Long-running operations, large transfers
116
+ 10.0, // 10s - Very long operations, very large transfers
117
+ 30.0, // 30s - Extended operations, complex batch processes
118
+ 60.0, // 1min - Near timeout operations, extremely large transfers
119
+ ];
120
+
121
+ /// Buckets for time to first byte metrics like OperationTtfbSeconds
122
+ /// Focuses on initial response times, which are typically shorter than full operations
123
+ pub const DEFAULT_TTFB_BUCKETS: &[f64] = &[
124
+ 0.001, // 1ms - Cached or local resources
125
+ 0.01, // 10ms - Very fast responses, same region
126
+ 0.025, // 25ms - Fast responses, optimized configurations
127
+ 0.05, // 50ms - Good response times, standard configurations
128
+ 0.1, // 100ms - Average response times for cloud storage
129
+ 0.2, // 200ms - Slower responses, cross-region or throttled
130
+ 0.4, // 400ms - Poor response times, network congestion
131
+ 0.8, // 800ms - Very slow responses, potential issues
132
+ 1.6, // 1.6s - Problematic responses, retry territory
133
+ 3.2, // 3.2s - Critical latency issues, close to timeouts
134
+ ];
135
+
136
+ /// The metric label for the scheme like s3, fs, cos.
137
+ pub static LABEL_SCHEME: &str = "scheme";
138
+ /// The metric label for the namespace like bucket name in s3.
139
+ pub static LABEL_NAMESPACE: &str = "namespace";
140
+ /// The metric label for the root path.
141
+ pub static LABEL_ROOT: &str = "root";
142
+ /// The metric label for the operation like read, write, list.
143
+ pub static LABEL_OPERATION: &str = "operation";
144
+ /// The metric label for the error.
145
+ pub static LABEL_ERROR: &str = "error";
146
+ /// The metric label for the http code.
147
+ pub static LABEL_STATUS_CODE: &str = "status_code";
148
+
149
+ /// MetricLabels are the labels for the metrics.
150
+ #[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
151
+ pub struct MetricLabels {
152
+ /// The storage scheme identifier (e.g., "s3", "gcs", "azblob", "fs").
153
+ /// Used to differentiate between different storage backends.
154
+ pub scheme: &'static str,
155
+ /// The storage namespace (e.g., bucket name, container name).
156
+ /// Identifies the specific storage container being accessed.
157
+ pub namespace: Arc<str>,
158
+ /// The root path within the namespace that was configured.
159
+ /// Used to track operations within a specific path prefix.
160
+ pub root: Arc<str>,
161
+ /// The operation being performed (e.g., "read", "write", "list").
162
+ /// Identifies which API operation generated this metric.
163
+ pub operation: &'static str,
164
+ /// The specific error kind that occurred during an operation.
165
+ /// Only populated for `OperationErrorsTotal` metric.
166
+ /// Used to track frequency of specific error types.
167
+ pub error: Option<ErrorKind>,
168
+ /// The HTTP status code received in an error response.
169
+ /// Only populated for `HttpStatusErrorsTotal` metric.
170
+ /// Used to track frequency of specific HTTP error status codes.
171
+ pub status_code: Option<StatusCode>,
172
+ }
173
+
174
+ impl MetricLabels {
175
+ /// Create a new set of MetricLabels.
176
+ fn new(info: Arc<AccessorInfo>, op: &'static str) -> Self {
177
+ MetricLabels {
178
+ scheme: info.scheme(),
179
+ namespace: info.name(),
180
+ root: info.root(),
181
+ operation: op,
182
+ ..MetricLabels::default()
183
+ }
184
+ }
185
+
186
+ /// Add error to the metric labels.
187
+ fn with_error(mut self, err: ErrorKind) -> Self {
188
+ self.error = Some(err);
189
+ self
190
+ }
191
+
192
+ /// Add status code to the metric labels.
193
+ fn with_status_code(mut self, code: StatusCode) -> Self {
194
+ self.status_code = Some(code);
195
+ self
196
+ }
197
+ }
198
+
199
+ /// MetricValue is the value the opendal sends to the metrics impls.
200
+ ///
201
+ /// Metrics impls can be `prometheus_client`, `metrics` etc.
202
+ ///
203
+ /// Every metrics impls SHOULD implement observe over the MetricValue to make
204
+ /// sure they provide the consistent metrics for users.
205
+ #[non_exhaustive]
206
+ #[derive(Debug, Clone, Copy)]
207
+ pub enum MetricValue {
208
+ /// Record the size of data processed in bytes.
209
+ /// Metrics impl: Update a Histogram with the given byte count.
210
+ OperationBytes(u64),
211
+ /// Record the rate of data processing in bytes/second.
212
+ /// Metrics impl: Update a Histogram with the calculated rate value.
213
+ OperationBytesRate(f64),
214
+ /// Record the number of entries (files, objects, keys) processed.
215
+ /// Metrics impl: Update a Histogram with the entry count.
216
+ OperationEntries(u64),
217
+ /// Record the rate of entries processing in entries/second.
218
+ /// Metrics impl: Update a Histogram with the calculated rate value.
219
+ OperationEntriesRate(f64),
220
+ /// Record the total duration of an operation.
221
+ /// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
222
+ OperationDurationSeconds(Duration),
223
+ /// Increment the counter for operation errors.
224
+ /// Metrics impl: Increment a Counter by 1.
225
+ OperationErrorsTotal,
226
+ /// Update the current number of executing operations.
227
+ /// Metrics impl: Add the value (positive or negative) to a Gauge.
228
+ OperationExecuting(isize),
229
+ /// Record the time to first byte duration.
230
+ /// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
231
+ OperationTtfbSeconds(Duration),
232
+ /// Update the current number of executing HTTP requests.
233
+ /// Metrics impl: Add the value (positive or negative) to a Gauge.
234
+ HttpExecuting(isize),
235
+ /// Record the size of HTTP request body in bytes.
236
+ /// Metrics impl: Update a Histogram with the given byte count.
237
+ HttpRequestBytes(u64),
238
+ /// Record the rate of HTTP request data in bytes/second.
239
+ /// Metrics impl: Update a Histogram with the calculated rate value.
240
+ HttpRequestBytesRate(f64),
241
+ /// Record the duration of sending an HTTP request (until first byte received).
242
+ /// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
243
+ HttpRequestDurationSeconds(Duration),
244
+ /// Record the size of HTTP response body in bytes.
245
+ /// Metrics impl: Update a Histogram with the given byte count.
246
+ HttpResponseBytes(u64),
247
+ /// Record the rate of HTTP response data in bytes/second.
248
+ /// Metrics impl: Update a Histogram with the calculated rate value.
249
+ HttpResponseBytesRate(f64),
250
+ /// Record the duration of receiving an HTTP response (from first byte to last).
251
+ /// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
252
+ HttpResponseDurationSeconds(Duration),
253
+ /// Increment the counter for HTTP connection errors.
254
+ /// Metrics impl: Increment a Counter by 1.
255
+ HttpConnectionErrorsTotal,
256
+ /// Increment the counter for HTTP status errors (non-2xx responses).
257
+ /// Metrics impl: Increment a Counter by 1.
258
+ HttpStatusErrorsTotal,
259
+ }
260
+
261
+ impl MetricValue {
262
+ /// Returns the full metric name for this metric value.
263
+ pub fn name(&self) -> &'static str {
264
+ match self {
265
+ MetricValue::OperationBytes(_) => "opendal_operation_bytes",
266
+ MetricValue::OperationBytesRate(_) => "opendal_operation_bytes_rate",
267
+ MetricValue::OperationEntries(_) => "opendal_operation_entries",
268
+ MetricValue::OperationEntriesRate(_) => "opendal_operation_entries_rate",
269
+ MetricValue::OperationDurationSeconds(_) => "opendal_operation_duration_seconds",
270
+ MetricValue::OperationErrorsTotal => "opendal_operation_errors_total",
271
+ MetricValue::OperationExecuting(_) => "opendal_operation_executing",
272
+ MetricValue::OperationTtfbSeconds(_) => "opendal_operation_ttfb_seconds",
273
+
274
+ MetricValue::HttpConnectionErrorsTotal => "opendal_http_connection_errors_total",
275
+ MetricValue::HttpStatusErrorsTotal => "opendal_http_status_errors_total",
276
+ MetricValue::HttpExecuting(_) => "opendal_http_executing",
277
+ MetricValue::HttpRequestBytes(_) => "opendal_http_request_bytes",
278
+ MetricValue::HttpRequestBytesRate(_) => "opendal_http_request_bytes_rate",
279
+ MetricValue::HttpRequestDurationSeconds(_) => "opendal_http_request_duration_seconds",
280
+ MetricValue::HttpResponseBytes(_) => "opendal_http_response_bytes",
281
+ MetricValue::HttpResponseBytesRate(_) => "opendal_http_response_bytes_rate",
282
+ MetricValue::HttpResponseDurationSeconds(_) => "opendal_http_response_duration_seconds",
283
+ }
284
+ }
285
+
286
+ /// Returns the metric name along with unit for this metric value.
287
+ ///
288
+ /// # Notes
289
+ ///
290
+ /// This API is designed for the metrics impls that unit aware. They will handle the names by themselves like append `_total` for counters.
291
+ pub fn name_with_unit(&self) -> (&'static str, Option<&'static str>) {
292
+ match self {
293
+ MetricValue::OperationBytes(_) => ("opendal_operation", Some("bytes")),
294
+ MetricValue::OperationBytesRate(_) => ("opendal_operation_bytes_rate", None),
295
+ MetricValue::OperationEntries(_) => ("opendal_operation_entries", None),
296
+ MetricValue::OperationEntriesRate(_) => ("opendal_operation_entries_rate", None),
297
+ MetricValue::OperationDurationSeconds(_) => {
298
+ ("opendal_operation_duration", Some("seconds"))
299
+ }
300
+ MetricValue::OperationErrorsTotal => ("opendal_operation_errors", None),
301
+ MetricValue::OperationExecuting(_) => ("opendal_operation_executing", None),
302
+ MetricValue::OperationTtfbSeconds(_) => ("opendal_operation_ttfb", Some("seconds")),
303
+
304
+ MetricValue::HttpConnectionErrorsTotal => ("opendal_http_connection_errors", None),
305
+ MetricValue::HttpStatusErrorsTotal => ("opendal_http_status_errors", None),
306
+ MetricValue::HttpExecuting(_) => ("opendal_http_executing", None),
307
+ MetricValue::HttpRequestBytes(_) => ("opendal_http_request", Some("bytes")),
308
+ MetricValue::HttpRequestBytesRate(_) => ("opendal_http_request_bytes_rate", None),
309
+ MetricValue::HttpRequestDurationSeconds(_) => {
310
+ ("opendal_http_request_duration", Some("seconds"))
311
+ }
312
+ MetricValue::HttpResponseBytes(_) => ("opendal_http_response", Some("bytes")),
313
+ MetricValue::HttpResponseBytesRate(_) => ("opendal_http_response_bytes_rate", None),
314
+ MetricValue::HttpResponseDurationSeconds(_) => {
315
+ ("opendal_http_response_duration", Some("seconds"))
316
+ }
317
+ }
318
+ }
319
+
320
+ /// Returns the help text for this metric value.
321
+ pub fn help(&self) -> &'static str {
322
+ match self {
323
+ MetricValue::OperationBytes(_) => "Current operation size in bytes, represents the size of data being processed in the current operation",
324
+ MetricValue::OperationBytesRate(_) => "Histogram of data processing rates in bytes per second within individual operations",
325
+ MetricValue::OperationEntries(_) => "Current operation size in entries, represents the entries being processed in the current operation",
326
+ MetricValue::OperationEntriesRate(_) => "Histogram of entries processing rates in entries per second within individual operations",
327
+ MetricValue::OperationDurationSeconds(_) => "Duration of operations in seconds, measured from start to completion",
328
+ MetricValue::OperationErrorsTotal => "Total number of failed operations",
329
+ MetricValue::OperationExecuting(_) => "Number of operations currently being executed",
330
+ MetricValue::OperationTtfbSeconds(_) => "Time to first byte in seconds for operations",
331
+
332
+ MetricValue::HttpConnectionErrorsTotal => "Total number of HTTP requests that failed before receiving a response (DNS failures, connection refused, timeouts, TLS errors)",
333
+ MetricValue::HttpStatusErrorsTotal => "Total number of HTTP requests that received error status codes (non-2xx responses)",
334
+ MetricValue::HttpExecuting(_) => "Number of HTTP requests currently in flight from this client",
335
+ MetricValue::HttpRequestBytes(_) => "Histogram of HTTP request body sizes in bytes",
336
+ MetricValue::HttpRequestBytesRate(_) => "Histogram of HTTP request bytes per second rates",
337
+ MetricValue::HttpRequestDurationSeconds(_) => "Histogram of time durations in seconds spent sending HTTP requests, from first byte sent to receiving the first byte",
338
+ MetricValue::HttpResponseBytes(_) => "Histogram of HTTP response body sizes in bytes",
339
+ MetricValue::HttpResponseBytesRate(_) => "Histogram of HTTP response bytes per second rates",
340
+ MetricValue::HttpResponseDurationSeconds(_) => "Histogram of time durations in seconds spent receiving HTTP responses, from first byte received to last byte received",
341
+ }
342
+ }
343
+ }
344
+
345
+ /// The interceptor for metrics.
346
+ ///
347
+ /// All metrics related libs should implement this trait to observe opendal's internal operations.
348
+ pub trait MetricsIntercept: Debug + Clone + Send + Sync + Unpin + 'static {
349
+ /// Observe the metric value.
350
+ fn observe(&self, labels: MetricLabels, value: MetricValue) {
351
+ let _ = (labels, value);
352
+ }
353
+ }
354
+
355
+ /// The metrics layer for opendal.
356
+ #[derive(Clone, Debug)]
357
+ pub struct MetricsLayer<I: MetricsIntercept> {
358
+ interceptor: I,
359
+ }
360
+
361
+ impl<I: MetricsIntercept> MetricsLayer<I> {
362
+ /// Create a new metrics layer.
363
+ pub fn new(interceptor: I) -> Self {
364
+ Self { interceptor }
365
+ }
366
+ }
367
+
368
+ impl<A: Access, I: MetricsIntercept> Layer<A> for MetricsLayer<I> {
369
+ type LayeredAccess = MetricsAccessor<A, I>;
370
+
371
+ fn layer(&self, inner: A) -> Self::LayeredAccess {
372
+ let info = inner.info();
373
+
374
+ // Update http client with metrics http fetcher.
375
+ info.update_http_client(|client| {
376
+ HttpClient::with(MetricsHttpFetcher {
377
+ inner: client.into_inner(),
378
+ info: info.clone(),
379
+ interceptor: self.interceptor.clone(),
380
+ })
381
+ });
382
+
383
+ MetricsAccessor {
384
+ inner,
385
+ info,
386
+ interceptor: self.interceptor.clone(),
387
+ }
388
+ }
389
+ }
390
+
391
+ /// The metrics http fetcher for opendal.
392
+ pub struct MetricsHttpFetcher<I: MetricsIntercept> {
393
+ inner: HttpFetcher,
394
+ info: Arc<AccessorInfo>,
395
+ interceptor: I,
396
+ }
397
+
398
+ impl<I: MetricsIntercept> HttpFetch for MetricsHttpFetcher<I> {
399
+ async fn fetch(&self, req: http::Request<Buffer>) -> Result<http::Response<HttpBody>> {
400
+ let labels = MetricLabels::new(
401
+ self.info.clone(),
402
+ req.extensions()
403
+ .get::<Operation>()
404
+ .copied()
405
+ .map(Operation::into_static)
406
+ .unwrap_or("unknown"),
407
+ );
408
+
409
+ let start = Instant::now();
410
+ let req_size = req.body().len();
411
+
412
+ self.interceptor
413
+ .observe(labels.clone(), MetricValue::HttpExecuting(1));
414
+
415
+ let res = self.inner.fetch(req).await;
416
+ let req_duration = start.elapsed();
417
+
418
+ match res {
419
+ Err(err) => {
420
+ self.interceptor
421
+ .observe(labels.clone(), MetricValue::HttpExecuting(-1));
422
+ self.interceptor
423
+ .observe(labels, MetricValue::HttpConnectionErrorsTotal);
424
+ Err(err)
425
+ }
426
+ Ok(resp) if resp.status().is_client_error() && resp.status().is_server_error() => {
427
+ self.interceptor
428
+ .observe(labels.clone(), MetricValue::HttpExecuting(-1));
429
+ self.interceptor.observe(
430
+ labels.with_status_code(resp.status()),
431
+ MetricValue::HttpStatusErrorsTotal,
432
+ );
433
+ Ok(resp)
434
+ }
435
+ Ok(resp) => {
436
+ self.interceptor.observe(
437
+ labels.clone(),
438
+ MetricValue::HttpRequestBytes(req_size as u64),
439
+ );
440
+ self.interceptor.observe(
441
+ labels.clone(),
442
+ MetricValue::HttpRequestBytesRate(req_size as f64 / req_duration.as_secs_f64()),
443
+ );
444
+ self.interceptor.observe(
445
+ labels.clone(),
446
+ MetricValue::HttpRequestDurationSeconds(req_duration),
447
+ );
448
+
449
+ let (parts, body) = resp.into_parts();
450
+ let body = body.map_inner(|s| {
451
+ Box::new(MetricsStream {
452
+ inner: s,
453
+ interceptor: self.interceptor.clone(),
454
+ labels: labels.clone(),
455
+ size: 0,
456
+ start: Instant::now(),
457
+ })
458
+ });
459
+
460
+ Ok(http::Response::from_parts(parts, body))
461
+ }
462
+ }
463
+ }
464
+ }
465
+
466
+ pub struct MetricsStream<S, I> {
467
+ inner: S,
468
+ interceptor: I,
469
+
470
+ labels: MetricLabels,
471
+ size: u64,
472
+ start: Instant,
473
+ }
474
+
475
+ impl<S, I> Stream for MetricsStream<S, I>
476
+ where
477
+ S: Stream<Item = Result<Buffer>> + Unpin + 'static,
478
+ I: MetricsIntercept,
479
+ {
480
+ type Item = Result<Buffer>;
481
+
482
+ fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
483
+ match ready!(self.inner.poll_next_unpin(cx)) {
484
+ Some(Ok(bs)) => {
485
+ self.size += bs.len() as u64;
486
+ Poll::Ready(Some(Ok(bs)))
487
+ }
488
+ Some(Err(err)) => Poll::Ready(Some(Err(err))),
489
+ None => {
490
+ let resp_size = self.size;
491
+ let resp_duration = self.start.elapsed();
492
+
493
+ self.interceptor.observe(
494
+ self.labels.clone(),
495
+ MetricValue::HttpResponseBytes(resp_size),
496
+ );
497
+ self.interceptor.observe(
498
+ self.labels.clone(),
499
+ MetricValue::HttpResponseBytesRate(
500
+ resp_size as f64 / resp_duration.as_secs_f64(),
501
+ ),
502
+ );
503
+ self.interceptor.observe(
504
+ self.labels.clone(),
505
+ MetricValue::HttpResponseDurationSeconds(resp_duration),
506
+ );
507
+ self.interceptor
508
+ .observe(self.labels.clone(), MetricValue::HttpExecuting(-1));
509
+
510
+ Poll::Ready(None)
511
+ }
512
+ }
513
+ }
514
+ }
515
+
516
+ /// The metrics accessor for opendal.
517
+ pub struct MetricsAccessor<A: Access, I: MetricsIntercept> {
518
+ inner: A,
519
+ info: Arc<AccessorInfo>,
520
+ interceptor: I,
521
+ }
522
+
523
+ impl<A: Access, I: MetricsIntercept> Debug for MetricsAccessor<A, I> {
524
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
525
+ f.debug_struct("MetricsAccessor")
526
+ .field("inner", &self.inner)
527
+ .finish_non_exhaustive()
528
+ }
529
+ }
530
+
531
+ impl<A: Access, I: MetricsIntercept> LayeredAccess for MetricsAccessor<A, I> {
532
+ type Inner = A;
533
+ type Reader = MetricsWrapper<A::Reader, I>;
534
+ type Writer = MetricsWrapper<A::Writer, I>;
535
+ type Lister = MetricsWrapper<A::Lister, I>;
536
+ type Deleter = MetricsWrapper<A::Deleter, I>;
537
+
538
+ fn inner(&self) -> &Self::Inner {
539
+ &self.inner
540
+ }
541
+
542
+ async fn create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
543
+ let labels = MetricLabels::new(self.info.clone(), Operation::CreateDir.into_static());
544
+
545
+ let start = Instant::now();
546
+
547
+ self.interceptor
548
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
549
+
550
+ let res = self
551
+ .inner()
552
+ .create_dir(path, args)
553
+ .await
554
+ .inspect(|_| {
555
+ self.interceptor.observe(
556
+ labels.clone(),
557
+ MetricValue::OperationDurationSeconds(start.elapsed()),
558
+ );
559
+ })
560
+ .inspect_err(|err| {
561
+ self.interceptor.observe(
562
+ labels.clone().with_error(err.kind()),
563
+ MetricValue::OperationErrorsTotal,
564
+ );
565
+ });
566
+
567
+ self.interceptor
568
+ .observe(labels, MetricValue::OperationExecuting(-1));
569
+ res
570
+ }
571
+
572
+ async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
573
+ let labels = MetricLabels::new(self.info.clone(), Operation::Read.into_static());
574
+
575
+ let start = Instant::now();
576
+
577
+ self.interceptor
578
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
579
+
580
+ let (rp, reader) = self
581
+ .inner
582
+ .read(path, args)
583
+ .await
584
+ .inspect(|_| {
585
+ self.interceptor.observe(
586
+ labels.clone(),
587
+ MetricValue::OperationTtfbSeconds(start.elapsed()),
588
+ );
589
+ })
590
+ .inspect_err(|err| {
591
+ self.interceptor.observe(
592
+ labels.clone().with_error(err.kind()),
593
+ MetricValue::OperationErrorsTotal,
594
+ );
595
+ })?;
596
+
597
+ Ok((
598
+ rp,
599
+ MetricsWrapper::new(reader, self.interceptor.clone(), labels, start),
600
+ ))
601
+ }
602
+
603
+ async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
604
+ let labels = MetricLabels::new(self.info.clone(), Operation::Write.into_static());
605
+
606
+ let start = Instant::now();
607
+
608
+ self.interceptor
609
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
610
+
611
+ let (rp, writer) = self.inner.write(path, args).await.inspect_err(|err| {
612
+ self.interceptor.observe(
613
+ labels.clone().with_error(err.kind()),
614
+ MetricValue::OperationErrorsTotal,
615
+ );
616
+ })?;
617
+
618
+ Ok((
619
+ rp,
620
+ MetricsWrapper::new(writer, self.interceptor.clone(), labels, start),
621
+ ))
622
+ }
623
+
624
+ async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> {
625
+ let labels = MetricLabels::new(self.info.clone(), Operation::Copy.into_static());
626
+
627
+ let start = Instant::now();
628
+
629
+ self.interceptor
630
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
631
+
632
+ let res = self
633
+ .inner()
634
+ .copy(from, to, args)
635
+ .await
636
+ .inspect(|_| {
637
+ self.interceptor.observe(
638
+ labels.clone(),
639
+ MetricValue::OperationDurationSeconds(start.elapsed()),
640
+ );
641
+ })
642
+ .inspect_err(|err| {
643
+ self.interceptor.observe(
644
+ labels.clone().with_error(err.kind()),
645
+ MetricValue::OperationErrorsTotal,
646
+ );
647
+ });
648
+
649
+ self.interceptor
650
+ .observe(labels, MetricValue::OperationExecuting(-1));
651
+ res
652
+ }
653
+
654
+ async fn rename(&self, from: &str, to: &str, args: OpRename) -> Result<RpRename> {
655
+ let labels = MetricLabels::new(self.info.clone(), Operation::Rename.into_static());
656
+
657
+ let start = Instant::now();
658
+
659
+ self.interceptor
660
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
661
+
662
+ let res = self
663
+ .inner()
664
+ .rename(from, to, args)
665
+ .await
666
+ .inspect(|_| {
667
+ self.interceptor.observe(
668
+ labels.clone(),
669
+ MetricValue::OperationDurationSeconds(start.elapsed()),
670
+ );
671
+ })
672
+ .inspect_err(|err| {
673
+ self.interceptor.observe(
674
+ labels.clone().with_error(err.kind()),
675
+ MetricValue::OperationErrorsTotal,
676
+ );
677
+ });
678
+
679
+ self.interceptor
680
+ .observe(labels, MetricValue::OperationExecuting(-1));
681
+ res
682
+ }
683
+
684
+ async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
685
+ let labels = MetricLabels::new(self.info.clone(), Operation::Stat.into_static());
686
+
687
+ let start = Instant::now();
688
+
689
+ self.interceptor
690
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
691
+
692
+ let res = self
693
+ .inner()
694
+ .stat(path, args)
695
+ .await
696
+ .inspect(|_| {
697
+ self.interceptor.observe(
698
+ labels.clone(),
699
+ MetricValue::OperationDurationSeconds(start.elapsed()),
700
+ );
701
+ })
702
+ .inspect_err(|err| {
703
+ self.interceptor.observe(
704
+ labels.clone().with_error(err.kind()),
705
+ MetricValue::OperationErrorsTotal,
706
+ );
707
+ });
708
+
709
+ self.interceptor
710
+ .observe(labels, MetricValue::OperationExecuting(-1));
711
+ res
712
+ }
713
+
714
+ async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
715
+ let labels = MetricLabels::new(self.info.clone(), Operation::Delete.into_static());
716
+
717
+ let start = Instant::now();
718
+
719
+ self.interceptor
720
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
721
+
722
+ let (rp, deleter) = self.inner.delete().await.inspect_err(|err| {
723
+ self.interceptor.observe(
724
+ labels.clone().with_error(err.kind()),
725
+ MetricValue::OperationErrorsTotal,
726
+ );
727
+ })?;
728
+
729
+ Ok((
730
+ rp,
731
+ MetricsWrapper::new(deleter, self.interceptor.clone(), labels, start),
732
+ ))
733
+ }
734
+
735
+ async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
736
+ let labels = MetricLabels::new(self.info.clone(), Operation::List.into_static());
737
+
738
+ let start = Instant::now();
739
+
740
+ self.interceptor
741
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
742
+
743
+ let (rp, lister) = self.inner.list(path, args).await.inspect_err(|err| {
744
+ self.interceptor.observe(
745
+ labels.clone().with_error(err.kind()),
746
+ MetricValue::OperationErrorsTotal,
747
+ );
748
+ })?;
749
+
750
+ Ok((
751
+ rp,
752
+ MetricsWrapper::new(lister, self.interceptor.clone(), labels, start),
753
+ ))
754
+ }
755
+
756
+ async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
757
+ let labels = MetricLabels::new(self.info.clone(), Operation::Presign.into_static());
758
+
759
+ let start = Instant::now();
760
+
761
+ self.interceptor
762
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
763
+
764
+ let res = self
765
+ .inner()
766
+ .presign(path, args)
767
+ .await
768
+ .inspect(|_| {
769
+ self.interceptor.observe(
770
+ labels.clone(),
771
+ MetricValue::OperationDurationSeconds(start.elapsed()),
772
+ );
773
+ })
774
+ .inspect_err(|err| {
775
+ self.interceptor.observe(
776
+ labels.clone().with_error(err.kind()),
777
+ MetricValue::OperationErrorsTotal,
778
+ );
779
+ });
780
+
781
+ self.interceptor
782
+ .observe(labels, MetricValue::OperationExecuting(-1));
783
+ res
784
+ }
785
+ }
786
+
787
+ pub struct MetricsWrapper<R, I: MetricsIntercept> {
788
+ inner: R,
789
+ interceptor: I,
790
+ labels: MetricLabels,
791
+
792
+ start: Instant,
793
+ size: u64,
794
+ }
795
+
796
+ impl<R, I: MetricsIntercept> Drop for MetricsWrapper<R, I> {
797
+ fn drop(&mut self) {
798
+ let size = self.size;
799
+ let duration = self.start.elapsed();
800
+
801
+ if self.labels.operation == Operation::Read.into_static()
802
+ || self.labels.operation == Operation::Write.into_static()
803
+ {
804
+ self.interceptor
805
+ .observe(self.labels.clone(), MetricValue::OperationBytes(self.size));
806
+ self.interceptor.observe(
807
+ self.labels.clone(),
808
+ MetricValue::OperationBytesRate(size as f64 / duration.as_secs_f64()),
809
+ );
810
+ } else {
811
+ self.interceptor.observe(
812
+ self.labels.clone(),
813
+ MetricValue::OperationEntries(self.size),
814
+ );
815
+ self.interceptor.observe(
816
+ self.labels.clone(),
817
+ MetricValue::OperationEntriesRate(size as f64 / duration.as_secs_f64()),
818
+ );
819
+ }
820
+
821
+ self.interceptor.observe(
822
+ self.labels.clone(),
823
+ MetricValue::OperationDurationSeconds(duration),
824
+ );
825
+ self.interceptor
826
+ .observe(self.labels.clone(), MetricValue::OperationExecuting(-1));
827
+ }
828
+ }
829
+
830
+ impl<R, I: MetricsIntercept> MetricsWrapper<R, I> {
831
+ fn new(inner: R, interceptor: I, labels: MetricLabels, start: Instant) -> Self {
832
+ Self {
833
+ inner,
834
+ interceptor,
835
+ labels,
836
+ start,
837
+ size: 0,
838
+ }
839
+ }
840
+ }
841
+
842
+ impl<R: oio::Read, I: MetricsIntercept> oio::Read for MetricsWrapper<R, I> {
843
+ async fn read(&mut self) -> Result<Buffer> {
844
+ self.inner
845
+ .read()
846
+ .await
847
+ .inspect(|bs| {
848
+ self.size += bs.len() as u64;
849
+ })
850
+ .inspect_err(|err| {
851
+ self.interceptor.observe(
852
+ self.labels.clone().with_error(err.kind()),
853
+ MetricValue::OperationErrorsTotal,
854
+ );
855
+ })
856
+ }
857
+ }
858
+
859
+ impl<R: oio::Write, I: MetricsIntercept> oio::Write for MetricsWrapper<R, I> {
860
+ async fn write(&mut self, bs: Buffer) -> Result<()> {
861
+ let size = bs.len();
862
+
863
+ self.inner
864
+ .write(bs)
865
+ .await
866
+ .inspect(|_| {
867
+ self.size += size as u64;
868
+ })
869
+ .inspect_err(|err| {
870
+ self.interceptor.observe(
871
+ self.labels.clone().with_error(err.kind()),
872
+ MetricValue::OperationErrorsTotal,
873
+ );
874
+ })
875
+ }
876
+
877
+ async fn close(&mut self) -> Result<Metadata> {
878
+ self.inner.close().await.inspect_err(|err| {
879
+ self.interceptor.observe(
880
+ self.labels.clone().with_error(err.kind()),
881
+ MetricValue::OperationErrorsTotal,
882
+ );
883
+ })
884
+ }
885
+
886
+ async fn abort(&mut self) -> Result<()> {
887
+ self.inner.abort().await.inspect_err(|err| {
888
+ self.interceptor.observe(
889
+ self.labels.clone().with_error(err.kind()),
890
+ MetricValue::OperationErrorsTotal,
891
+ );
892
+ })
893
+ }
894
+ }
895
+
896
+ impl<R: oio::List, I: MetricsIntercept> oio::List for MetricsWrapper<R, I> {
897
+ async fn next(&mut self) -> Result<Option<oio::Entry>> {
898
+ self.inner
899
+ .next()
900
+ .await
901
+ .inspect(|_| {
902
+ self.size += 1;
903
+ })
904
+ .inspect_err(|err| {
905
+ self.interceptor.observe(
906
+ self.labels.clone().with_error(err.kind()),
907
+ MetricValue::OperationErrorsTotal,
908
+ );
909
+ })
910
+ }
911
+ }
912
+
913
+ impl<R: oio::Delete, I: MetricsIntercept> oio::Delete for MetricsWrapper<R, I> {
914
+ fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
915
+ self.inner
916
+ .delete(path, args)
917
+ .inspect(|_| {
918
+ self.size += 1;
919
+ })
920
+ .inspect_err(|err| {
921
+ self.interceptor.observe(
922
+ self.labels.clone().with_error(err.kind()),
923
+ MetricValue::OperationErrorsTotal,
924
+ );
925
+ })
926
+ }
927
+
928
+ async fn flush(&mut self) -> Result<usize> {
929
+ self.inner.flush().await.inspect_err(|err| {
930
+ self.interceptor.observe(
931
+ self.labels.clone().with_error(err.kind()),
932
+ MetricValue::OperationErrorsTotal,
933
+ );
934
+ })
935
+ }
936
+ }