opendal 0.1.9 → 0.1.11

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 (566) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +89 -56
  3. data/Cargo.toml +1 -1
  4. data/DEPENDENCIES.rust.tsv +55 -41
  5. data/LICENSE +201 -0
  6. data/LICENSE-MPL-2.0.txt +373 -0
  7. data/NOTICE +5 -0
  8. data/core/CHANGELOG.md +175 -0
  9. data/core/Cargo.lock +225 -298
  10. data/core/Cargo.toml +100 -94
  11. data/core/DEPENDENCIES.rust.tsv +44 -73
  12. data/core/benches/metadata/README.md +21 -0
  13. data/core/benches/metadata/main.rs +541 -0
  14. data/core/benches/vs_fs/Cargo.toml +1 -1
  15. data/core/benches/vs_s3/Cargo.toml +1 -1
  16. data/core/core/Cargo.toml +7 -2
  17. data/core/core/src/blocking/delete.rs +5 -1
  18. data/core/core/src/blocking/operator.rs +12 -0
  19. data/core/core/src/blocking/read/std_reader.rs +25 -0
  20. data/core/core/src/docs/concepts.rs +70 -94
  21. data/core/core/src/docs/internals/accessor.rs +62 -293
  22. data/core/core/src/docs/internals/layer.rs +43 -59
  23. data/core/core/src/docs/internals/mod.rs +21 -23
  24. data/core/core/src/docs/mod.rs +10 -6
  25. data/core/core/src/docs/performance/concurrent_write.md +92 -55
  26. data/core/core/src/docs/performance/http_optimization.md +120 -104
  27. data/core/core/src/docs/performance/mod.rs +8 -6
  28. data/core/core/src/docs/rfcs/5485_conditional_reader.md +4 -0
  29. data/core/core/src/docs/rfcs/7182_restore_api.md +139 -557
  30. data/core/core/src/docs/rfcs/7945_limited_read.md +210 -0
  31. data/core/core/src/docs/rfcs/7948_s3_provider_presets.md +254 -0
  32. data/core/core/src/docs/rfcs/8109_writer_copy_from.md +330 -0
  33. data/core/core/src/docs/rfcs/8145_conflict_error_kind.md +210 -0
  34. data/core/core/src/docs/rfcs/8147_write_if_not_changed.md +233 -0
  35. data/core/core/src/docs/rfcs/8188_compose_api.md +292 -0
  36. data/core/core/src/docs/rfcs/8194_compact_metadata_and_operation_args.md +444 -0
  37. data/core/core/src/docs/rfcs/README.md +14 -3
  38. data/core/core/src/docs/rfcs/mod.rs +46 -22
  39. data/core/core/src/docs/specs/README.md +34 -0
  40. data/core/core/src/docs/specs/conditional-operations.md +156 -0
  41. data/core/core/src/docs/specs/metadata.md +63 -0
  42. data/core/core/src/docs/specs/mod.rs +26 -0
  43. data/core/core/src/docs/upgrade.md +114 -1
  44. data/core/core/src/layers/capability_override.rs +15 -2
  45. data/core/core/src/layers/complete.rs +347 -43
  46. data/core/core/src/layers/correctness_check.rs +718 -51
  47. data/core/core/src/layers/error_context.rs +76 -2
  48. data/core/core/src/layers/simulate.rs +91 -28
  49. data/core/core/src/lib.rs +1 -0
  50. data/core/core/src/raw/accessor.rs +91 -15
  51. data/core/core/src/raw/enum_utils.rs +7 -0
  52. data/core/core/src/raw/http_util/header.rs +22 -17
  53. data/core/core/src/raw/oio/compose/api.rs +92 -0
  54. data/core/core/src/raw/oio/compose/mod.rs +19 -0
  55. data/core/core/src/raw/oio/copy/api.rs +3 -3
  56. data/core/core/src/raw/oio/copy/block_copy.rs +32 -4
  57. data/core/core/src/raw/oio/copy/multipart_copy.rs +36 -7
  58. data/core/core/src/raw/oio/entry.rs +48 -22
  59. data/core/core/src/raw/oio/list/flat_list.rs +1 -1
  60. data/core/core/src/raw/oio/list/hierarchy_list.rs +3 -2
  61. data/core/core/src/raw/oio/mod.rs +3 -0
  62. data/core/core/src/raw/oio/read/position_read.rs +1 -1
  63. data/core/core/src/raw/oio/write/api.rs +40 -0
  64. data/core/core/src/raw/oio/write/append_write.rs +4 -4
  65. data/core/core/src/raw/oio/write/block_write.rs +2 -2
  66. data/core/core/src/raw/oio/write/multipart_write.rs +181 -48
  67. data/core/core/src/raw/oio/write/position_write.rs +1 -1
  68. data/core/core/src/raw/operation.rs +6 -0
  69. data/core/core/src/raw/ops.rs +1191 -456
  70. data/core/core/src/raw/rps.rs +11 -0
  71. data/core/core/src/raw/time.rs +14 -3
  72. data/core/core/src/services/memory/backend.rs +5 -10
  73. data/core/core/src/services/memory/lister.rs +4 -4
  74. data/core/core/src/services/memory/writer.rs +7 -6
  75. data/core/core/src/types/buffer.rs +102 -12
  76. data/core/core/src/types/bytes_range.rs +20 -1
  77. data/core/core/src/types/capability.rs +65 -0
  78. data/core/core/src/types/compact.rs +329 -0
  79. data/core/core/src/types/compose/composer.rs +183 -0
  80. data/core/core/src/types/compose/input.rs +57 -0
  81. data/core/core/src/types/compose/mod.rs +23 -0
  82. data/core/core/src/types/context/read.rs +16 -11
  83. data/core/core/src/types/context/write.rs +150 -2
  84. data/core/core/src/types/copy.rs +5 -3
  85. data/core/core/src/types/delete/deleter.rs +20 -12
  86. data/core/core/src/types/delete/input.rs +22 -64
  87. data/core/core/src/types/delete/mod.rs +0 -1
  88. data/core/core/src/types/entry.rs +8 -14
  89. data/core/core/src/types/error.rs +28 -11
  90. data/core/core/src/types/metadata.rs +709 -322
  91. data/core/core/src/types/mod.rs +9 -1
  92. data/core/core/src/types/operator/operator.rs +278 -29
  93. data/core/core/src/types/operator/operator_futures.rs +466 -105
  94. data/core/core/src/types/options.rs +631 -158
  95. data/core/core/src/types/read/futures_async_reader.rs +663 -50
  96. data/core/core/src/types/read/reader.rs +23 -5
  97. data/core/core/src/types/write/futures_async_writer.rs +27 -0
  98. data/core/core/src/types/write/writer.rs +47 -5
  99. data/core/http-transports/reqwest/Cargo.toml +1 -1
  100. data/core/layers/async-backtrace/Cargo.toml +2 -2
  101. data/core/layers/async-backtrace/src/lib.rs +21 -2
  102. data/core/layers/await-tree/Cargo.toml +2 -2
  103. data/core/layers/await-tree/src/lib.rs +25 -2
  104. data/core/layers/capability-check/Cargo.toml +2 -2
  105. data/core/layers/capability-check/src/lib.rs +98 -10
  106. data/core/layers/chaos/Cargo.toml +2 -2
  107. data/core/layers/chaos/src/lib.rs +18 -3
  108. data/core/layers/concurrent-limit/Cargo.toml +3 -3
  109. data/core/layers/concurrent-limit/src/lib.rs +53 -13
  110. data/core/layers/dtrace/Cargo.toml +2 -2
  111. data/core/layers/dtrace/src/lib.rs +29 -2
  112. data/core/layers/fastmetrics/Cargo.toml +3 -3
  113. data/core/layers/fastrace/Cargo.toml +2 -2
  114. data/core/layers/fastrace/src/lib.rs +28 -2
  115. data/core/layers/foyer/Cargo.toml +2 -2
  116. data/core/layers/foyer/src/full.rs +16 -19
  117. data/core/layers/foyer/src/lib.rs +67 -14
  118. data/core/layers/hotpath/Cargo.toml +2 -2
  119. data/core/layers/hotpath/src/lib.rs +20 -2
  120. data/core/layers/immutable-index/Cargo.toml +2 -2
  121. data/core/layers/immutable-index/src/lib.rs +48 -24
  122. data/core/layers/logging/Cargo.toml +2 -2
  123. data/core/layers/logging/src/lib.rs +46 -2
  124. data/core/layers/metrics/Cargo.toml +3 -3
  125. data/core/layers/mime-guess/Cargo.toml +2 -2
  126. data/core/layers/mime-guess/src/lib.rs +31 -4
  127. data/core/layers/observe-metrics-common/Cargo.toml +2 -2
  128. data/core/layers/observe-metrics-common/src/lib.rs +55 -2
  129. data/core/layers/otelmetrics/Cargo.toml +3 -3
  130. data/core/layers/oteltrace/Cargo.toml +2 -2
  131. data/core/layers/oteltrace/src/lib.rs +27 -2
  132. data/core/layers/prometheus/Cargo.toml +3 -3
  133. data/core/layers/prometheus-client/Cargo.toml +3 -3
  134. data/core/layers/retry/Cargo.toml +4 -4
  135. data/core/layers/retry/src/lib.rs +76 -19
  136. data/core/layers/route/Cargo.toml +3 -3
  137. data/core/layers/route/src/lib.rs +34 -7
  138. data/core/layers/tail-cut/Cargo.toml +2 -2
  139. data/core/layers/tail-cut/src/lib.rs +28 -2
  140. data/core/layers/throttle/Cargo.toml +2 -2
  141. data/core/layers/throttle/src/lib.rs +19 -2
  142. data/core/layers/timeout/Cargo.toml +3 -3
  143. data/core/layers/timeout/src/lib.rs +38 -13
  144. data/core/layers/tracing/Cargo.toml +2 -2
  145. data/core/layers/tracing/src/lib.rs +24 -3
  146. data/core/services/aliyun-drive/Cargo.toml +2 -2
  147. data/core/services/aliyun-drive/src/backend.rs +34 -24
  148. data/core/services/aliyun-drive/src/core.rs +143 -54
  149. data/core/services/aliyun-drive/src/lister.rs +19 -18
  150. data/core/services/aliyun-drive/src/reader.rs +4 -1
  151. data/core/services/aliyun-drive/src/writer.rs +3 -3
  152. data/core/services/alluxio/Cargo.toml +1 -1
  153. data/core/services/alluxio/src/backend.rs +1 -1
  154. data/core/services/alluxio/src/core.rs +113 -94
  155. data/core/services/alluxio/src/reader.rs +7 -3
  156. data/core/services/alluxio/src/writer.rs +2 -2
  157. data/core/services/azblob/Cargo.toml +2 -2
  158. data/core/services/azblob/src/backend.rs +17 -9
  159. data/core/services/azblob/src/copier.rs +41 -15
  160. data/core/services/azblob/src/core.rs +372 -135
  161. data/core/services/azblob/src/deleter.rs +41 -18
  162. data/core/services/azblob/src/lister.rs +16 -10
  163. data/core/services/azblob/src/reader.rs +4 -1
  164. data/core/services/azblob/src/writer.rs +48 -15
  165. data/core/services/azdls/Cargo.toml +3 -3
  166. data/core/services/azdls/src/backend.rs +45 -15
  167. data/core/services/azdls/src/config.rs +4 -1
  168. data/core/services/azdls/src/core.rs +276 -87
  169. data/core/services/azdls/src/deleter.rs +13 -4
  170. data/core/services/azdls/src/lister.rs +18 -12
  171. data/core/services/azdls/src/reader.rs +6 -2
  172. data/core/services/azdls/src/writer.rs +44 -23
  173. data/core/services/azfile/Cargo.toml +2 -2
  174. data/core/services/azfile/src/backend.rs +24 -8
  175. data/core/services/azfile/src/core.rs +195 -77
  176. data/core/services/azfile/src/deleter.rs +8 -1
  177. data/core/services/azfile/src/lister.rs +20 -14
  178. data/core/services/azfile/src/reader.rs +5 -2
  179. data/core/services/azfile/src/writer.rs +27 -15
  180. data/core/services/azure-common/Cargo.toml +1 -1
  181. data/core/services/b2/Cargo.toml +2 -2
  182. data/core/services/b2/src/backend.rs +30 -11
  183. data/core/services/b2/src/core.rs +134 -120
  184. data/core/services/b2/src/deleter.rs +1 -1
  185. data/core/services/b2/src/lister.rs +5 -2
  186. data/core/services/b2/src/reader.rs +5 -2
  187. data/core/services/b2/src/writer.rs +29 -12
  188. data/core/services/cacache/Cargo.toml +1 -1
  189. data/core/services/cacache/src/backend.rs +4 -5
  190. data/core/services/cacache/src/reader.rs +4 -1
  191. data/core/services/cacache/src/writer.rs +6 -2
  192. data/core/services/cloudflare-kv/Cargo.toml +1 -1
  193. data/core/services/cloudflare-kv/src/backend.rs +26 -15
  194. data/core/services/cloudflare-kv/src/config.rs +13 -2
  195. data/core/services/cloudflare-kv/src/core.rs +62 -56
  196. data/core/services/cloudflare-kv/src/deleter.rs +12 -3
  197. data/core/services/cloudflare-kv/src/lister.rs +66 -17
  198. data/core/services/cloudflare-kv/src/reader.rs +14 -9
  199. data/core/services/cloudflare-kv/src/writer.rs +10 -7
  200. data/core/services/compfs/Cargo.toml +1 -1
  201. data/core/services/compfs/src/backend.rs +11 -7
  202. data/core/services/compfs/src/lister.rs +7 -7
  203. data/core/services/compfs/src/writer.rs +1 -1
  204. data/core/services/cos/Cargo.toml +1 -1
  205. data/core/services/cos/src/backend.rs +129 -16
  206. data/core/services/cos/src/core.rs +198 -80
  207. data/core/services/cos/src/deleter.rs +4 -1
  208. data/core/services/cos/src/lister.rs +42 -27
  209. data/core/services/cos/src/reader.rs +6 -2
  210. data/core/services/cos/src/writer.rs +45 -21
  211. data/core/services/d1/Cargo.toml +1 -1
  212. data/core/services/d1/src/backend.rs +6 -5
  213. data/core/services/d1/src/core.rs +79 -63
  214. data/core/services/d1/src/reader.rs +4 -1
  215. data/core/services/d1/src/writer.rs +6 -2
  216. data/core/services/dashmap/Cargo.toml +1 -1
  217. data/core/services/dashmap/src/backend.rs +2 -2
  218. data/core/services/dashmap/src/reader.rs +4 -1
  219. data/core/services/dashmap/src/writer.rs +11 -8
  220. data/core/services/dbfs/Cargo.toml +1 -1
  221. data/core/services/dbfs/src/backend.rs +21 -15
  222. data/core/services/dbfs/src/core.rs +65 -60
  223. data/core/services/dbfs/src/deleter.rs +4 -1
  224. data/core/services/dbfs/src/lister.rs +10 -10
  225. data/core/services/dbfs/src/writer.rs +6 -3
  226. data/core/services/dropbox/Cargo.toml +2 -2
  227. data/core/services/dropbox/src/backend.rs +30 -23
  228. data/core/services/dropbox/src/core.rs +65 -63
  229. data/core/services/dropbox/src/deleter.rs +1 -1
  230. data/core/services/dropbox/src/lister.rs +17 -8
  231. data/core/services/dropbox/src/reader.rs +4 -1
  232. data/core/services/dropbox/src/writer.rs +13 -10
  233. data/core/services/etcd/Cargo.toml +1 -1
  234. data/core/services/etcd/src/backend.rs +8 -5
  235. data/core/services/etcd/src/core.rs +5 -11
  236. data/core/services/etcd/src/lister.rs +6 -1
  237. data/core/services/etcd/src/reader.rs +4 -1
  238. data/core/services/etcd/src/writer.rs +6 -3
  239. data/core/services/foundationdb/Cargo.toml +1 -1
  240. data/core/services/foundationdb/src/backend.rs +6 -5
  241. data/core/services/foundationdb/src/reader.rs +4 -1
  242. data/core/services/foundationdb/src/writer.rs +6 -2
  243. data/core/services/foyer/Cargo.toml +3 -3
  244. data/core/services/foyer/src/backend.rs +6 -5
  245. data/core/services/foyer/src/reader.rs +4 -1
  246. data/core/services/foyer/src/writer.rs +6 -2
  247. data/core/services/fs/Cargo.toml +1 -1
  248. data/core/services/fs/src/backend.rs +4 -3
  249. data/core/services/fs/src/core.rs +44 -26
  250. data/core/services/fs/src/lister.rs +9 -6
  251. data/core/services/fs/src/writer.rs +20 -13
  252. data/core/services/ftp/Cargo.toml +4 -6
  253. data/core/services/ftp/src/backend.rs +9 -5
  254. data/core/services/ftp/src/core.rs +9 -7
  255. data/core/services/ftp/src/lister.rs +7 -8
  256. data/core/services/ftp/src/reader.rs +3 -3
  257. data/core/services/ftp/src/writer.rs +3 -3
  258. data/core/services/gcs/Cargo.toml +4 -2
  259. data/core/services/gcs/src/backend.rs +53 -7
  260. data/core/services/gcs/src/composer.rs +705 -0
  261. data/core/services/gcs/src/copier.rs +14 -4
  262. data/core/services/gcs/src/core.rs +828 -124
  263. data/core/services/gcs/src/deleter.rs +33 -18
  264. data/core/services/gcs/src/lib.rs +1 -0
  265. data/core/services/gcs/src/lister.rs +21 -12
  266. data/core/services/gcs/src/reader.rs +12 -5
  267. data/core/services/gcs/src/writer.rs +632 -10
  268. data/core/services/gcs-grpc/Cargo.toml +58 -0
  269. data/core/services/gcs-grpc/README.md +19 -0
  270. data/core/services/gcs-grpc/proto/README.md +23 -0
  271. data/core/services/gcs-grpc/proto/google/storage/v2/storage.proto +171 -0
  272. data/core/services/gcs-grpc/proto/upstream-descriptor.bin +0 -0
  273. data/core/services/gcs-grpc/src/backend.rs +449 -0
  274. data/core/services/gcs-grpc/src/config.rs +116 -0
  275. data/core/services/gcs-grpc/src/copier.rs +98 -0
  276. data/core/services/gcs-grpc/src/core.rs +298 -0
  277. data/core/services/gcs-grpc/src/deleter.rs +65 -0
  278. data/core/services/gcs-grpc/src/docs.md +19 -0
  279. data/core/services/gcs-grpc/src/generated/google.storage.v2.rs +541 -0
  280. data/core/services/gcs-grpc/src/generated/mod.rs +24 -0
  281. data/core/services/gcs-grpc/src/lib.rs +43 -0
  282. data/core/services/gcs-grpc/src/lister.rs +125 -0
  283. data/core/services/gcs-grpc/src/reader.rs +140 -0
  284. data/core/services/gcs-grpc/src/writer.rs +780 -0
  285. data/core/services/gdrive/Cargo.toml +2 -2
  286. data/core/services/gdrive/src/backend.rs +123 -69
  287. data/core/services/gdrive/src/core.rs +87 -69
  288. data/core/services/gdrive/src/deleter.rs +8 -2
  289. data/core/services/gdrive/src/lister.rs +38 -26
  290. data/core/services/gdrive/src/path_index.rs +2 -2
  291. data/core/services/gdrive/src/reader.rs +9 -3
  292. data/core/services/gdrive/src/writer.rs +13 -7
  293. data/core/services/ghac/Cargo.toml +2 -2
  294. data/core/services/ghac/src/backend.rs +5 -2
  295. data/core/services/ghac/src/core.rs +59 -37
  296. data/core/services/ghac/src/reader.rs +5 -2
  297. data/core/services/ghac/src/writer.rs +16 -6
  298. data/core/services/github/Cargo.toml +1 -1
  299. data/core/services/github/src/backend.rs +16 -8
  300. data/core/services/github/src/core.rs +88 -76
  301. data/core/services/github/src/lister.rs +17 -15
  302. data/core/services/github/src/reader.rs +5 -2
  303. data/core/services/github/src/writer.rs +12 -6
  304. data/core/services/goosefs/Cargo.toml +2 -2
  305. data/core/services/goosefs/src/backend.rs +2 -2
  306. data/core/services/goosefs/src/core.rs +291 -208
  307. data/core/services/goosefs/src/docs.md +3 -0
  308. data/core/services/goosefs/src/lister.rs +2 -3
  309. data/core/services/goosefs/src/reader.rs +7 -3
  310. data/core/services/goosefs/src/writer.rs +21 -10
  311. data/core/services/goosefs/tests/safe_conditional_put.rs +37 -0
  312. data/core/services/gridfs/Cargo.toml +2 -2
  313. data/core/services/gridfs/src/backend.rs +12 -8
  314. data/core/services/gridfs/src/core.rs +1 -1
  315. data/core/services/gridfs/src/reader.rs +4 -1
  316. data/core/services/gridfs/src/writer.rs +6 -2
  317. data/core/services/hdfs/Cargo.toml +1 -1
  318. data/core/services/hdfs/src/backend.rs +1 -1
  319. data/core/services/hdfs/src/core.rs +7 -4
  320. data/core/services/hdfs/src/lister.rs +7 -9
  321. data/core/services/hdfs/src/writer.rs +5 -1
  322. data/core/services/hdfs-native/Cargo.toml +1 -1
  323. data/core/services/hdfs-native/src/backend.rs +1 -1
  324. data/core/services/hdfs-native/src/core.rs +44 -50
  325. data/core/services/hdfs-native/src/lister.rs +8 -10
  326. data/core/services/hdfs-native/src/writer.rs +5 -1
  327. data/core/services/hf/Cargo.toml +4 -3
  328. data/core/services/hf/src/backend.rs +4 -3
  329. data/core/services/hf/src/core.rs +907 -153
  330. data/core/services/hf/src/lister.rs +16 -6
  331. data/core/services/hf/src/reader.rs +377 -57
  332. data/core/services/hf/src/writer.rs +6 -2
  333. data/core/services/http/Cargo.toml +3 -3
  334. data/core/services/http/src/backend.rs +8 -6
  335. data/core/services/http/src/core.rs +57 -35
  336. data/core/services/http/src/reader.rs +5 -2
  337. data/core/services/ipfs/Cargo.toml +1 -1
  338. data/core/services/ipfs/src/backend.rs +20 -9
  339. data/core/services/ipfs/src/core.rs +43 -34
  340. data/core/services/ipfs/src/reader.rs +5 -2
  341. data/core/services/ipmfs/Cargo.toml +1 -1
  342. data/core/services/ipmfs/src/backend.rs +17 -8
  343. data/core/services/ipmfs/src/core.rs +66 -60
  344. data/core/services/ipmfs/src/deleter.rs +5 -2
  345. data/core/services/ipmfs/src/lister.rs +15 -12
  346. data/core/services/ipmfs/src/reader.rs +5 -2
  347. data/core/services/ipmfs/src/writer.rs +6 -3
  348. data/core/services/koofr/Cargo.toml +2 -2
  349. data/core/services/koofr/src/backend.rs +46 -17
  350. data/core/services/koofr/src/core.rs +64 -48
  351. data/core/services/koofr/src/deleter.rs +4 -1
  352. data/core/services/koofr/src/lister.rs +11 -10
  353. data/core/services/koofr/src/reader.rs +5 -2
  354. data/core/services/koofr/src/writer.rs +13 -7
  355. data/core/services/lakefs/Cargo.toml +1 -1
  356. data/core/services/lakefs/src/backend.rs +25 -8
  357. data/core/services/lakefs/src/core.rs +79 -73
  358. data/core/services/lakefs/src/deleter.rs +4 -1
  359. data/core/services/lakefs/src/lister.rs +17 -14
  360. data/core/services/lakefs/src/reader.rs +5 -2
  361. data/core/services/lakefs/src/writer.rs +11 -10
  362. data/core/services/memcached/Cargo.toml +1 -1
  363. data/core/services/memcached/src/backend.rs +57 -7
  364. data/core/services/memcached/src/config.rs +13 -2
  365. data/core/services/memcached/src/core.rs +11 -1
  366. data/core/services/memcached/src/reader.rs +4 -1
  367. data/core/services/memcached/src/writer.rs +6 -2
  368. data/core/services/mini_moka/Cargo.toml +1 -1
  369. data/core/services/mini_moka/src/backend.rs +8 -8
  370. data/core/services/mini_moka/src/reader.rs +4 -1
  371. data/core/services/mini_moka/src/writer.rs +11 -7
  372. data/core/services/moka/Cargo.toml +1 -1
  373. data/core/services/moka/src/backend.rs +7 -7
  374. data/core/services/moka/src/reader.rs +4 -1
  375. data/core/services/moka/src/writer.rs +10 -6
  376. data/core/services/mongodb/Cargo.toml +2 -2
  377. data/core/services/mongodb/src/backend.rs +7 -6
  378. data/core/services/mongodb/src/core.rs +1 -1
  379. data/core/services/mongodb/src/reader.rs +4 -1
  380. data/core/services/mongodb/src/writer.rs +6 -2
  381. data/core/services/monoiofs/Cargo.toml +2 -2
  382. data/core/services/monoiofs/src/backend.rs +16 -10
  383. data/core/services/monoiofs/src/core.rs +8 -9
  384. data/core/services/monoiofs/src/reader.rs +8 -10
  385. data/core/services/monoiofs/src/writer.rs +19 -24
  386. data/core/services/mysql/Cargo.toml +2 -2
  387. data/core/services/mysql/src/backend.rs +7 -6
  388. data/core/services/mysql/src/core.rs +1 -1
  389. data/core/services/mysql/src/lister.rs +7 -3
  390. data/core/services/mysql/src/reader.rs +4 -1
  391. data/core/services/mysql/src/writer.rs +6 -2
  392. data/core/services/obs/Cargo.toml +1 -1
  393. data/core/services/obs/src/backend.rs +29 -11
  394. data/core/services/obs/src/core.rs +81 -82
  395. data/core/services/obs/src/deleter.rs +4 -1
  396. data/core/services/obs/src/lister.rs +12 -5
  397. data/core/services/obs/src/reader.rs +5 -2
  398. data/core/services/obs/src/writer.rs +40 -19
  399. data/core/services/onedrive/Cargo.toml +2 -2
  400. data/core/services/onedrive/src/backend.rs +30 -21
  401. data/core/services/onedrive/src/config.rs +2 -2
  402. data/core/services/onedrive/src/core.rs +191 -90
  403. data/core/services/onedrive/src/deleter.rs +5 -2
  404. data/core/services/onedrive/src/graph_model.rs +10 -51
  405. data/core/services/onedrive/src/lister.rs +60 -24
  406. data/core/services/onedrive/src/reader.rs +17 -2
  407. data/core/services/onedrive/src/writer.rs +26 -15
  408. data/core/services/opfs/Cargo.toml +1 -1
  409. data/core/services/opfs/src/backend.rs +6 -13
  410. data/core/services/opfs/src/core.rs +33 -37
  411. data/core/services/opfs/src/lister.rs +4 -4
  412. data/core/services/opfs/src/writer.rs +1 -3
  413. data/core/services/oss/Cargo.toml +1 -1
  414. data/core/services/oss/src/backend.rs +40 -8
  415. data/core/services/oss/src/core.rs +192 -92
  416. data/core/services/oss/src/deleter.rs +16 -6
  417. data/core/services/oss/src/lister.rs +43 -27
  418. data/core/services/oss/src/reader.rs +6 -2
  419. data/core/services/oss/src/writer.rs +40 -22
  420. data/core/services/pcloud/Cargo.toml +1 -1
  421. data/core/services/pcloud/src/backend.rs +40 -6
  422. data/core/services/pcloud/src/core.rs +80 -66
  423. data/core/services/pcloud/src/deleter.rs +8 -1
  424. data/core/services/pcloud/src/lister.rs +4 -1
  425. data/core/services/pcloud/src/reader.rs +5 -2
  426. data/core/services/pcloud/src/writer.rs +6 -3
  427. data/core/services/persy/Cargo.toml +1 -1
  428. data/core/services/persy/src/backend.rs +6 -5
  429. data/core/services/persy/src/core.rs +60 -15
  430. data/core/services/persy/src/reader.rs +4 -1
  431. data/core/services/persy/src/writer.rs +6 -2
  432. data/core/services/postgresql/Cargo.toml +2 -2
  433. data/core/services/postgresql/src/backend.rs +7 -6
  434. data/core/services/postgresql/src/core.rs +1 -1
  435. data/core/services/postgresql/src/reader.rs +4 -1
  436. data/core/services/postgresql/src/writer.rs +6 -2
  437. data/core/services/redb/Cargo.toml +1 -1
  438. data/core/services/redb/src/backend.rs +6 -5
  439. data/core/services/redb/src/reader.rs +4 -1
  440. data/core/services/redb/src/writer.rs +6 -2
  441. data/core/services/redis/Cargo.toml +1 -1
  442. data/core/services/redis/src/backend.rs +18 -8
  443. data/core/services/redis/src/config.rs +13 -2
  444. data/core/services/redis/src/reader.rs +8 -4
  445. data/core/services/redis/src/writer.rs +6 -2
  446. data/core/services/rocksdb/Cargo.toml +1 -1
  447. data/core/services/rocksdb/src/backend.rs +6 -5
  448. data/core/services/rocksdb/src/lister.rs +6 -5
  449. data/core/services/rocksdb/src/reader.rs +4 -1
  450. data/core/services/rocksdb/src/writer.rs +6 -2
  451. data/core/services/s3/Cargo.toml +5 -4
  452. data/core/services/s3/src/backend.rs +995 -39
  453. data/core/services/s3/src/compatible_services.md +57 -0
  454. data/core/services/s3/src/config.rs +16 -0
  455. data/core/services/s3/src/copier.rs +190 -55
  456. data/core/services/s3/src/core.rs +299 -190
  457. data/core/services/s3/src/deleter.rs +26 -7
  458. data/core/services/s3/src/docs.md +57 -0
  459. data/core/services/s3/src/lister.rs +55 -36
  460. data/core/services/s3/src/reader.rs +22 -2
  461. data/core/services/s3/src/writer.rs +154 -32
  462. data/core/services/seafile/Cargo.toml +2 -2
  463. data/core/services/seafile/src/backend.rs +3 -3
  464. data/core/services/seafile/src/core.rs +105 -79
  465. data/core/services/seafile/src/lister.rs +11 -8
  466. data/core/services/seafile/src/reader.rs +5 -2
  467. data/core/services/seafile/src/writer.rs +6 -3
  468. data/core/services/sftp/Cargo.toml +1 -1
  469. data/core/services/sftp/src/backend.rs +19 -4
  470. data/core/services/sftp/src/core.rs +51 -46
  471. data/core/services/sftp/src/lister.rs +4 -4
  472. data/core/services/sftp/src/writer.rs +1 -1
  473. data/core/services/sled/Cargo.toml +1 -1
  474. data/core/services/sled/src/backend.rs +6 -5
  475. data/core/services/sled/src/core.rs +28 -6
  476. data/core/services/sled/src/lister.rs +6 -5
  477. data/core/services/sled/src/reader.rs +4 -1
  478. data/core/services/sled/src/writer.rs +6 -2
  479. data/core/services/sqlite/Cargo.toml +2 -2
  480. data/core/services/sqlite/src/backend.rs +12 -7
  481. data/core/services/sqlite/src/core.rs +3 -3
  482. data/core/services/sqlite/src/reader.rs +4 -1
  483. data/core/services/sqlite/src/writer.rs +7 -3
  484. data/core/services/surrealdb/Cargo.toml +2 -2
  485. data/core/services/surrealdb/src/backend.rs +7 -6
  486. data/core/services/surrealdb/src/core.rs +1 -1
  487. data/core/services/surrealdb/src/reader.rs +4 -1
  488. data/core/services/surrealdb/src/writer.rs +6 -2
  489. data/core/services/swift/Cargo.toml +1 -1
  490. data/core/services/swift/src/backend.rs +38 -8
  491. data/core/services/swift/src/core.rs +63 -67
  492. data/core/services/swift/src/deleter.rs +8 -2
  493. data/core/services/swift/src/lister.rs +11 -8
  494. data/core/services/swift/src/reader.rs +5 -2
  495. data/core/services/swift/src/writer.rs +17 -8
  496. data/core/services/tikv/Cargo.toml +2 -2
  497. data/core/services/tikv/src/backend.rs +7 -6
  498. data/core/services/tikv/src/core.rs +31 -14
  499. data/core/services/tikv/src/reader.rs +4 -1
  500. data/core/services/tikv/src/writer.rs +6 -2
  501. data/core/services/tos/Cargo.toml +2 -2
  502. data/core/services/tos/src/backend.rs +45 -21
  503. data/core/services/tos/src/copier.rs +44 -17
  504. data/core/services/tos/src/core.rs +147 -117
  505. data/core/services/tos/src/deleter.rs +9 -3
  506. data/core/services/tos/src/docs.md +1 -1
  507. data/core/services/tos/src/lister.rs +43 -28
  508. data/core/services/tos/src/reader.rs +5 -2
  509. data/core/services/tos/src/writer.rs +37 -16
  510. data/core/services/upyun/Cargo.toml +1 -1
  511. data/core/services/upyun/src/backend.rs +30 -7
  512. data/core/services/upyun/src/core.rs +122 -87
  513. data/core/services/upyun/src/deleter.rs +4 -1
  514. data/core/services/upyun/src/lister.rs +10 -10
  515. data/core/services/upyun/src/reader.rs +5 -2
  516. data/core/services/upyun/src/writer.rs +19 -7
  517. data/core/services/vercel-artifacts/Cargo.toml +1 -1
  518. data/core/services/vercel-artifacts/src/backend.rs +6 -3
  519. data/core/services/vercel-artifacts/src/core.rs +32 -27
  520. data/core/services/vercel-artifacts/src/reader.rs +5 -2
  521. data/core/services/vercel-artifacts/src/writer.rs +6 -3
  522. data/core/services/vercel-blob/Cargo.toml +1 -1
  523. data/core/services/vercel-blob/src/backend.rs +23 -6
  524. data/core/services/vercel-blob/src/core.rs +92 -81
  525. data/core/services/vercel-blob/src/lister.rs +12 -3
  526. data/core/services/vercel-blob/src/reader.rs +5 -2
  527. data/core/services/vercel-blob/src/writer.rs +19 -7
  528. data/core/services/webdav/Cargo.toml +2 -2
  529. data/core/services/webdav/src/backend.rs +25 -5
  530. data/core/services/webdav/src/core.rs +116 -59
  531. data/core/services/webdav/src/deleter.rs +4 -1
  532. data/core/services/webdav/src/lister.rs +4 -1
  533. data/core/services/webdav/src/reader.rs +6 -2
  534. data/core/services/webdav/src/writer.rs +17 -7
  535. data/core/services/webhdfs/Cargo.toml +2 -2
  536. data/core/services/webhdfs/src/backend.rs +24 -11
  537. data/core/services/webhdfs/src/core.rs +99 -98
  538. data/core/services/webhdfs/src/deleter.rs +5 -2
  539. data/core/services/webhdfs/src/lister.rs +21 -9
  540. data/core/services/webhdfs/src/reader.rs +5 -2
  541. data/core/services/webhdfs/src/writer.rs +49 -14
  542. data/core/services/yandex-disk/Cargo.toml +1 -1
  543. data/core/services/yandex-disk/src/backend.rs +28 -6
  544. data/core/services/yandex-disk/src/core.rs +97 -79
  545. data/core/services/yandex-disk/src/deleter.rs +4 -1
  546. data/core/services/yandex-disk/src/lister.rs +25 -9
  547. data/core/services/yandex-disk/src/reader.rs +5 -2
  548. data/core/services/yandex-disk/src/writer.rs +6 -3
  549. data/core/src/lib.rs +5 -0
  550. data/core/testkit/Cargo.toml +4 -4
  551. data/core/testkit/src/utils.rs +53 -8
  552. data/core/tests/behavior/async_compose.rs +297 -0
  553. data/core/tests/behavior/async_copy.rs +162 -1
  554. data/core/tests/behavior/async_delete.rs +364 -3
  555. data/core/tests/behavior/async_read.rs +86 -0
  556. data/core/tests/behavior/async_restore.rs +162 -0
  557. data/core/tests/behavior/async_stat.rs +90 -0
  558. data/core/tests/behavior/async_write.rs +330 -2
  559. data/core/tests/behavior/main.rs +4 -0
  560. data/core/upgrade.md +114 -1
  561. data/src/capability.rs +0 -1
  562. data/src/io.rs +0 -1
  563. data/src/lister.rs +0 -1
  564. data/src/metadata.rs +0 -1
  565. data/src/operator_info.rs +0 -1
  566. metadata +44 -2
@@ -17,13 +17,13 @@
17
17
 
18
18
  use std::fmt::Debug;
19
19
 
20
+ use asyncband::once::OnceCell;
20
21
  use bytes::Buf;
21
22
  use http::Request;
22
23
  use http::Response;
23
24
  use http::StatusCode;
24
25
  use http::header::CONTENT_LENGTH;
25
26
  use http::header::CONTENT_TYPE;
26
- use mea::once::OnceCell;
27
27
  use serde::Deserialize;
28
28
 
29
29
  use opendal_core::raw::*;
@@ -118,7 +118,10 @@ impl WebhdfsCore {
118
118
  let status = resp.status();
119
119
 
120
120
  if status != StatusCode::CREATED && status != StatusCode::OK {
121
- return Err(parse_error(resp));
121
+ return Err(parse_error(
122
+ ErrorContext::new(ServiceOperation("Create")),
123
+ resp,
124
+ ));
122
125
  }
123
126
 
124
127
  let bs = resp.into_body();
@@ -205,7 +208,10 @@ impl WebhdfsCore {
205
208
 
206
209
  Ok(resp.location)
207
210
  }
208
- _ => Err(parse_error(resp)),
211
+ _ => Err(parse_error(
212
+ ErrorContext::new(ServiceOperation("Append")),
213
+ resp,
214
+ )),
209
215
  }
210
216
  }
211
217
 
@@ -314,7 +320,7 @@ impl WebhdfsCore {
314
320
  percent_encode_path(&p),
315
321
  );
316
322
  if !start_after.is_empty() {
317
- url += format!("&startAfter={start_after}").as_str();
323
+ url += format!("&startAfter={}", percent_encode_path(start_after)).as_str();
318
324
  }
319
325
  if let Some(user) = &self.user_name {
320
326
  url += format!("&user.name={user}").as_str();
@@ -430,82 +436,80 @@ pub(super) struct LocationResponse {
430
436
  pub location: String,
431
437
  }
432
438
 
433
- mod error {
434
- use http::Response;
435
- use http::StatusCode;
436
- use http::response::Parts;
437
- use serde::Deserialize;
439
+ #[derive(Debug, Deserialize)]
440
+ #[serde(rename_all = "PascalCase")]
441
+ struct WebHdfsErrorWrapper {
442
+ pub remote_exception: WebHdfsError,
443
+ }
438
444
 
439
- use opendal_core::raw::*;
440
- use opendal_core::*;
445
+ /// WebHdfsError is the error message returned by WebHdfs service
446
+ #[derive(Debug, Deserialize)]
447
+ #[serde(rename_all = "camelCase")]
448
+ #[allow(dead_code)]
449
+ struct WebHdfsError {
450
+ exception: String,
451
+ message: String,
452
+ java_class_name: String,
453
+ }
441
454
 
442
- #[derive(Debug, Deserialize)]
443
- #[serde(rename_all = "PascalCase")]
444
- struct WebHdfsErrorWrapper {
445
- pub remote_exception: WebHdfsError,
446
- }
455
+ /// Context needed to classify an error from this service.
456
+ #[derive(Clone, Copy, Debug)]
457
+ pub(crate) struct ErrorContext {
458
+ service_operation: ServiceOperation,
459
+ }
447
460
 
448
- /// WebHdfsError is the error message returned by WebHdfs service
449
- #[derive(Debug, Deserialize)]
450
- #[serde(rename_all = "camelCase")]
451
- #[allow(dead_code)]
452
- struct WebHdfsError {
453
- exception: String,
454
- message: String,
455
- java_class_name: String,
461
+ impl ErrorContext {
462
+ pub(crate) const fn new(service_operation: ServiceOperation) -> Self {
463
+ Self { service_operation }
456
464
  }
465
+ }
457
466
 
458
- pub(crate) fn parse_error(resp: Response<Buffer>) -> Error {
459
- let (parts, body) = resp.into_parts();
460
- let bs = body.to_bytes();
461
- let s = String::from_utf8_lossy(&bs);
462
- parse_error_msg(parts, &s)
467
+ /// Parse an error response using its service request context.
468
+ pub(crate) fn parse_error(ctx: ErrorContext, resp: Response<Buffer>) -> Error {
469
+ let (parts, body) = resp.into_parts();
470
+ let bs = body.to_bytes();
471
+ let (kind, retryable) = match parts.status {
472
+ StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
473
+ StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
474
+ // passing invalid arguments will return BAD_REQUEST
475
+ // should be un-retryable
476
+ StatusCode::BAD_REQUEST => (ErrorKind::Unexpected, false),
477
+ StatusCode::INTERNAL_SERVER_ERROR
478
+ | StatusCode::BAD_GATEWAY
479
+ | StatusCode::SERVICE_UNAVAILABLE
480
+ | StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
481
+ _ => (ErrorKind::Unexpected, false),
482
+ };
483
+
484
+ let message = match serde_json::from_slice::<WebHdfsErrorWrapper>(&bs) {
485
+ Ok(wh_error) => format!("{:?}", wh_error.remote_exception),
486
+ Err(_) => String::from_utf8_lossy(&bs).into_owned(),
487
+ };
488
+
489
+ let mut err = Error::new(kind, message);
490
+
491
+ err = err.with_context("service_operation", ctx.service_operation.0);
492
+ err = with_error_response_context(err, parts);
493
+
494
+ if retryable {
495
+ err = err.set_temporary();
463
496
  }
464
497
 
465
- pub(crate) fn parse_error_msg(parts: Parts, body: &str) -> Error {
466
- let (kind, retryable) = match parts.status {
467
- StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
468
- StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => {
469
- (ErrorKind::PermissionDenied, false)
470
- }
471
- // passing invalid arguments will return BAD_REQUEST
472
- // should be un-retryable
473
- StatusCode::BAD_REQUEST => (ErrorKind::Unexpected, false),
474
- StatusCode::INTERNAL_SERVER_ERROR
475
- | StatusCode::BAD_GATEWAY
476
- | StatusCode::SERVICE_UNAVAILABLE
477
- | StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
478
- _ => (ErrorKind::Unexpected, false),
479
- };
480
-
481
- let message = match serde_json::from_str::<WebHdfsErrorWrapper>(body) {
482
- Ok(wh_error) => format!("{:?}", wh_error.remote_exception),
483
- Err(_) => body.to_owned(),
484
- };
485
-
486
- let mut err = Error::new(kind, message);
487
-
488
- err = with_error_response_context(err, parts);
489
-
490
- if retryable {
491
- err = err.set_temporary();
492
- }
493
-
494
- err
495
- }
498
+ err
499
+ }
496
500
 
497
- #[cfg(test)]
498
- mod tests {
499
- use bytes::Buf;
500
- use serde_json::from_reader;
501
+ #[cfg(test)]
502
+ mod tests {
503
+ use bytes::Buf;
504
+ use serde_json::from_reader;
501
505
 
502
- use super::*;
506
+ use super::*;
503
507
 
504
- /// Error response example from https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Error%20Responses
505
- #[tokio::test]
506
- async fn test_parse_error() -> Result<()> {
507
- let ill_args = bytes::Bytes::from(
508
- r#"
508
+ /// Error response example from https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Error%20Responses
509
+ #[tokio::test]
510
+ async fn test_parse_error() -> Result<()> {
511
+ let ill_args = bytes::Bytes::from(
512
+ r#"
509
513
  {
510
514
  "RemoteException":
511
515
  {
@@ -515,33 +519,30 @@ mod error {
515
519
  }
516
520
  }
517
521
  "#,
518
- );
519
- let body = Buffer::from(ill_args.clone());
520
- let resp = Response::builder()
521
- .status(StatusCode::BAD_REQUEST)
522
- .body(body)
523
- .unwrap();
524
-
525
- let err = parse_error(resp);
526
- assert_eq!(err.kind(), ErrorKind::Unexpected);
527
- assert!(!err.is_temporary());
528
-
529
- let err_msg: WebHdfsError = from_reader::<_, WebHdfsErrorWrapper>(ill_args.reader())
530
- .expect("must success")
531
- .remote_exception;
532
- assert_eq!(err_msg.exception, "IllegalArgumentException");
533
- assert_eq!(
534
- err_msg.java_class_name,
535
- "java.lang.IllegalArgumentException"
536
- );
537
- assert_eq!(
538
- err_msg.message,
539
- "Invalid value for webhdfs parameter \"permission\": ..."
540
- );
541
-
542
- Ok(())
543
- }
522
+ );
523
+ let body = Buffer::from(ill_args.clone());
524
+ let resp = Response::builder()
525
+ .status(StatusCode::BAD_REQUEST)
526
+ .body(body)
527
+ .unwrap();
528
+
529
+ let err = parse_error(ErrorContext::new(ServiceOperation("Test")), resp);
530
+ assert_eq!(err.kind(), ErrorKind::Unexpected);
531
+ assert!(!err.is_temporary());
532
+
533
+ let err_msg: WebHdfsError = from_reader::<_, WebHdfsErrorWrapper>(ill_args.reader())
534
+ .expect("must success")
535
+ .remote_exception;
536
+ assert_eq!(err_msg.exception, "IllegalArgumentException");
537
+ assert_eq!(
538
+ err_msg.java_class_name,
539
+ "java.lang.IllegalArgumentException"
540
+ );
541
+ assert_eq!(
542
+ err_msg.message,
543
+ "Invalid value for webhdfs parameter \"permission\": ..."
544
+ );
545
+
546
+ Ok(())
544
547
  }
545
548
  }
546
-
547
- pub(super) use error::*;
@@ -19,8 +19,8 @@ use std::sync::Arc;
19
19
 
20
20
  use http::StatusCode;
21
21
 
22
- use super::core::WebhdfsCore;
23
22
  use super::core::parse_error;
23
+ use super::core::{ErrorContext, WebhdfsCore};
24
24
  use opendal_core::raw::oio;
25
25
  use opendal_core::raw::*;
26
26
  use opendal_core::*;
@@ -42,7 +42,10 @@ impl oio::OneShotDelete for WebhdfsDeleter {
42
42
 
43
43
  match resp.status() {
44
44
  StatusCode::OK => Ok(()),
45
- _ => Err(parse_error(resp)),
45
+ _ => Err(parse_error(
46
+ ErrorContext::new(ServiceOperation("Delete")),
47
+ resp,
48
+ )),
46
49
  }
47
50
  }
48
51
  }
@@ -20,8 +20,8 @@ use std::sync::Arc;
20
20
  use bytes::Buf;
21
21
  use http::StatusCode;
22
22
 
23
- use super::core::WebhdfsCore;
24
23
  use super::core::parse_error;
24
+ use super::core::{ErrorContext, WebhdfsCore};
25
25
  use super::message::*;
26
26
  use opendal_core::raw::oio;
27
27
  use opendal_core::raw::*;
@@ -52,7 +52,7 @@ impl oio::PageList for WebhdfsLister {
52
52
  ctx.done = true;
53
53
  ctx.entries.push_back(oio::Entry::new(
54
54
  format!("{}/", self.path).as_str(),
55
- Metadata::new(EntryMode::DIR),
55
+ MetadataBuilder::dir().build(),
56
56
  ));
57
57
 
58
58
  let bs = resp.into_body();
@@ -65,7 +65,12 @@ impl oio::PageList for WebhdfsLister {
65
65
  ctx.done = true;
66
66
  return Ok(());
67
67
  }
68
- _ => return Err(parse_error(resp)),
68
+ _ => {
69
+ return Err(parse_error(
70
+ ErrorContext::new(ServiceOperation("ListStatus")),
71
+ resp,
72
+ ));
73
+ }
69
74
  }
70
75
  } else {
71
76
  let resp = self
@@ -83,7 +88,7 @@ impl oio::PageList for WebhdfsLister {
83
88
  if directory_listing.remaining_entries == 0 {
84
89
  ctx.entries.push_back(oio::Entry::new(
85
90
  format!("{}/", self.path).as_str(),
86
- Metadata::new(EntryMode::DIR),
91
+ MetadataBuilder::dir().build(),
87
92
  ));
88
93
 
89
94
  ctx.done = true;
@@ -98,7 +103,12 @@ impl oio::PageList for WebhdfsLister {
98
103
  ctx.done = true;
99
104
  return Ok(());
100
105
  }
101
- _ => return Err(parse_error(resp)),
106
+ _ => {
107
+ return Err(parse_error(
108
+ ErrorContext::new(ServiceOperation("ListStatusBatch")),
109
+ resp,
110
+ ));
111
+ }
102
112
  }
103
113
  };
104
114
 
@@ -110,10 +120,12 @@ impl oio::PageList for WebhdfsLister {
110
120
  };
111
121
 
112
122
  let meta = match status.ty {
113
- FileStatusType::Directory => Metadata::new(EntryMode::DIR),
114
- FileStatusType::File => Metadata::new(EntryMode::FILE)
115
- .with_content_length(status.length)
116
- .with_last_modified(Timestamp::from_millisecond(status.modification_time)?),
123
+ FileStatusType::Directory => MetadataBuilder::dir().build(),
124
+ FileStatusType::File => {
125
+ let mut metadata = MetadataBuilder::file(status.length);
126
+ metadata.last_modified(Timestamp::from_millisecond(status.modification_time)?);
127
+ metadata.build()
128
+ }
117
129
  };
118
130
 
119
131
  if meta.mode().is_file() {
@@ -16,7 +16,7 @@
16
16
  // under the License.
17
17
 
18
18
  use super::backend::*;
19
- use super::core::parse_error;
19
+ use super::core::{ErrorContext, parse_error};
20
20
  use http::Response;
21
21
  use http::StatusCode;
22
22
  use opendal_core::raw::oio;
@@ -60,7 +60,10 @@ impl oio::StreamRead for WebhdfsReader {
60
60
  _ => {
61
61
  let (part, mut body) = resp.into_parts();
62
62
  let buf = body.to_buffer().await?;
63
- return Err(parse_error(Response::from_parts(part, buf)));
63
+ return Err(parse_error(
64
+ ErrorContext::new(ServiceOperation("Open")),
65
+ Response::from_parts(part, buf),
66
+ ));
64
67
  }
65
68
  };
66
69
 
@@ -21,8 +21,8 @@ use bytes::Buf;
21
21
  use http::StatusCode;
22
22
  use uuid::Uuid;
23
23
 
24
- use super::core::WebhdfsCore;
25
24
  use super::core::parse_error;
25
+ use super::core::{ErrorContext, WebhdfsCore};
26
26
  use crate::message::FileStatusWrapper;
27
27
  use opendal_core::raw::oio;
28
28
  use opendal_core::raw::*;
@@ -59,8 +59,11 @@ impl oio::BlockWrite for WebhdfsWriter {
59
59
 
60
60
  let status = resp.status();
61
61
  match status {
62
- StatusCode::CREATED | StatusCode::OK => Ok(Metadata::default()),
63
- _ => Err(parse_error(resp)),
62
+ StatusCode::CREATED | StatusCode::OK => Ok(MetadataBuilder::unknown().build()),
63
+ _ => Err(parse_error(
64
+ ErrorContext::new(ServiceOperation("Create")),
65
+ resp,
66
+ )),
64
67
  }
65
68
  }
66
69
 
@@ -85,7 +88,10 @@ impl oio::BlockWrite for WebhdfsWriter {
85
88
  let status = resp.status();
86
89
  match status {
87
90
  StatusCode::CREATED | StatusCode::OK => Ok(()),
88
- _ => Err(parse_error(resp)),
91
+ _ => Err(parse_error(
92
+ ErrorContext::new(ServiceOperation("Create")),
93
+ resp,
94
+ )),
89
95
  }
90
96
  }
91
97
 
@@ -110,7 +116,10 @@ impl oio::BlockWrite for WebhdfsWriter {
110
116
 
111
117
  let status = resp.status();
112
118
  if status != StatusCode::OK {
113
- return Err(parse_error(resp));
119
+ return Err(parse_error(
120
+ ErrorContext::new(ServiceOperation("Concat")),
121
+ resp,
122
+ ));
114
123
  }
115
124
  }
116
125
  // delete the path file
@@ -118,7 +127,10 @@ impl oio::BlockWrite for WebhdfsWriter {
118
127
 
119
128
  let status = resp.status();
120
129
  if status != StatusCode::OK {
121
- return Err(parse_error(resp));
130
+ return Err(parse_error(
131
+ ErrorContext::new(ServiceOperation("Delete")),
132
+ resp,
133
+ ));
122
134
  }
123
135
 
124
136
  // rename concat file to path
@@ -129,20 +141,34 @@ impl oio::BlockWrite for WebhdfsWriter {
129
141
 
130
142
  let status = resp.status();
131
143
  match status {
132
- StatusCode::OK => Ok(Metadata::default()),
133
- _ => Err(parse_error(resp)),
144
+ StatusCode::OK => Ok(MetadataBuilder::unknown().build()),
145
+ _ => Err(parse_error(
146
+ ErrorContext::new(ServiceOperation("Rename")),
147
+ resp,
148
+ )),
134
149
  }
135
150
  }
136
151
 
137
152
  async fn abort_block(&self, block_ids: Vec<Uuid>) -> Result<()> {
153
+ let Some(ref atomic_write_dir) = self.core.atomic_write_dir else {
154
+ return Err(Error::new(
155
+ ErrorKind::Unsupported,
156
+ "write multi is not supported when atomic is not set",
157
+ ));
158
+ };
138
159
  for block_id in block_ids {
139
160
  let resp = self
140
161
  .core
141
- .webhdfs_delete(&self.ctx, &block_id.to_string())
162
+ .webhdfs_delete(&self.ctx, &format!("{atomic_write_dir}{block_id}"))
142
163
  .await?;
143
164
  match resp.status() {
144
165
  StatusCode::OK => {}
145
- _ => return Err(parse_error(resp)),
166
+ _ => {
167
+ return Err(parse_error(
168
+ ErrorContext::new(ServiceOperation("Delete")),
169
+ resp,
170
+ ));
171
+ }
146
172
  }
147
173
  }
148
174
  Ok(())
@@ -175,10 +201,16 @@ impl oio::AppendWrite for WebhdfsWriter {
175
201
  let status = resp.status();
176
202
  match status {
177
203
  StatusCode::CREATED | StatusCode::OK => Ok(0),
178
- _ => Err(parse_error(resp)),
204
+ _ => Err(parse_error(
205
+ ErrorContext::new(ServiceOperation("Create")),
206
+ resp,
207
+ )),
179
208
  }
180
209
  }
181
- _ => Err(parse_error(resp)),
210
+ _ => Err(parse_error(
211
+ ErrorContext::new(ServiceOperation("GetFileStatus")),
212
+ resp,
213
+ )),
182
214
  }
183
215
  }
184
216
 
@@ -190,8 +222,11 @@ impl oio::AppendWrite for WebhdfsWriter {
190
222
 
191
223
  let status = resp.status();
192
224
  match status {
193
- StatusCode::OK => Ok(Metadata::default()),
194
- _ => Err(parse_error(resp)),
225
+ StatusCode::OK => Ok(MetadataBuilder::unknown().build()),
226
+ _ => Err(parse_error(
227
+ ErrorContext::new(ServiceOperation("Append")),
228
+ resp,
229
+ )),
195
230
  }
196
231
  }
197
232
  }
@@ -32,7 +32,7 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
35
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
36
36
 
37
37
  bytes = { workspace = true }
38
38
  http = { workspace = true }
@@ -137,6 +137,7 @@ impl Service for YandexDiskBackend {
137
137
  type Lister = oio::PageLister<YandexDiskLister>;
138
138
  type Deleter = oio::OneShotDeleter<YandexDiskDeleter>;
139
139
  type Copier = oio::OneShotCopier;
140
+ type Composer = ();
140
141
 
141
142
  fn info(&self) -> ServiceInfo {
142
143
  self.core.info.clone()
@@ -172,7 +173,10 @@ impl Service for YandexDiskBackend {
172
173
 
173
174
  match status {
174
175
  StatusCode::OK | StatusCode::CREATED => Ok(RpRename::default()),
175
- _ => Err(parse_error(resp)),
176
+ _ => Err(parse_error(
177
+ ErrorContext::new(ServiceOperation("MoveResource")),
178
+ resp,
179
+ )),
176
180
  }
177
181
  }
178
182
 
@@ -181,15 +185,25 @@ impl Service for YandexDiskBackend {
181
185
  ctx: &OperationContext,
182
186
  from: &str,
183
187
  to: &str,
184
- _args: OpCopy,
185
- _opts: OpCopier,
188
+ args: OpCopy,
186
189
  ) -> Result<Self::Copier> {
190
+ let backend = self.clone();
187
191
  let core = self.core.clone();
188
192
  let ctx = ctx.clone();
189
193
  let from = from.to_string();
190
194
  let to = to.to_string();
195
+ let source_content_length_hint = args.source_content_length_hint();
191
196
 
192
197
  Ok(oio::OneShotCopier::new(async move {
198
+ let source_size = match source_content_length_hint {
199
+ Some(size) => size,
200
+ None => backend
201
+ .stat(&ctx, &from, OpStat::default())
202
+ .await?
203
+ .into_metadata()
204
+ .content_length(),
205
+ };
206
+
193
207
  core.ensure_dir_exists(&ctx, &to).await?;
194
208
 
195
209
  let resp = core.copy(&ctx, &from, &to).await?;
@@ -197,8 +211,13 @@ impl Service for YandexDiskBackend {
197
211
  let status = resp.status();
198
212
 
199
213
  match status {
200
- StatusCode::OK | StatusCode::CREATED => Ok(Metadata::default()),
201
- _ => Err(parse_error(resp)),
214
+ StatusCode::OK | StatusCode::CREATED => {
215
+ Ok(MetadataBuilder::file(source_size).build())
216
+ }
217
+ _ => Err(parse_error(
218
+ ErrorContext::new(ServiceOperation("CopyResource")),
219
+ resp,
220
+ )),
202
221
  }
203
222
  }))
204
223
  }
@@ -229,7 +248,10 @@ impl Service for YandexDiskBackend {
229
248
 
230
249
  parse_info(mf).map(RpStat::new)
231
250
  }
232
- _ => Err(parse_error(resp)),
251
+ _ => Err(parse_error(
252
+ ErrorContext::new(ServiceOperation("GetMetainformation")),
253
+ resp,
254
+ )),
233
255
  }
234
256
  }
235
257