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
@@ -49,24 +49,28 @@ impl oio::Write for MiniMokaWriter {
49
49
  async fn close(&mut self) -> Result<Metadata> {
50
50
  let buf = self.buffer.clone().collect();
51
51
 
52
- let mut md = Metadata::new(EntryMode::from_path(&self.path));
53
- md.set_content_length(buf.len() as u64);
54
- md.set_last_modified(Timestamp::now());
52
+ let mut md = if self.path.ends_with('/') {
53
+ MetadataBuilder::dir()
54
+ } else {
55
+ MetadataBuilder::file(buf.len() as u64)
56
+ };
57
+ md.last_modified(Timestamp::now());
55
58
 
56
59
  // Set metadata from OpWrite
57
60
  if let Some(content_type) = self.op.content_type() {
58
- md.set_content_type(content_type);
61
+ md.content_type(content_type);
59
62
  }
60
63
  if let Some(content_disposition) = self.op.content_disposition() {
61
- md.set_content_disposition(content_disposition);
64
+ md.content_disposition(content_disposition);
62
65
  }
63
66
  if let Some(content_encoding) = self.op.content_encoding() {
64
- md.set_content_encoding(content_encoding);
67
+ md.content_encoding(content_encoding);
65
68
  }
66
69
  if let Some(cache_control) = self.op.cache_control() {
67
- md.set_cache_control(cache_control);
70
+ md.cache_control(cache_control);
68
71
  }
69
72
 
73
+ let md = md.build();
70
74
  let value = MiniMokaValue {
71
75
  metadata: md.clone(),
72
76
  content: buf,
@@ -34,7 +34,7 @@ all-features = true
34
34
  [dependencies]
35
35
  log = { workspace = true }
36
36
  moka = { version = "0.12", features = ["future", "sync"] }
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
  serde = { workspace = true, features = ["derive"] }
39
39
 
40
40
  [dev-dependencies]
@@ -226,6 +226,7 @@ impl Service for MokaBackend {
226
226
  type Lister = oio::HierarchyLister<MokaLister>;
227
227
  type Deleter = oio::OneShotDeleter<MokaDeleter>;
228
228
  type Copier = ();
229
+ type Composer = ();
229
230
 
230
231
  fn info(&self) -> ServiceInfo {
231
232
  self.info.clone()
@@ -251,19 +252,19 @@ impl Service for MokaBackend {
251
252
  let p = build_abs_path(&self.root, path);
252
253
 
253
254
  if p == build_abs_path(&self.root, "") {
254
- Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
255
+ Ok(RpStat::new(MetadataBuilder::dir().build()))
255
256
  } else {
256
257
  // Check the exact path first
257
258
  match self.core.get(&p).await? {
258
259
  Some(value) => {
259
260
  // Use the stored metadata but override mode if necessary
260
- let mut metadata = value.metadata.clone();
261
+ let mut metadata = value.metadata.clone().into_builder();
261
262
  // If path ends with '/' but we found a file, return DIR
262
263
  // This is because CompleteLayer's create_dir creates empty files with '/' suffix
263
- if p.ends_with('/') && metadata.mode() != EntryMode::DIR {
264
- metadata.set_mode(EntryMode::DIR);
264
+ if p.ends_with('/') && value.metadata.mode() != EntryMode::DIR {
265
+ metadata.set_dir();
265
266
  }
266
- Ok(RpStat::new(metadata))
267
+ Ok(RpStat::new(metadata.build()))
267
268
  }
268
269
  None => {
269
270
  // If path ends with '/', check if there are any children
@@ -275,7 +276,7 @@ impl Service for MokaBackend {
275
276
  .any(|kv| kv.0.starts_with(&p) && kv.0.len() > p.len());
276
277
 
277
278
  if has_children {
278
- Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
279
+ Ok(RpStat::new(MetadataBuilder::dir().build()))
279
280
  } else {
280
281
  Err(Error::new(ErrorKind::NotFound, "key not found in moka"))
281
282
  }
@@ -336,7 +337,6 @@ impl Service for MokaBackend {
336
337
  _from: &str,
337
338
  _to: &str,
338
339
  _args: OpCopy,
339
- _opts: OpCopier,
340
340
  ) -> Result<Self::Copier> {
341
341
  Err(Error::new(
342
342
  ErrorKind::Unsupported,
@@ -46,7 +46,10 @@ impl oio::StreamRead for MokaReader {
46
46
  let buffer = value
47
47
  .content
48
48
  .slice(range.to_content_range(value.content.len())?);
49
- let metadata = Metadata::new(EntryMode::FILE).with_content_length(total_size);
49
+ let metadata = {
50
+ let metadata = MetadataBuilder::file(total_size);
51
+ metadata.build()
52
+ };
50
53
  Ok((
51
54
  RpRead::new(metadata),
52
55
  Box::new(buffer) as Box<dyn oio::ReadStreamDyn>,
@@ -51,22 +51,26 @@ impl oio::Write for MokaWriter {
51
51
  let length = buf.len() as u64;
52
52
 
53
53
  // Build metadata with write options
54
- let mut metadata =
55
- Metadata::new(EntryMode::from_path(&self.path)).with_content_length(length);
54
+ let mut metadata = if self.path.ends_with('/') {
55
+ MetadataBuilder::dir()
56
+ } else {
57
+ MetadataBuilder::file(length)
58
+ };
56
59
 
57
60
  if let Some(content_type) = self.op.content_type() {
58
- metadata.set_content_type(content_type);
61
+ metadata.content_type(content_type);
59
62
  }
60
63
  if let Some(content_disposition) = self.op.content_disposition() {
61
- metadata.set_content_disposition(content_disposition);
64
+ metadata.content_disposition(content_disposition);
62
65
  }
63
66
  if let Some(cache_control) = self.op.cache_control() {
64
- metadata.set_cache_control(cache_control);
67
+ metadata.cache_control(cache_control);
65
68
  }
66
69
  if let Some(content_encoding) = self.op.content_encoding() {
67
- metadata.set_content_encoding(content_encoding);
70
+ metadata.content_encoding(content_encoding);
68
71
  }
69
72
 
73
+ let metadata = metadata.build();
70
74
  let value = MokaValue {
71
75
  metadata: metadata.clone(),
72
76
  content: buf,
@@ -32,9 +32,9 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
- mea = { workspace = true }
35
+ asyncband = { workspace = true }
36
36
  mongodb = { version = "3.3.0" }
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
  serde = { workspace = true, features = ["derive"] }
39
39
 
40
40
  [dev-dependencies]
@@ -17,7 +17,7 @@
17
17
 
18
18
  use std::sync::Arc;
19
19
 
20
- use mea::once::OnceCell;
20
+ use asyncband::once::OnceCell;
21
21
 
22
22
  use super::MONGODB_SCHEME;
23
23
  use super::config::MongodbConfig;
@@ -214,6 +214,7 @@ impl Service for MongodbBackend {
214
214
  type Lister = ();
215
215
  type Deleter = oio::OneShotDeleter<MongodbDeleter>;
216
216
  type Copier = ();
217
+ type Composer = ();
217
218
 
218
219
  fn info(&self) -> ServiceInfo {
219
220
  self.info.clone()
@@ -239,12 +240,13 @@ impl Service for MongodbBackend {
239
240
  let p = build_abs_path(&self.root, path);
240
241
 
241
242
  if p == build_abs_path(&self.root, "") {
242
- Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
243
+ Ok(RpStat::new(MetadataBuilder::dir().build()))
243
244
  } else {
244
245
  match self.core.get_length(&p).await? {
245
- Some(length) => Ok(RpStat::new(
246
- Metadata::new(EntryMode::FILE).with_content_length(length as u64),
247
- )),
246
+ Some(length) => Ok(RpStat::new({
247
+ let metadata = MetadataBuilder::file(length as u64);
248
+ metadata.build()
249
+ })),
248
250
  None => Err(Error::new(ErrorKind::NotFound, "kv not found in mongodb")),
249
251
  }
250
252
  }
@@ -294,7 +296,6 @@ impl Service for MongodbBackend {
294
296
  _from: &str,
295
297
  _to: &str,
296
298
  _args: OpCopy,
297
- _opts: OpCopier,
298
299
  ) -> Result<Self::Copier> {
299
300
  Err(Error::new(
300
301
  ErrorKind::Unsupported,
@@ -17,7 +17,7 @@
17
17
 
18
18
  use std::fmt::Debug;
19
19
 
20
- use mea::once::OnceCell;
20
+ use asyncband::once::OnceCell;
21
21
  use mongodb::bson::Binary;
22
22
  use mongodb::bson::Bson;
23
23
  use mongodb::bson::Document;
@@ -46,7 +46,10 @@ impl oio::StreamRead for MongodbReader {
46
46
  }
47
47
  };
48
48
  let content = bs.slice(range.to_content_range(bs.len())?);
49
- let metadata = Metadata::new(EntryMode::FILE).with_content_length(bs.len() as u64);
49
+ let metadata = {
50
+ let metadata = MetadataBuilder::file(bs.len() as u64);
51
+ metadata.build()
52
+ };
50
53
  Ok((
51
54
  RpRead::new(metadata),
52
55
  Box::new(content) as Box<dyn oio::ReadStreamDyn>,
@@ -48,8 +48,12 @@ impl oio::Write for MongodbWriter {
48
48
  let length = buf.len() as u64;
49
49
  self.core.set(&self.path, buf).await?;
50
50
 
51
- let meta = Metadata::new(EntryMode::from_path(&self.path)).with_content_length(length);
52
- Ok(meta)
51
+ let metadata = if self.path.ends_with('/') {
52
+ MetadataBuilder::dir()
53
+ } else {
54
+ MetadataBuilder::file(length)
55
+ };
56
+ Ok(metadata.build())
53
57
  }
54
58
 
55
59
  async fn abort(&mut self) -> Result<()> {
@@ -32,16 +32,16 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
+ asyncband = { workspace = true }
35
36
  bytes = { workspace = true }
36
37
  flume = "0.12"
37
- futures = { workspace = true, features = ["std", "async-await"] }
38
38
  monoio = { version = "0.2.4", features = [
39
39
  "sync",
40
40
  "mkdirat",
41
41
  "unlinkat",
42
42
  "renameat",
43
43
  ] }
44
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
44
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
45
45
  serde = { workspace = true, features = ["derive"] }
46
46
 
47
47
  [dev-dependencies]
@@ -97,6 +97,7 @@ impl Service for MonoiofsBackend {
97
97
  type Lister = ();
98
98
  type Deleter = oio::OneShotDeleter<MonoiofsDeleter>;
99
99
  type Copier = oio::OneShotCopier;
100
+ type Composer = ();
100
101
 
101
102
  fn info(&self) -> ServiceInfo {
102
103
  self.core.info.clone()
@@ -120,12 +121,15 @@ impl Service for MonoiofsBackend {
120
121
  } else {
121
122
  EntryMode::Unknown
122
123
  };
123
- let m = Metadata::new(mode)
124
- .with_content_length(meta.len())
125
- .with_last_modified(Timestamp::try_from(
126
- meta.modified().map_err(new_std_io_error)?,
127
- )?);
128
- Ok(RpStat::new(m))
124
+ let mut m = match mode {
125
+ EntryMode::FILE => MetadataBuilder::file(meta.len()),
126
+ EntryMode::DIR => MetadataBuilder::dir(),
127
+ EntryMode::Unknown => MetadataBuilder::unknown(),
128
+ };
129
+ m.last_modified(Timestamp::try_from(
130
+ meta.modified().map_err(new_std_io_error)?,
131
+ )?);
132
+ Ok(RpStat::new(m.build()))
129
133
  }
130
134
  fn read(&self, _ctx: &OperationContext, path: &str, _args: OpRead) -> Result<Self::Reader> {
131
135
  let path = self.core.prepare_path(path)?;
@@ -200,7 +204,6 @@ impl Service for MonoiofsBackend {
200
204
  from: &str,
201
205
  to: &str,
202
206
  _args: OpCopy,
203
- _opts: OpCopier,
204
207
  ) -> Result<Self::Copier> {
205
208
  let core = self.core.clone();
206
209
  let from = self.core.prepare_path(from)?;
@@ -251,12 +254,15 @@ impl Service for MonoiofsBackend {
251
254
  buf.clear();
252
255
  }
253
256
  core.buf_pool.put(buf);
254
- Ok(())
257
+ Ok(pos)
255
258
  }
256
259
  })
257
260
  .await
258
- .map_err(new_std_io_error)?;
259
- Ok(Metadata::default())
261
+ .map_err(new_std_io_error)
262
+ .map(|size| {
263
+ let metadata = MetadataBuilder::file(size);
264
+ metadata.build()
265
+ })
260
266
  });
261
267
 
262
268
  Ok(copier)
@@ -15,15 +15,15 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
+ use std::future::Future;
18
19
  use std::mem;
19
20
  use std::path::Path;
20
21
  use std::path::PathBuf;
21
22
  use std::sync::Mutex;
22
23
 
24
+ use asyncband::oneshot;
23
25
  use flume::Receiver;
24
26
  use flume::Sender;
25
- use futures::Future;
26
- use futures::channel::oneshot;
27
27
  use monoio::FusionDriver;
28
28
  use monoio::RuntimeBuilder;
29
29
  use opendal_core::raw::*;
@@ -230,9 +230,8 @@ impl MonoiofsCore {
230
230
  mod tests {
231
231
  use std::sync::Arc;
232
232
 
233
- use futures::StreamExt;
234
- use futures::channel::mpsc::UnboundedSender;
235
- use futures::channel::mpsc::{self};
233
+ use asyncband::mpsc;
234
+ use asyncband::mpsc::UnboundedSender;
236
235
 
237
236
  use super::*;
238
237
 
@@ -261,16 +260,16 @@ mod tests {
261
260
  })
262
261
  .await;
263
262
  assert_eq!(result, sleep_millis);
264
- tx.unbounded_send(result).unwrap();
263
+ tx.send(result).unwrap();
265
264
  });
266
265
  }
267
266
 
268
267
  spawn_task(core.clone(), tx.clone(), 200);
269
268
  spawn_task(core.clone(), tx.clone(), 20);
270
269
  drop(tx);
271
- let first = rx.next().await;
272
- let second = rx.next().await;
273
- let third = rx.next().await;
270
+ let first = rx.recv().await.ok();
271
+ let second = rx.recv().await.ok();
272
+ let third = rx.recv().await.ok();
274
273
  assert_eq!(first, Some(20));
275
274
  assert_eq!(second, Some(200));
276
275
  assert_eq!(third, None);
@@ -17,9 +17,8 @@
17
17
 
18
18
  use super::core::MonoiofsCore;
19
19
  use super::writer::MonoiofsWriter;
20
- use futures::StreamExt;
21
- use futures::channel::mpsc;
22
- use futures::channel::oneshot;
20
+ use asyncband::mpsc;
21
+ use asyncband::oneshot;
23
22
  use monoio::fs::OpenOptions;
24
23
  use opendal_core::raw::*;
25
24
  use opendal_core::*;
@@ -76,7 +75,7 @@ impl MonoiofsReader {
76
75
  };
77
76
  // wait for read request and send back result to main thread
78
77
  loop {
79
- let Some(req) = rx.next().await else {
78
+ let Ok(req) = rx.recv().await else {
80
79
  // MonoiofsReader is dropped, exit worker task
81
80
  break;
82
81
  };
@@ -104,12 +103,11 @@ impl MonoiofsReader {
104
103
 
105
104
  // send read request to worker thread and wait for result
106
105
  let (tx, rx) = oneshot::channel();
107
- self.core
108
- .unwrap(self.tx.unbounded_send(ReaderRequest::Read {
109
- offset,
110
- buf: vec![0; size].into_boxed_slice(),
111
- tx,
112
- }));
106
+ self.core.unwrap(self.tx.send(ReaderRequest::Read {
107
+ offset,
108
+ buf: vec![0; size].into_boxed_slice(),
109
+ tx,
110
+ }));
113
111
  let (n, buf) = self.core.unwrap(rx.await)?;
114
112
 
115
113
  let mut buf = Vec::from(buf);
@@ -18,12 +18,10 @@
18
18
  use std::path::PathBuf;
19
19
  use std::sync::Arc;
20
20
 
21
+ use asyncband::mpsc;
22
+ use asyncband::oneshot;
21
23
  use bytes::Buf;
22
24
  use bytes::Bytes;
23
- use futures::SinkExt;
24
- use futures::StreamExt;
25
- use futures::channel::mpsc;
26
- use futures::channel::oneshot;
27
25
  use monoio::fs::OpenOptions;
28
26
  use opendal_core::raw::*;
29
27
  use opendal_core::*;
@@ -93,7 +91,7 @@ impl MonoiofsWriter {
93
91
  };
94
92
  // wait for write or close request and send back result to main thread
95
93
  loop {
96
- let Some(req) = rx.next().await else {
94
+ let Ok(req) = rx.recv().await else {
97
95
  // MonoiofsWriter is dropped, exit worker task
98
96
  break;
99
97
  };
@@ -131,15 +129,11 @@ impl oio::Write for MonoiofsWriter {
131
129
  let buf = bs.current();
132
130
  let n = buf.len();
133
131
  let (tx, rx) = oneshot::channel();
134
- self.core.unwrap(
135
- self.tx
136
- .send(WriterRequest::Write {
137
- pos: self.pos,
138
- buf,
139
- tx,
140
- })
141
- .await,
142
- );
132
+ self.core.unwrap(self.tx.send(WriterRequest::Write {
133
+ pos: self.pos,
134
+ buf,
135
+ tx,
136
+ }));
143
137
  self.core.unwrap(rx.await)?;
144
138
  self.pos += n as u64;
145
139
  bs.advance(n);
@@ -152,13 +146,11 @@ impl oio::Write for MonoiofsWriter {
152
146
  /// on worker thread.
153
147
  async fn close(&mut self) -> Result<Metadata> {
154
148
  let (tx, rx) = oneshot::channel();
155
- self.core
156
- .unwrap(self.tx.send(WriterRequest::Stat { tx }).await);
149
+ self.core.unwrap(self.tx.send(WriterRequest::Stat { tx }));
157
150
  let file_meta = self.core.unwrap(rx.await)?;
158
151
 
159
152
  let (tx, rx) = oneshot::channel();
160
- self.core
161
- .unwrap(self.tx.send(WriterRequest::Close { tx }).await);
153
+ self.core.unwrap(self.tx.send(WriterRequest::Close { tx }));
162
154
  self.core.unwrap(rx.await)?;
163
155
 
164
156
  let mode = if file_meta.is_dir() {
@@ -168,12 +160,15 @@ impl oio::Write for MonoiofsWriter {
168
160
  } else {
169
161
  EntryMode::Unknown
170
162
  };
171
- let meta = Metadata::new(mode)
172
- .with_content_length(file_meta.len())
173
- .with_last_modified(Timestamp::try_from(
174
- file_meta.modified().map_err(new_std_io_error)?,
175
- )?);
176
- Ok(meta)
163
+ let mut meta = match mode {
164
+ EntryMode::FILE => MetadataBuilder::file(file_meta.len()),
165
+ EntryMode::DIR => MetadataBuilder::dir(),
166
+ EntryMode::Unknown => MetadataBuilder::unknown(),
167
+ };
168
+ meta.last_modified(Timestamp::try_from(
169
+ file_meta.modified().map_err(new_std_io_error)?,
170
+ )?);
171
+ Ok(meta.build())
177
172
  }
178
173
 
179
174
  async fn abort(&mut self) -> Result<()> {
@@ -32,8 +32,8 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
- mea = { workspace = true }
36
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false }
35
+ asyncband = { workspace = true }
36
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false }
37
37
  serde = { workspace = true, features = ["derive"] }
38
38
  sqlx = { version = "0.8.0", features = ["runtime-tokio-rustls", "mysql"] }
39
39
 
@@ -18,7 +18,7 @@
18
18
  use std::fmt::Debug;
19
19
  use std::sync::Arc;
20
20
 
21
- use mea::once::OnceCell;
21
+ use asyncband::once::OnceCell;
22
22
  use sqlx::mysql::MySqlConnectOptions;
23
23
 
24
24
  use super::MYSQL_SCHEME;
@@ -195,6 +195,7 @@ impl Service for MysqlBackend {
195
195
  type Lister = oio::HierarchyLister<MysqlLazyLister>;
196
196
  type Deleter = oio::OneShotDeleter<MysqlDeleter>;
197
197
  type Copier = ();
198
+ type Composer = ();
198
199
 
199
200
  fn info(&self) -> ServiceInfo {
200
201
  self.info.clone()
@@ -220,12 +221,13 @@ impl Service for MysqlBackend {
220
221
  let p = build_abs_path(&self.root, path);
221
222
 
222
223
  if p == build_abs_path(&self.root, "") {
223
- Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
224
+ Ok(RpStat::new(MetadataBuilder::dir().build()))
224
225
  } else {
225
226
  match self.core.get_length(&p).await? {
226
- Some(length) => Ok(RpStat::new(
227
- Metadata::new(EntryMode::FILE).with_content_length(length as u64),
228
- )),
227
+ Some(length) => Ok(RpStat::new({
228
+ let metadata = MetadataBuilder::file(length as u64);
229
+ metadata.build()
230
+ })),
229
231
  None => Err(Error::new(ErrorKind::NotFound, "kv not found in mysql")),
230
232
  }
231
233
  }
@@ -279,7 +281,6 @@ impl Service for MysqlBackend {
279
281
  _from: &str,
280
282
  _to: &str,
281
283
  _args: OpCopy,
282
- _opts: OpCopier,
283
284
  ) -> Result<Self::Copier> {
284
285
  Err(Error::new(
285
286
  ErrorKind::Unsupported,
@@ -15,7 +15,7 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
- use mea::once::OnceCell;
18
+ use asyncband::once::OnceCell;
19
19
  use sqlx::MySqlPool;
20
20
  use sqlx::mysql::MySqlConnectOptions;
21
21
 
@@ -18,10 +18,10 @@
18
18
  use std::sync::Arc;
19
19
  use std::vec::IntoIter;
20
20
 
21
+ use opendal_core::MetadataBuilder;
21
22
  use opendal_core::Result;
22
23
  use opendal_core::raw::oio::{Entry, List};
23
24
  use opendal_core::raw::{build_abs_path, build_rel_path};
24
- use opendal_core::{EntryMode, Metadata};
25
25
 
26
26
  use super::core::MysqlCore;
27
27
 
@@ -47,8 +47,12 @@ impl List for MysqlLister {
47
47
  if path.is_empty() {
48
48
  path = "/".to_string();
49
49
  }
50
- let meta = Metadata::new(EntryMode::from_path(&path));
51
- Ok(Some(Entry::new(&path, meta)))
50
+ let meta = if path.ends_with('/') {
51
+ MetadataBuilder::dir()
52
+ } else {
53
+ MetadataBuilder::unknown()
54
+ };
55
+ Ok(Some(Entry::new(&path, meta.build())))
52
56
  }
53
57
  }
54
58
 
@@ -45,7 +45,10 @@ impl oio::StreamRead for MysqlReader {
45
45
  None => return Err(Error::new(ErrorKind::NotFound, "kv not found in mysql")),
46
46
  };
47
47
  let content = bs.slice(range.to_content_range(bs.len())?);
48
- let metadata = Metadata::new(EntryMode::FILE).with_content_length(bs.len() as u64);
48
+ let metadata = {
49
+ let metadata = MetadataBuilder::file(bs.len() as u64);
50
+ metadata.build()
51
+ };
49
52
  Ok((
50
53
  RpRead::new(metadata),
51
54
  Box::new(content) as Box<dyn oio::ReadStreamDyn>,
@@ -48,8 +48,12 @@ impl oio::Write for MysqlWriter {
48
48
  let length = buf.len() as u64;
49
49
  self.core.set(&self.path, buf).await?;
50
50
 
51
- let meta = Metadata::new(EntryMode::from_path(&self.path)).with_content_length(length);
52
- Ok(meta)
51
+ let metadata = if self.path.ends_with('/') {
52
+ MetadataBuilder::dir()
53
+ } else {
54
+ MetadataBuilder::file(length)
55
+ };
56
+ Ok(metadata.build())
53
57
  }
54
58
 
55
59
  async fn abort(&mut self) -> Result<()> {
@@ -35,7 +35,7 @@ all-features = true
35
35
  bytes = { workspace = true }
36
36
  http = { workspace = true }
37
37
  log = { workspace = true }
38
- opendal-core = { path = "../../core", version = "0.58.1", default-features = false, features = [
38
+ opendal-core = { path = "../../core", version = "0.59.0", default-features = false, features = [
39
39
  "reqsign",
40
40
  ] }
41
41
  quick-xml = { workspace = true, features = ["serialize", "overlapped-lists"] }