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
@@ -155,6 +155,7 @@ impl Service for ImmutableIndexService {
155
155
  type Lister = ImmutableDir;
156
156
  type Deleter = oio::Deleter;
157
157
  type Copier = oio::Copier;
158
+ type Composer = oio::Composer;
158
159
 
159
160
  fn info(&self) -> ServiceInfo {
160
161
  self.inner.info()
@@ -167,6 +168,10 @@ impl Service for ImmutableIndexService {
167
168
  capability
168
169
  }
169
170
 
171
+ fn compose(&self, ctx: &OperationContext, to: &str, args: OpCompose) -> Result<Self::Composer> {
172
+ self.inner.compose(ctx, to, args)
173
+ }
174
+
170
175
  async fn create_dir(
171
176
  &self,
172
177
  ctx: &OperationContext,
@@ -194,9 +199,8 @@ impl Service for ImmutableIndexService {
194
199
  from: &str,
195
200
  to: &str,
196
201
  args: OpCopy,
197
- opts: OpCopier,
198
202
  ) -> Result<Self::Copier> {
199
- self.inner.copy(ctx, from, to, args, opts)
203
+ self.inner.copy(ctx, from, to, args)
200
204
  }
201
205
 
202
206
  fn list(&self, _ctx: &OperationContext, path: &str, args: OpList) -> Result<Self::Lister> {
@@ -228,6 +232,15 @@ impl Service for ImmutableIndexService {
228
232
  self.inner.rename(ctx, from, to, args).await
229
233
  }
230
234
 
235
+ async fn restore(
236
+ &self,
237
+ ctx: &OperationContext,
238
+ path: &str,
239
+ args: OpRestore,
240
+ ) -> Result<RpRestore> {
241
+ self.inner.restore(ctx, path, args).await
242
+ }
243
+
231
244
  async fn presign(
232
245
  &self,
233
246
  ctx: &OperationContext,
@@ -252,13 +265,12 @@ impl ImmutableDir {
252
265
 
253
266
  fn inner_next(&mut self) -> Option<oio::Entry> {
254
267
  self.idx.next().map(|v| {
255
- let mode = if v.ends_with('/') {
256
- EntryMode::DIR
268
+ let metadata = if v.ends_with('/') {
269
+ MetadataBuilder::dir()
257
270
  } else {
258
- EntryMode::FILE
271
+ MetadataBuilder::unknown()
259
272
  };
260
- let meta = Metadata::new(mode);
261
- oio::Entry::with(v, meta)
273
+ oio::Entry::with(v, metadata.build())
262
274
  })
263
275
  }
264
276
  }
@@ -290,6 +302,7 @@ mod tests {
290
302
  type Lister = ();
291
303
  type Deleter = ();
292
304
  type Copier = ();
305
+ type Composer = ();
293
306
 
294
307
  fn info(&self) -> ServiceInfo {
295
308
  ServiceInfo::with_scheme("mock")
@@ -350,14 +363,7 @@ mod tests {
350
363
  ))
351
364
  }
352
365
 
353
- fn copy(
354
- &self,
355
- _: &OperationContext,
356
- _: &str,
357
- _: &str,
358
- _: OpCopy,
359
- _: OpCopier,
360
- ) -> Result<Self::Copier> {
366
+ fn copy(&self, _: &OperationContext, _: &str, _: &str, _: OpCopy) -> Result<Self::Copier> {
361
367
  Err(Error::new(
362
368
  ErrorKind::Unsupported,
363
369
  "operation is not supported",
@@ -422,7 +428,7 @@ mod tests {
422
428
  map.insert(entry.path().to_string(), entry.metadata().mode());
423
429
  }
424
430
 
425
- assert_eq!(map["file"], EntryMode::FILE);
431
+ assert_eq!(map["file"], EntryMode::Unknown);
426
432
  assert_eq!(map["dir/"], EntryMode::DIR);
427
433
  assert_eq!(map["dir_without_prefix/"], EntryMode::DIR);
428
434
  Ok(())
@@ -454,9 +460,9 @@ mod tests {
454
460
 
455
461
  debug!("current files: {map:?}");
456
462
 
457
- assert_eq!(map["file"], EntryMode::FILE);
463
+ assert_eq!(map["file"], EntryMode::Unknown);
458
464
  assert_eq!(map["dir/"], EntryMode::DIR);
459
- assert_eq!(map["dir_without_prefix/file"], EntryMode::FILE);
465
+ assert_eq!(map["dir_without_prefix/file"], EntryMode::Unknown);
460
466
  Ok(())
461
467
  }
462
468
 
@@ -504,9 +510,18 @@ mod tests {
504
510
  map.insert(entry.path().to_string(), entry.metadata().mode());
505
511
  }
506
512
 
507
- assert_eq!(map["dataset/stateful/ontime_2007_200.csv"], EntryMode::FILE);
508
- assert_eq!(map["dataset/stateful/ontime_2008_200.csv"], EntryMode::FILE);
509
- assert_eq!(map["dataset/stateful/ontime_2009_200.csv"], EntryMode::FILE);
513
+ assert_eq!(
514
+ map["dataset/stateful/ontime_2007_200.csv"],
515
+ EntryMode::Unknown
516
+ );
517
+ assert_eq!(
518
+ map["dataset/stateful/ontime_2008_200.csv"],
519
+ EntryMode::Unknown
520
+ );
521
+ assert_eq!(
522
+ map["dataset/stateful/ontime_2009_200.csv"],
523
+ EntryMode::Unknown
524
+ );
510
525
  Ok(())
511
526
  }
512
527
 
@@ -540,9 +555,18 @@ mod tests {
540
555
 
541
556
  debug!("current files: {map:?}");
542
557
 
543
- assert_eq!(map["dataset/stateful/ontime_2007_200.csv"], EntryMode::FILE);
544
- assert_eq!(map["dataset/stateful/ontime_2008_200.csv"], EntryMode::FILE);
545
- assert_eq!(map["dataset/stateful/ontime_2009_200.csv"], EntryMode::FILE);
558
+ assert_eq!(
559
+ map["dataset/stateful/ontime_2007_200.csv"],
560
+ EntryMode::Unknown
561
+ );
562
+ assert_eq!(
563
+ map["dataset/stateful/ontime_2008_200.csv"],
564
+ EntryMode::Unknown
565
+ );
566
+ assert_eq!(
567
+ map["dataset/stateful/ontime_2009_200.csv"],
568
+ EntryMode::Unknown
569
+ );
546
570
  Ok(())
547
571
  }
548
572
  }
@@ -33,7 +33,7 @@ all-features = true
33
33
 
34
34
  [dependencies]
35
35
  log = { workspace = true }
36
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
36
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
37
37
 
38
38
  [dev-dependencies]
39
- opendal-core = { path = "../../core", version = "0.58.1" }
39
+ opendal-core = { path = "../../core", version = "0.59.0" }
@@ -267,6 +267,7 @@ impl<I: LoggingInterceptor> Service for LoggingService<I> {
267
267
  type Lister = LoggingLister<oio::Lister, I>;
268
268
  type Deleter = LoggingDeleter<oio::Deleter, I>;
269
269
  type Copier = LoggingCopier<oio::Copier, I>;
270
+ type Composer = oio::Composer;
270
271
 
271
272
  fn info(&self) -> ServiceInfo {
272
273
  self.info.clone()
@@ -276,6 +277,10 @@ impl<I: LoggingInterceptor> Service for LoggingService<I> {
276
277
  self.inner.capability()
277
278
  }
278
279
 
280
+ fn compose(&self, ctx: &OperationContext, to: &str, args: OpCompose) -> Result<Self::Composer> {
281
+ self.inner.compose(ctx, to, args)
282
+ }
283
+
279
284
  async fn create_dir(
280
285
  &self,
281
286
  ctx: &OperationContext,
@@ -370,11 +375,10 @@ impl<I: LoggingInterceptor> Service for LoggingService<I> {
370
375
  from: &str,
371
376
  to: &str,
372
377
  args: OpCopy,
373
- opts: OpCopier,
374
378
  ) -> Result<Self::Copier> {
375
379
  self.log_start(Operation::Copy, &[("from", from), ("to", to)]);
376
380
  self.inner
377
- .copy(ctx, from, to, args, opts)
381
+ .copy(ctx, from, to, args)
378
382
  .map(|c| {
379
383
  self.logger.log(
380
384
  &self.info,
@@ -413,6 +417,18 @@ impl<I: LoggingInterceptor> Service for LoggingService<I> {
413
417
  result
414
418
  }
415
419
 
420
+ async fn restore(
421
+ &self,
422
+ ctx: &OperationContext,
423
+ path: &str,
424
+ args: OpRestore,
425
+ ) -> Result<RpRestore> {
426
+ self.log_start(Operation::Restore, &[("path", path)]);
427
+ let result = self.inner.restore(ctx, path, args).await;
428
+ self.log_finish(Operation::Restore, &[("path", path)], result.as_ref().err());
429
+ result
430
+ }
431
+
416
432
  fn list(&self, ctx: &OperationContext, path: &str, args: OpList) -> Result<Self::Lister> {
417
433
  self.log_start(Operation::List, &[("path", path)]);
418
434
  self.inner
@@ -639,6 +655,34 @@ impl<W: oio::Write, I: LoggingInterceptor> oio::Write for LoggingWriter<W, I> {
639
655
  }
640
656
  }
641
657
 
658
+ async fn copy_from(&mut self, path: &str, args: OpRead, range: BytesRange) -> Result<()> {
659
+ let size = range
660
+ .size()
661
+ .expect("writer copy range must be absolute and bounded");
662
+
663
+ match self.inner.copy_from(path, args, range).await {
664
+ Ok(()) => {
665
+ self.written += size;
666
+ Ok(())
667
+ }
668
+ Err(err) => {
669
+ self.logger.log(
670
+ &self.info,
671
+ Operation::Write,
672
+ &[
673
+ ("path", &self.path),
674
+ ("source", path),
675
+ ("written", &self.written.to_string()),
676
+ ("size", &size.to_string()),
677
+ ],
678
+ "failed",
679
+ Some(&err),
680
+ );
681
+ Err(err)
682
+ }
683
+ }
684
+ }
685
+
642
686
  async fn abort(&mut self) -> Result<()> {
643
687
  match self.inner.abort().await {
644
688
  Ok(_) => {
@@ -33,8 +33,8 @@ all-features = true
33
33
 
34
34
  [dependencies]
35
35
  metrics = "0.24"
36
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
37
- opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.58.1", default-features = false }
36
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
37
+ opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.59.0", default-features = false }
38
38
 
39
39
  [dev-dependencies]
40
- opendal-core = { path = "../../core", version = "0.58.1" }
40
+ opendal-core = { path = "../../core", version = "0.59.0" }
@@ -33,9 +33,9 @@ all-features = true
33
33
 
34
34
  [dependencies]
35
35
  mime_guess = "2.0.5"
36
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
36
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
37
37
 
38
38
  [dev-dependencies]
39
39
  futures = { workspace = true }
40
- opendal-core = { path = "../../core", version = "0.58.1" }
40
+ opendal-core = { path = "../../core", version = "0.59.0" }
41
41
  tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@@ -96,7 +96,19 @@ fn opwrite_with_mime(path: &str, op: OpWrite) -> OpWrite {
96
96
  }
97
97
 
98
98
  if let Some(mime) = mime_from_path(path) {
99
- return op.with_content_type(mime);
99
+ return op.into_content_type(mime);
100
+ }
101
+
102
+ op
103
+ }
104
+
105
+ fn opcompose_with_mime(path: &str, op: OpCompose) -> OpCompose {
106
+ if op.content_type().is_some() {
107
+ return op;
108
+ }
109
+
110
+ if let Some(mime) = mime_from_path(path) {
111
+ return op.into_content_type(mime);
100
112
  }
101
113
 
102
114
  op
@@ -109,7 +121,9 @@ fn rpstat_with_mime(path: &str, rp: RpStat) -> RpStat {
109
121
  }
110
122
 
111
123
  if let Some(mime) = mime_from_path(path) {
112
- return metadata.with_content_type(mime.into());
124
+ let mut metadata = metadata.into_builder();
125
+ metadata.content_type(mime);
126
+ return metadata.build();
113
127
  }
114
128
 
115
129
  metadata
@@ -122,6 +136,7 @@ impl Service for MimeGuessAccessor {
122
136
  type Lister = oio::Lister;
123
137
  type Deleter = oio::Deleter;
124
138
  type Copier = oio::Copier;
139
+ type Composer = oio::Composer;
125
140
 
126
141
  fn info(&self) -> ServiceInfo {
127
142
  self.0.info()
@@ -154,9 +169,12 @@ impl Service for MimeGuessAccessor {
154
169
  from: &str,
155
170
  to: &str,
156
171
  args: OpCopy,
157
- opts: OpCopier,
158
172
  ) -> Result<Self::Copier> {
159
- self.0.copy(ctx, from, to, args, opts)
173
+ self.0.copy(ctx, from, to, args)
174
+ }
175
+
176
+ fn compose(&self, ctx: &OperationContext, to: &str, args: OpCompose) -> Result<Self::Composer> {
177
+ self.0.compose(ctx, to, opcompose_with_mime(to, args))
160
178
  }
161
179
 
162
180
  async fn stat(&self, ctx: &OperationContext, path: &str, args: OpStat) -> Result<RpStat> {
@@ -176,6 +194,15 @@ impl Service for MimeGuessAccessor {
176
194
  self.0.rename(ctx, from, to, args).await
177
195
  }
178
196
 
197
+ async fn restore(
198
+ &self,
199
+ ctx: &OperationContext,
200
+ path: &str,
201
+ args: OpRestore,
202
+ ) -> Result<RpRestore> {
203
+ self.0.restore(ctx, path, args).await
204
+ }
205
+
179
206
  fn delete(&self, ctx: &OperationContext) -> Result<Self::Deleter> {
180
207
  self.0.delete(ctx)
181
208
  }
@@ -34,7 +34,7 @@ all-features = true
34
34
  [dependencies]
35
35
  futures = { workspace = true }
36
36
  http = { workspace = true }
37
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
37
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
38
38
 
39
39
  [dev-dependencies]
40
- tokio = { workspace = true, features = ["macros"] }
40
+ tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@@ -734,6 +734,7 @@ impl<I: MetricsIntercept> Service for MetricsAccessor<I> {
734
734
  type Lister = MetricsWrapper<oio::Lister, I>;
735
735
  type Deleter = MetricsWrapper<oio::Deleter, I>;
736
736
  type Copier = MetricsWrapper<oio::Copier, I>;
737
+ type Composer = oio::Composer;
737
738
 
738
739
  fn info(&self) -> ServiceInfo {
739
740
  self.info.clone()
@@ -743,6 +744,10 @@ impl<I: MetricsIntercept> Service for MetricsAccessor<I> {
743
744
  self.inner.capability()
744
745
  }
745
746
 
747
+ fn compose(&self, ctx: &OperationContext, to: &str, args: OpCompose) -> Result<Self::Composer> {
748
+ self.inner.compose(ctx, to, args)
749
+ }
750
+
746
751
  async fn create_dir(
747
752
  &self,
748
753
  ctx: &OperationContext,
@@ -842,7 +847,6 @@ impl<I: MetricsIntercept> Service for MetricsAccessor<I> {
842
847
  from: &str,
843
848
  to: &str,
844
849
  args: OpCopy,
845
- opts: OpCopier,
846
850
  ) -> Result<Self::Copier> {
847
851
  let labels = MetricLabels::new(self.info.clone(), Operation::Copy.into_static());
848
852
 
@@ -853,7 +857,7 @@ impl<I: MetricsIntercept> Service for MetricsAccessor<I> {
853
857
  let mut guard =
854
858
  ExecutingGuard::new_operation(self.interceptor.clone(), labels.clone(), start);
855
859
 
856
- match self.inner.copy(ctx, from, to, args, opts.clone()) {
860
+ match self.inner.copy(ctx, from, to, args) {
857
861
  Ok(copier) => {
858
862
  guard.defuse();
859
863
  Ok(MetricsWrapper::new(
@@ -911,6 +915,41 @@ impl<I: MetricsIntercept> Service for MetricsAccessor<I> {
911
915
  res
912
916
  }
913
917
 
918
+ async fn restore(
919
+ &self,
920
+ ctx: &OperationContext,
921
+ path: &str,
922
+ args: OpRestore,
923
+ ) -> Result<RpRestore> {
924
+ let labels = MetricLabels::new(self.info.clone(), Operation::Restore.into_static());
925
+ let start = Instant::now();
926
+
927
+ self.interceptor
928
+ .observe(labels.clone(), MetricValue::OperationExecuting(1));
929
+ let mut guard =
930
+ ExecutingGuard::new_operation(self.interceptor.clone(), labels.clone(), start);
931
+
932
+ let res = self
933
+ .inner
934
+ .restore(ctx, path, args)
935
+ .await
936
+ .inspect(|_| {
937
+ self.interceptor.observe(
938
+ labels.clone(),
939
+ MetricValue::OperationDurationSeconds(start.elapsed()),
940
+ );
941
+ })
942
+ .inspect_err(|err| {
943
+ self.interceptor.observe(
944
+ labels.clone().with_error(err.kind()),
945
+ MetricValue::OperationErrorsTotal,
946
+ );
947
+ });
948
+
949
+ guard.complete();
950
+ res
951
+ }
952
+
914
953
  async fn stat(&self, ctx: &OperationContext, path: &str, args: OpStat) -> Result<RpStat> {
915
954
  let labels = MetricLabels::new(self.info.clone(), Operation::Stat.into_static());
916
955
 
@@ -1217,6 +1256,20 @@ impl<R: oio::Write, I: MetricsIntercept> oio::Write for MetricsWrapper<R, I> {
1217
1256
  .inspect_err(|err| self.record_error(err))
1218
1257
  }
1219
1258
 
1259
+ async fn copy_from(&mut self, path: &str, args: OpRead, range: BytesRange) -> Result<()> {
1260
+ let size = range
1261
+ .size()
1262
+ .expect("writer copy range must be absolute and bounded");
1263
+
1264
+ self.inner
1265
+ .copy_from(path, args, range)
1266
+ .await
1267
+ .inspect(|_| {
1268
+ self.size += size;
1269
+ })
1270
+ .inspect_err(|err| self.record_error(err))
1271
+ }
1272
+
1220
1273
  async fn close(&mut self) -> Result<Metadata> {
1221
1274
  let result = self
1222
1275
  .inner
@@ -32,11 +32,11 @@ 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 }
36
- opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.58.1" }
35
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
36
+ opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.59.0" }
37
37
  opentelemetry = { version = "0.32.0", default-features = false, features = [
38
38
  "metrics",
39
39
  ] }
40
40
 
41
41
  [dev-dependencies]
42
- opendal-core = { path = "../../core", version = "0.58.1" }
42
+ opendal-core = { path = "../../core", version = "0.59.0" }
@@ -32,10 +32,10 @@ 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
  opentelemetry = { version = "0.32.0", default-features = false, features = [
37
37
  "trace",
38
38
  ] }
39
39
 
40
40
  [dev-dependencies]
41
- opendal-core = { path = "../../core", version = "0.58.1" }
41
+ opendal-core = { path = "../../core", version = "0.59.0" }
@@ -94,6 +94,7 @@ impl Service for OtelTraceService {
94
94
  type Lister = OtelTraceWrapper<oio::Lister>;
95
95
  type Deleter = oio::Deleter;
96
96
  type Copier = oio::Copier;
97
+ type Composer = oio::Composer;
97
98
 
98
99
  fn info(&self) -> ServiceInfo {
99
100
  let tracer = global::tracer("opendal");
@@ -104,6 +105,10 @@ impl Service for OtelTraceService {
104
105
  self.inner.capability()
105
106
  }
106
107
 
108
+ fn compose(&self, ctx: &OperationContext, to: &str, args: OpCompose) -> Result<Self::Composer> {
109
+ self.inner.compose(ctx, to, args)
110
+ }
111
+
107
112
  async fn create_dir(
108
113
  &self,
109
114
  ctx: &OperationContext,
@@ -149,7 +154,6 @@ impl Service for OtelTraceService {
149
154
  from: &str,
150
155
  to: &str,
151
156
  args: OpCopy,
152
- opts: OpCopier,
153
157
  ) -> Result<Self::Copier> {
154
158
  let tracer = global::tracer("opendal");
155
159
  let mut span = tracer.start("copy");
@@ -158,7 +162,7 @@ impl Service for OtelTraceService {
158
162
  span.set_attribute(KeyValue::new("args", format!("{args:?}")));
159
163
  let cx = TraceContext::current_with_span(span);
160
164
  let _guard = cx.attach();
161
- self.inner.copy(ctx, from, to, args, opts)
165
+ self.inner.copy(ctx, from, to, args)
162
166
  }
163
167
 
164
168
  async fn rename(
@@ -180,6 +184,20 @@ impl Service for OtelTraceService {
180
184
  .await
181
185
  }
182
186
 
187
+ async fn restore(
188
+ &self,
189
+ ctx: &OperationContext,
190
+ path: &str,
191
+ args: OpRestore,
192
+ ) -> Result<RpRestore> {
193
+ let tracer = global::tracer("opendal");
194
+ let mut span = tracer.start("restore");
195
+ span.set_attribute(KeyValue::new("path", path.to_string()));
196
+ span.set_attribute(KeyValue::new("args", format!("{args:?}")));
197
+ let cx = TraceContext::current_with_span(span);
198
+ self.inner.restore(ctx, path, args).with_context(cx).await
199
+ }
200
+
183
201
  async fn stat(&self, ctx: &OperationContext, path: &str, args: OpStat) -> Result<RpStat> {
184
202
  let tracer = global::tracer("opendal");
185
203
  let mut span = tracer.start("stat");
@@ -265,6 +283,13 @@ impl<R: oio::Write> oio::Write for OtelTraceWrapper<R> {
265
283
  self.inner.write(bs).with_context(self.cx.clone()).await
266
284
  }
267
285
 
286
+ async fn copy_from(&mut self, path: &str, args: OpRead, range: BytesRange) -> Result<()> {
287
+ self.inner
288
+ .copy_from(path, args, range)
289
+ .with_context(self.cx.clone())
290
+ .await
291
+ }
292
+
268
293
  async fn abort(&mut self) -> Result<()> {
269
294
  self.inner.abort().with_context(self.cx.clone()).await
270
295
  }
@@ -32,11 +32,11 @@ 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 }
36
- opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.58.1" }
35
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
36
+ opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.59.0" }
37
37
  prometheus = { version = "0.14", features = ["process"] }
38
38
 
39
39
  [dev-dependencies]
40
40
  log = { workspace = true }
41
- opendal-core = { path = "../../core", version = "0.58.1" }
41
+ opendal-core = { path = "../../core", version = "0.59.0" }
42
42
  tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@@ -32,11 +32,11 @@ 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 }
36
- opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.58.1" }
35
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
36
+ opendal-layer-observe-metrics-common = { path = "../observe-metrics-common", version = "0.59.0" }
37
37
  prometheus-client = { version = "0.25" }
38
38
 
39
39
  [dev-dependencies]
40
40
  log = { workspace = true }
41
- opendal-core = { path = "../../core", version = "0.58.1" }
41
+ opendal-core = { path = "../../core", version = "0.59.0" }
42
42
  tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@@ -34,13 +34,13 @@ all-features = true
34
34
  [dependencies]
35
35
  backon = { version = "1.6", features = ["tokio-sleep"] }
36
36
  log = { workspace = true }
37
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
37
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
38
38
 
39
39
  [dev-dependencies]
40
40
  bytes = { workspace = true }
41
41
  futures = { workspace = true }
42
42
  logforth = { workspace = true }
43
- opendal-core = { path = "../../core", version = "0.58.1" }
44
- opendal-layer-logging = { path = "../logging", version = "0.58.1" }
45
- opendal-layer-timeout = { path = "../timeout", version = "0.58.1" }
43
+ opendal-core = { path = "../../core", version = "0.59.0" }
44
+ opendal-layer-logging = { path = "../logging", version = "0.59.0" }
45
+ opendal-layer-timeout = { path = "../timeout", version = "0.59.0" }
46
46
  tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }