You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by gi...@apache.org on 2023/09/11 12:00:52 UTC

[incubator-opendal] branch gh-pages updated: deploy: 587e2d9774a50d3ca2df2de6c8ed0efd4513ad5e

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new 291f9abc6 deploy: 587e2d9774a50d3ca2df2de6c8ed0efd4513ad5e
291f9abc6 is described below

commit 291f9abc658be29dab9f18facd4901d3cfdc3d11
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Mon Sep 11 12:00:47 2023 +0000

    deploy: 587e2d9774a50d3ca2df2de6c8ed0efd4513ad5e
---
 404.html                                           |   4 +-
 .../{054cd2fb.e6517e41.js => 054cd2fb.ffb527e7.js} |   2 +-
 .../{093f5f04.104e1b0e.js => 093f5f04.6e5572d0.js} |   2 +-
 .../{136e1c50.1d8821e3.js => 136e1c50.023c8aa7.js} |   2 +-
 .../{151cd40f.57df495a.js => 151cd40f.83604438.js} |   2 +-
 .../{1957547a.803f53fc.js => 1957547a.c062933e.js} |   2 +-
 .../{1db64337.6cc781b8.js => 1db64337.cbf0a55b.js} |   2 +-
 .../{22d8fa67.0e396cd1.js => 22d8fa67.98a75e91.js} |   2 +-
 .../{29b208a4.47c0b356.js => 29b208a4.ac52d31b.js} |   2 +-
 .../{2cbf1097.670717b2.js => 2cbf1097.e0cfd334.js} |   2 +-
 .../{434bbc94.a9c16daa.js => 434bbc94.96255f74.js} |   2 +-
 .../{57a16c1d.df646dfc.js => 57a16c1d.46891952.js} |   2 +-
 .../{592d1076.04eb6980.js => 592d1076.0ae8eebe.js} |   2 +-
 assets/js/5a65e608.2ac8af6c.js                     |   1 +
 assets/js/5a65e608.b4764d22.js                     |   1 -
 .../{62a401e9.652f09a7.js => 62a401e9.d12b7bd4.js} |   2 +-
 assets/js/6eb7fe18.9116c04b.js                     |   1 -
 assets/js/6eb7fe18.e93ec92e.js                     |   1 +
 .../{7263c0b5.43e09b14.js => 7263c0b5.0fd4bbe9.js} |   2 +-
 .../{8b18d929.8ceefe58.js => 8b18d929.e9207660.js} |   2 +-
 .../{8cc9519e.1047d63d.js => 8cc9519e.b4dcd383.js} |   2 +-
 .../{8f4159f2.fe472a35.js => 8f4159f2.6fa43018.js} |   2 +-
 .../{939f74f6.3d6bb51d.js => 939f74f6.6827802a.js} |   2 +-
 assets/js/9fedeb09.7c621d96.js                     |   1 -
 assets/js/9fedeb09.f22a66f0.js                     |   1 +
 .../{a0405932.8866a0eb.js => a0405932.c49d0839.js} |   2 +-
 .../{ab10c306.a2ded611.js => ab10c306.3b7e16ca.js} |   2 +-
 assets/js/ae4554eb.1bd1899d.js                     |   1 +
 assets/js/ae4554eb.22e02005.js                     |   1 -
 .../{b114cefa.8b0eb00c.js => b114cefa.88a4d663.js} |   2 +-
 .../{b56f9725.c0474bd9.js => b56f9725.cde2091d.js} |   2 +-
 assets/js/b9ae8b37.6477b57b.js                     |   1 +
 assets/js/b9ae8b37.701aef90.js                     |   1 -
 .../{bb5b2057.b5dd41a2.js => bb5b2057.5ddf8943.js} |   2 +-
 .../{c46c6b55.e47a90fc.js => c46c6b55.22cb52e7.js} |   2 +-
 assets/js/c6ab695b.734aa24b.js                     |   1 -
 assets/js/c6ab695b.f33ce4aa.js                     |   1 +
 .../{cc62039a.6b3c7e6d.js => cc62039a.f1aaa670.js} |   2 +-
 .../{d3c0d8d5.3cc78604.js => d3c0d8d5.0dd646b9.js} |   2 +-
 assets/js/d5c31a96.6a9964d0.js                     |   1 +
 assets/js/d5c31a96.a7e4aa66.js                     |   1 -
 .../{ddccef4c.54e9c1dd.js => ddccef4c.392c5f84.js} |   2 +-
 .../{e892cec6.344b2ac5.js => e892cec6.9b0e62e1.js} |   2 +-
 .../{f1ca5a39.6b465a9c.js => f1ca5a39.15e1137c.js} |   2 +-
 .../{f9145722.f4555dda.js => f9145722.85d0ecb8.js} |   2 +-
 .../{fde7cc64.12695c45.js => fde7cc64.6c9d94a7.js} |   2 +-
 assets/js/runtime~main.7f4312ee.js                 |   1 -
 assets/js/runtime~main.dbce9659.js                 |   1 +
 blog/archive/index.html                            |   4 +-
 blog/how-opendal-read-data/index.html              |   4 +-
 blog/index.html                                    |   4 +-
 blog/opendal-access-data-freely/index.html         |   4 +-
 blog/opendal-entered-apache-incubator/index.html   |   4 +-
 blog/tags/announcement/index.html                  |   4 +-
 blog/tags/index.html                               |   4 +-
 blog/tags/internal/index.html                      |   4 +-
 docs/category/contributing/index.html              |   4 +-
 docs/category/reference/index.html                 |   4 +-
 docs/category/services/index.html                  |   4 +-
 docs/contributing/committer/index.html             |   6 +-
 docs/contributing/podling-report/index.html        |   6 +-
 .../reference/generate_release_note/index.html     |   6 +-
 docs/contributing/reference/setup_gpg/index.html   |   6 +-
 docs/contributing/release/index.html               |   6 +-
 docs/contributing/verify/index.html                |   6 +-
 docs/lua/classes/opendal.metadata.html             |   2 +-
 docs/lua/classes/opendal.operator.html             |   2 +-
 docs/lua/index.html                                |   2 +-
 docs/nodejs/classes/BlockingLister.html            |   4 +-
 docs/nodejs/classes/Entry.html                     |   4 +-
 docs/nodejs/classes/Lister.html                    |   4 +-
 docs/nodejs/classes/Metadata.html                  |  18 +-
 docs/nodejs/classes/Operator.html                  |  58 +-
 docs/nodejs/interfaces/PresignedRequest.html       |   8 +-
 docs/overview/index.html                           |   6 +-
 docs/python/opendal.html                           |  60 +--
 docs/python/search.js                              |   2 +-
 docs/rust/implementors/core/clone/trait.Clone.js   |   2 +-
 docs/rust/implementors/core/cmp/trait.Eq.js        |   2 +-
 docs/rust/implementors/core/convert/trait.From.js  |   2 +-
 .../implementors/core/default/trait.Default.js     |   2 +-
 docs/rust/implementors/core/fmt/trait.Debug.js     |   2 +-
 docs/rust/implementors/core/marker/trait.Copy.js   |   2 +-
 docs/rust/implementors/core/marker/trait.Freeze.js |   2 +-
 docs/rust/implementors/core/marker/trait.Send.js   |   2 +-
 .../implementors/core/marker/trait.StructuralEq.js |   2 +-
 docs/rust/implementors/core/marker/trait.Sync.js   |   2 +-
 docs/rust/implementors/core/marker/trait.Unpin.js  |   2 +-
 .../core/panic/unwind_safe/trait.RefUnwindSafe.js  |   2 +-
 .../core/panic/unwind_safe/trait.UnwindSafe.js     |   2 +-
 .../opendal/raw/oio/write/api/trait.WriteExt.js    |   3 +
 docs/rust/opendal/all.html                         |   2 +-
 docs/rust/opendal/layers/struct.BlockingLayer.html |   6 +-
 docs/rust/opendal/layers/struct.LoggingLayer.html  |  10 +-
 docs/rust/opendal/layers/struct.MadsimServer.html  |   6 +-
 .../rust/opendal/layers/struct.OtelTraceLayer.html |   4 +-
 .../opendal/raw/adapters/kv/struct.Backend.html    |  36 +-
 .../raw/adapters/typed_kv/struct.Backend.html      |  36 +-
 .../rust/opendal/raw/oio/enum.ThreeWaysWriter.html |  25 +-
 docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html  |  25 +-
 docs/rust/opendal/raw/oio/enum.WriteOperation.html |  16 +-
 .../oio/fn.into_cloneable_reader_within_std.html   |   2 +-
 .../oio/fn.into_cloneable_reader_within_tokio.html |   2 +-
 .../opendal/raw/oio/fn.into_read_from_stream.html  |   2 +-
 docs/rust/opendal/raw/oio/index.html               |   6 +-
 docs/rust/opendal/raw/oio/sidebar-items.js         |   2 +-
 .../opendal/raw/oio/struct.AppendObjectWriter.html |  31 +-
 .../raw/oio/struct.CloneableReaderWithinStd.html   |  10 +-
 .../raw/oio/struct.CloneableReaderWithinTokio.html |  10 +-
 .../opendal/raw/oio/struct.ExactBufWriter.html     |  27 +-
 .../opendal/raw/oio/struct.FromStreamReader.html   |   8 +-
 .../raw/oio/struct.MultipartUploadPart.html        |  10 +-
 .../raw/oio/struct.MultipartUploadWriter.html      |  37 +-
 .../rust/opendal/raw/oio/struct.OneShotWriter.html |  29 +-
 docs/rust/opendal/raw/oio/struct.RangeWriter.html  |  31 ++
 .../opendal/raw/oio/trait.AppendObjectWrite.html   |   6 +-
 docs/rust/opendal/raw/oio/trait.BlockingWrite.html |  10 +-
 .../raw/oio/trait.MultipartUploadWrite.html        |  15 +-
 docs/rust/opendal/raw/oio/trait.OneShotWrite.html  |  16 +-
 docs/rust/opendal/raw/oio/trait.RangeWrite.html    |  84 +++
 docs/rust/opendal/raw/oio/trait.Read.html          |   2 +-
 docs/rust/opendal/raw/oio/trait.Write.html         |  94 +---
 docs/rust/opendal/raw/oio/trait.WriteBuf.html      |  14 +-
 docs/rust/opendal/raw/oio/trait.WriteExt.html      |  11 +
 docs/rust/opendal/raw/oio/type.BlockingWriter.html |   2 +-
 docs/rust/opendal/raw/oio/type.Writer.html         |   2 +-
 .../opendal/raw/oio/write/api/trait.WriteExt.html  |  11 +
 .../oio/write/range_write/struct.RangeWriter.html  |  11 +
 .../oio/write/range_write/trait.RangeWrite.html    |  11 +
 docs/rust/opendal/raw/trait.Accessor.html          |   2 +-
 docs/rust/opendal/raw/trait.Layer.html             |   2 +-
 docs/rust/opendal/services/struct.Azblob.html      |  30 +-
 docs/rust/opendal/services/struct.Gcs.html         |  28 +-
 docs/rust/opendal/struct.BlockingWriter.html       |   8 +-
 docs/rust/opendal/struct.Error.html                |   6 +-
 docs/rust/opendal/struct.Operator.html             |  74 +--
 docs/rust/opendal/struct.Writer.html               |  28 +-
 docs/rust/opendal/trait.Builder.html               |   2 +-
 docs/rust/search-index.js                          |   2 +-
 docs/rust/source-files.js                          |   2 +-
 docs/rust/src/opendal/layers/blocking.rs.html      |  10 +-
 docs/rust/src/opendal/layers/complete.rs.html      |  28 +-
 .../src/opendal/layers/concurrent_limit.rs.html    |  18 +-
 docs/rust/src/opendal/layers/error_context.rs.html |  12 +-
 docs/rust/src/opendal/layers/logging.rs.html       |  52 +-
 docs/rust/src/opendal/layers/madsim.rs.html        |  24 +-
 docs/rust/src/opendal/layers/metrics.rs.html       |  16 +-
 docs/rust/src/opendal/layers/minitrace.rs.html     |  54 +-
 docs/rust/src/opendal/layers/oteltrace.rs.html     |  58 +-
 docs/rust/src/opendal/layers/prometheus.rs.html    |  16 +-
 docs/rust/src/opendal/layers/retry.rs.html         | 194 +++++--
 docs/rust/src/opendal/layers/throttle.rs.html      |  30 +-
 docs/rust/src/opendal/layers/timeout.rs.html       | 170 +++++-
 docs/rust/src/opendal/layers/tracing.rs.html       |  18 +-
 .../src/opendal/raw/adapters/kv/backend.rs.html    | 106 +++-
 .../opendal/raw/adapters/typed_kv/backend.rs.html  |  98 +++-
 docs/rust/src/opendal/raw/oio/buf.rs.html          |  10 +-
 .../opendal/raw/oio/read/cloneable_read.rs.html    |  16 +-
 .../raw/oio/read/into_read_from_stream.rs.html     |  18 +-
 docs/rust/src/opendal/raw/oio/write/api.rs.html    | 208 +++++++-
 .../raw/oio/write/append_object_write.rs.html      | 124 +++--
 .../opendal/raw/oio/write/compose_write.rs.html    |  50 +-
 .../opendal/raw/oio/write/exact_buf_write.rs.html  |  48 +-
 docs/rust/src/opendal/raw/oio/write/mod.rs.html    |  10 +
 .../raw/oio/write/multipart_upload_write.rs.html   | 296 +++++++++--
 .../opendal/raw/oio/write/one_shot_write.rs.html   | 106 +++-
 .../src/opendal/raw/oio/write/range_write.rs.html  | 585 +++++++++++++++++++++
 .../src/opendal/services/azblob/backend.rs.html    |  20 +-
 docs/rust/src/opendal/services/azblob/core.rs.html |  26 +-
 .../src/opendal/services/azblob/writer.rs.html     | 156 +-----
 .../src/opendal/services/azdfs/backend.rs.html     |   4 +-
 .../rust/src/opendal/services/azdfs/writer.rs.html |  34 +-
 docs/rust/src/opendal/services/cos/writer.rs.html  |   8 +-
 .../src/opendal/services/dropbox/backend.rs.html   |  12 +-
 .../src/opendal/services/dropbox/writer.rs.html    |  26 +-
 docs/rust/src/opendal/services/fs/writer.rs.html   | 150 +++++-
 docs/rust/src/opendal/services/ftp/writer.rs.html  |  92 +++-
 docs/rust/src/opendal/services/gcs/backend.rs.html |  20 +-
 docs/rust/src/opendal/services/gcs/core.rs.html    |  38 +-
 docs/rust/src/opendal/services/gcs/writer.rs.html  | 200 ++-----
 .../src/opendal/services/gdrive/backend.rs.html    |  12 +-
 .../src/opendal/services/gdrive/writer.rs.html     |  48 +-
 docs/rust/src/opendal/services/ghac/writer.rs.html | 214 ++++++--
 docs/rust/src/opendal/services/hdfs/writer.rs.html |  28 +-
 .../src/opendal/services/ipmfs/backend.rs.html     |   4 +-
 .../rust/src/opendal/services/ipmfs/writer.rs.html |  32 +-
 docs/rust/src/opendal/services/obs/writer.rs.html  |   8 +-
 .../src/opendal/services/onedrive/backend.rs.html  |   4 +-
 .../src/opendal/services/onedrive/writer.rs.html   |  26 +-
 docs/rust/src/opendal/services/oss/writer.rs.html  |   8 +-
 docs/rust/src/opendal/services/s3/writer.rs.html   |   8 +-
 docs/rust/src/opendal/services/sftp/writer.rs.html |  52 +-
 .../src/opendal/services/supabase/backend.rs.html  |   4 +-
 .../src/opendal/services/supabase/writer.rs.html   |  46 +-
 .../services/vercel_artifacts/backend.rs.html      |  12 +-
 .../services/vercel_artifacts/writer.rs.html       |  38 +-
 .../src/opendal/services/wasabi/backend.rs.html    |   4 +-
 .../src/opendal/services/wasabi/writer.rs.html     |  26 +-
 .../src/opendal/services/webdav/backend.rs.html    |  10 +-
 .../src/opendal/services/webdav/writer.rs.html     |  46 +-
 .../src/opendal/services/webhdfs/backend.rs.html   |   4 +-
 .../src/opendal/services/webhdfs/writer.rs.html    |  26 +-
 .../src/opendal/types/operator/operator.rs.html    |   6 +-
 docs/rust/src/opendal/types/writer.rs.html         | 360 +------------
 docs/services/azblob/index.html                    |   6 +-
 docs/services/azdfs/index.html                     |   6 +-
 docs/services/cos/index.html                       |   6 +-
 docs/services/dashmap/index.html                   |   6 +-
 docs/services/dropbox/index.html                   |   6 +-
 docs/services/etcd/index.html                      |   6 +-
 docs/services/foundationdb/index.html              |   6 +-
 docs/services/fs/index.html                        |   6 +-
 docs/services/ftp/index.html                       |   6 +-
 docs/services/gcs/index.html                       |   6 +-
 docs/services/gdrive/index.html                    |   6 +-
 docs/services/hdfs/index.html                      |   6 +-
 docs/services/http/index.html                      |   6 +-
 docs/services/ipfs/index.html                      |   6 +-
 docs/services/ipmfs/index.html                     |   6 +-
 docs/services/memcached/index.html                 |   6 +-
 docs/services/memory/index.html                    |   6 +-
 docs/services/moka/index.html                      |   6 +-
 docs/services/obs/index.html                       |   6 +-
 docs/services/onedrive/index.html                  |   6 +-
 docs/services/oss/index.html                       |   6 +-
 docs/services/redis/index.html                     |   6 +-
 docs/services/rocksdb/index.html                   |   6 +-
 docs/services/s3/index.html                        |   6 +-
 docs/services/sftp/index.html                      |   6 +-
 docs/services/sled/index.html                      |   6 +-
 docs/services/supabase/index.html                  |   6 +-
 docs/services/wasabi/index.html                    |   6 +-
 docs/services/webdav/index.html                    |   6 +-
 docs/services/webhdfs/index.html                   |   6 +-
 docs/vision/index.html                             |   6 +-
 download/index.html                                |   4 +-
 index.html                                         |   4 +-
 237 files changed, 3372 insertions(+), 2216 deletions(-)

diff --git a/404.html b/404.html
index cf569d45c..a787536ba 100644
--- a/404.html
+++ b/404.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Page Not Found | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/404.html"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/054cd2fb.e6517e41.js b/assets/js/054cd2fb.ffb527e7.js
similarity index 84%
rename from assets/js/054cd2fb.e6517e41.js
rename to assets/js/054cd2fb.ffb527e7.js
index e865cfe35..993884b9e 100644
--- a/assets/js/054cd2fb.e6517e41.js
+++ b/assets/js/054cd2fb.ffb527e7.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/093f5f04.104e1b0e.js b/assets/js/093f5f04.6e5572d0.js
similarity index 84%
rename from assets/js/093f5f04.104e1b0e.js
rename to assets/js/093f5f04.6e5572d0.js
index 68b719e98..28db3cb03 100644
--- a/assets/js/093f5f04.104e1b0e.js
+++ b/assets/js/093f5f04.6e5572d0.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6915],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/136e1c50.1d8821e3.js b/assets/js/136e1c50.023c8aa7.js
similarity index 83%
rename from assets/js/136e1c50.1d8821e3.js
rename to assets/js/136e1c50.023c8aa7.js
index 1422e3fd2..8abb90916 100644
--- a/assets/js/136e1c50.1d8821e3.js
+++ b/assets/js/136e1c50.023c8aa7.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3057],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/151cd40f.57df495a.js b/assets/js/151cd40f.83604438.js
similarity index 86%
rename from assets/js/151cd40f.57df495a.js
rename to assets/js/151cd40f.83604438.js
index f1c786d4a..afb1a8795 100644
--- a/assets/js/151cd40f.57df495a.js
+++ b/assets/js/151cd40f.83604438.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3702],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/1957547a.803f53fc.js b/assets/js/1957547a.c062933e.js
similarity index 72%
rename from assets/js/1957547a.803f53fc.js
rename to assets/js/1957547a.c062933e.js
index d38293d43..aef137fd1 100644
--- a/assets/js/1957547a.803f53fc.js
+++ b/assets/js/1957547a.c062933e.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4477],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/1db64337.6cc781b8.js b/assets/js/1db64337.cbf0a55b.js
similarity index 50%
rename from assets/js/1db64337.6cc781b8.js
rename to assets/js/1db64337.cbf0a55b.js
index a9e57f21d..9a3ef8936 100644
--- a/assets/js/1db64337.6cc781b8.js
+++ b/assets/js/1db64337.cbf0a55b.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/22d8fa67.0e396cd1.js b/assets/js/22d8fa67.98a75e91.js
similarity index 72%
rename from assets/js/22d8fa67.0e396cd1.js
rename to assets/js/22d8fa67.98a75e91.js
index a3bd7e99e..b3a3d12fb 100644
--- a/assets/js/22d8fa67.0e396cd1.js
+++ b/assets/js/22d8fa67.98a75e91.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4536],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/29b208a4.47c0b356.js b/assets/js/29b208a4.ac52d31b.js
similarity index 70%
rename from assets/js/29b208a4.47c0b356.js
rename to assets/js/29b208a4.ac52d31b.js
index 93e134d68..79a2f64bb 100644
--- a/assets/js/29b208a4.47c0b356.js
+++ b/assets/js/29b208a4.ac52d31b.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6152],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/2cbf1097.670717b2.js b/assets/js/2cbf1097.e0cfd334.js
similarity index 91%
rename from assets/js/2cbf1097.670717b2.js
rename to assets/js/2cbf1097.e0cfd334.js
index 9b5957a23..4f293d0a0 100644
--- a/assets/js/2cbf1097.670717b2.js
+++ b/assets/js/2cbf1097.e0cfd334.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2804],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/434bbc94.a9c16daa.js b/assets/js/434bbc94.96255f74.js
similarity index 85%
rename from assets/js/434bbc94.a9c16daa.js
rename to assets/js/434bbc94.96255f74.js
index c15eb9060..53b06fb26 100644
--- a/assets/js/434bbc94.a9c16daa.js
+++ b/assets/js/434bbc94.96255f74.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1163],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/57a16c1d.df646dfc.js b/assets/js/57a16c1d.46891952.js
similarity index 83%
rename from assets/js/57a16c1d.df646dfc.js
rename to assets/js/57a16c1d.46891952.js
index e52fc56b6..58e8721f2 100644
--- a/assets/js/57a16c1d.df646dfc.js
+++ b/assets/js/57a16c1d.46891952.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7757],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/592d1076.04eb6980.js b/assets/js/592d1076.0ae8eebe.js
similarity index 83%
rename from assets/js/592d1076.04eb6980.js
rename to assets/js/592d1076.0ae8eebe.js
index eb8157aa0..3989a5079 100644
--- a/assets/js/592d1076.04eb6980.js
+++ b/assets/js/592d1076.0ae8eebe.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[990],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/5a65e608.2ac8af6c.js b/assets/js/5a65e608.2ac8af6c.js
new file mode 100644
index 000000000..59d305319
--- /dev/null
+++ b/assets/js/5a65e608.2ac8af6c.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6427],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/5a65e608.b4764d22.js b/assets/js/5a65e608.b4764d22.js
deleted file mode 100644
index 725dd0dc3..000000000
--- a/assets/js/5a65e608.b4764d22.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6427],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/62a401e9.652f09a7.js b/assets/js/62a401e9.d12b7bd4.js
similarity index 84%
rename from assets/js/62a401e9.652f09a7.js
rename to assets/js/62a401e9.d12b7bd4.js
index 7f7589d85..342c40441 100644
--- a/assets/js/62a401e9.652f09a7.js
+++ b/assets/js/62a401e9.d12b7bd4.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6089],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6089],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/6eb7fe18.9116c04b.js b/assets/js/6eb7fe18.9116c04b.js
deleted file mode 100644
index 1f2dd64ab..000000000
--- a/assets/js/6eb7fe18.9116c04b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/6eb7fe18.e93ec92e.js b/assets/js/6eb7fe18.e93ec92e.js
new file mode 100644
index 000000000..be710ac7f
--- /dev/null
+++ b/assets/js/6eb7fe18.e93ec92e.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3922],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/7263c0b5.43e09b14.js b/assets/js/7263c0b5.0fd4bbe9.js
similarity index 72%
rename from assets/js/7263c0b5.43e09b14.js
rename to assets/js/7263c0b5.0fd4bbe9.js
index bb68679ac..db8a8ff05 100644
--- a/assets/js/7263c0b5.43e09b14.js
+++ b/assets/js/7263c0b5.0fd4bbe9.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4649],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8b18d929.8ceefe58.js b/assets/js/8b18d929.e9207660.js
similarity index 89%
rename from assets/js/8b18d929.8ceefe58.js
rename to assets/js/8b18d929.e9207660.js
index 0b2cb3c80..ea51274c7 100644
--- a/assets/js/8b18d929.8ceefe58.js
+++ b/assets/js/8b18d929.e9207660.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6299],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6299],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8cc9519e.1047d63d.js b/assets/js/8cc9519e.b4dcd383.js
similarity index 89%
rename from assets/js/8cc9519e.1047d63d.js
rename to assets/js/8cc9519e.b4dcd383.js
index 9616f729b..9c013c4fa 100644
--- a/assets/js/8cc9519e.1047d63d.js
+++ b/assets/js/8cc9519e.b4dcd383.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1652],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/8f4159f2.fe472a35.js b/assets/js/8f4159f2.6fa43018.js
similarity index 88%
rename from assets/js/8f4159f2.fe472a35.js
rename to assets/js/8f4159f2.6fa43018.js
index 6a846cece..210dc0d48 100644
--- a/assets/js/8f4159f2.fe472a35.js
+++ b/assets/js/8f4159f2.6fa43018.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4719],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/939f74f6.3d6bb51d.js b/assets/js/939f74f6.6827802a.js
similarity index 86%
rename from assets/js/939f74f6.3d6bb51d.js
rename to assets/js/939f74f6.6827802a.js
index 772f95be6..a67f21aac 100644
--- a/assets/js/939f74f6.3d6bb51d.js
+++ b/assets/js/939f74f6.6827802a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4277],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/9fedeb09.7c621d96.js b/assets/js/9fedeb09.7c621d96.js
deleted file mode 100644
index 7591d584b..000000000
--- a/assets/js/9fedeb09.7c621d96.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9782],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/9fedeb09.f22a66f0.js b/assets/js/9fedeb09.f22a66f0.js
new file mode 100644
index 000000000..ad44c9548
--- /dev/null
+++ b/assets/js/9fedeb09.f22a66f0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9782],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/a0405932.8866a0eb.js b/assets/js/a0405932.c49d0839.js
similarity index 84%
rename from assets/js/a0405932.8866a0eb.js
rename to assets/js/a0405932.c49d0839.js
index 4e2d82504..82a05da60 100644
--- a/assets/js/a0405932.8866a0eb.js
+++ b/assets/js/a0405932.c49d0839.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[716],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retur [...]
\ No newline at end of file
diff --git a/assets/js/ab10c306.a2ded611.js b/assets/js/ab10c306.3b7e16ca.js
similarity index 67%
rename from assets/js/ab10c306.a2ded611.js
rename to assets/js/ab10c306.3b7e16ca.js
index 9ecf4c47a..62dc78645 100644
--- a/assets/js/ab10c306.a2ded611.js
+++ b/assets/js/ab10c306.3b7e16ca.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[380],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[380],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/ae4554eb.1bd1899d.js b/assets/js/ae4554eb.1bd1899d.js
new file mode 100644
index 000000000..ef9f79e94
--- /dev/null
+++ b/assets/js/ae4554eb.1bd1899d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6983],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/ae4554eb.22e02005.js b/assets/js/ae4554eb.22e02005.js
deleted file mode 100644
index 7765db414..000000000
--- a/assets/js/ae4554eb.22e02005.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6983],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/b114cefa.8b0eb00c.js b/assets/js/b114cefa.88a4d663.js
similarity index 84%
rename from assets/js/b114cefa.8b0eb00c.js
rename to assets/js/b114cefa.88a4d663.js
index a296c45b0..949d2b711 100644
--- a/assets/js/b114cefa.8b0eb00c.js
+++ b/assets/js/b114cefa.88a4d663.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2161],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2161],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/b56f9725.c0474bd9.js b/assets/js/b56f9725.cde2091d.js
similarity index 84%
rename from assets/js/b56f9725.c0474bd9.js
rename to assets/js/b56f9725.cde2091d.js
index f7a1f39a6..c4f3b095c 100644
--- a/assets/js/b56f9725.c0474bd9.js
+++ b/assets/js/b56f9725.cde2091d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[217],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/b9ae8b37.6477b57b.js b/assets/js/b9ae8b37.6477b57b.js
new file mode 100644
index 000000000..cd7ed76fe
--- /dev/null
+++ b/assets/js/b9ae8b37.6477b57b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6578],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/b9ae8b37.701aef90.js b/assets/js/b9ae8b37.701aef90.js
deleted file mode 100644
index 86f5e1a65..000000000
--- a/assets/js/b9ae8b37.701aef90.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6578],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/bb5b2057.b5dd41a2.js b/assets/js/bb5b2057.5ddf8943.js
similarity index 84%
rename from assets/js/bb5b2057.b5dd41a2.js
rename to assets/js/bb5b2057.5ddf8943.js
index 4f1281c8d..c1370e70c 100644
--- a/assets/js/bb5b2057.b5dd41a2.js
+++ b/assets/js/bb5b2057.5ddf8943.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5214],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c46c6b55.e47a90fc.js b/assets/js/c46c6b55.22cb52e7.js
similarity index 83%
rename from assets/js/c46c6b55.e47a90fc.js
rename to assets/js/c46c6b55.22cb52e7.js
index f765dc94f..904a68ccc 100644
--- a/assets/js/c46c6b55.e47a90fc.js
+++ b/assets/js/c46c6b55.22cb52e7.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[5927],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c6ab695b.734aa24b.js b/assets/js/c6ab695b.734aa24b.js
deleted file mode 100644
index 240e5cc40..000000000
--- a/assets/js/c6ab695b.734aa24b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>b});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/c6ab695b.f33ce4aa.js b/assets/js/c6ab695b.f33ce4aa.js
new file mode 100644
index 000000000..99e8750d1
--- /dev/null
+++ b/assets/js/c6ab695b.f33ce4aa.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[7289],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/cc62039a.6b3c7e6d.js b/assets/js/cc62039a.f1aaa670.js
similarity index 89%
rename from assets/js/cc62039a.6b3c7e6d.js
rename to assets/js/cc62039a.f1aaa670.js
index c0731ccf9..3249b532f 100644
--- a/assets/js/cc62039a.6b3c7e6d.js
+++ b/assets/js/cc62039a.f1aaa670.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[1011],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d3c0d8d5.3cc78604.js b/assets/js/d3c0d8d5.0dd646b9.js
similarity index 84%
rename from assets/js/d3c0d8d5.3cc78604.js
rename to assets/js/d3c0d8d5.0dd646b9.js
index ea7b61b14..de79780a9 100644
--- a/assets/js/d3c0d8d5.3cc78604.js
+++ b/assets/js/d3c0d8d5.0dd646b9.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4790],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d5c31a96.6a9964d0.js b/assets/js/d5c31a96.6a9964d0.js
new file mode 100644
index 000000000..79729404f
--- /dev/null
+++ b/assets/js/d5c31a96.6a9964d0.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2379],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/d5c31a96.a7e4aa66.js b/assets/js/d5c31a96.a7e4aa66.js
deleted file mode 100644
index f0e978ed3..000000000
--- a/assets/js/d5c31a96.a7e4aa66.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[2379],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}retu [...]
\ No newline at end of file
diff --git a/assets/js/ddccef4c.54e9c1dd.js b/assets/js/ddccef4c.392c5f84.js
similarity index 86%
rename from assets/js/ddccef4c.54e9c1dd.js
rename to assets/js/ddccef4c.392c5f84.js
index b73f389c7..b8471238c 100644
--- a/assets/js/ddccef4c.54e9c1dd.js
+++ b/assets/js/ddccef4c.392c5f84.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[9826],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/e892cec6.344b2ac5.js b/assets/js/e892cec6.9b0e62e1.js
similarity index 86%
rename from assets/js/e892cec6.344b2ac5.js
rename to assets/js/e892cec6.9b0e62e1.js
index a49ea3141..9cef87941 100644
--- a/assets/js/e892cec6.344b2ac5.js
+++ b/assets/js/e892cec6.9b0e62e1.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3845],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>f});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/f1ca5a39.6b465a9c.js b/assets/js/f1ca5a39.15e1137c.js
similarity index 87%
rename from assets/js/f1ca5a39.6b465a9c.js
rename to assets/js/f1ca5a39.15e1137c.js
index a4f0215e4..af42d9bc8 100644
--- a/assets/js/f1ca5a39.6b465a9c.js
+++ b/assets/js/f1ca5a39.15e1137c.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[4538],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>b});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/f9145722.f4555dda.js b/assets/js/f9145722.85d0ecb8.js
similarity index 86%
rename from assets/js/f9145722.f4555dda.js
rename to assets/js/f9145722.85d0ecb8.js
index e2cf892ce..a54191e73 100644
--- a/assets/js/f9145722.f4555dda.js
+++ b/assets/js/f9145722.85d0ecb8.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6529],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[6529],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retu [...]
\ No newline at end of file
diff --git a/assets/js/fde7cc64.12695c45.js b/assets/js/fde7cc64.6c9d94a7.js
similarity index 85%
rename from assets/js/fde7cc64.12695c45.js
rename to assets/js/fde7cc64.6c9d94a7.js
index 4da871af4..59ca2a2ec 100644
--- a/assets/js/fde7cc64.12695c45.js
+++ b/assets/js/fde7cc64.6c9d94a7.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[3454],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}retu [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.7f4312ee.js b/assets/js/runtime~main.7f4312ee.js
deleted file mode 100644
index 19e7bc09b..000000000
--- a/assets/js/runtime~main.7f4312ee.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{"use strict";var e,a,c,f,b,d={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return d[e].call(c.exports,c,c.exports,r),c.exports}r.m=d,e=[],r.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i<e.length;i++){c=e[i][0],f=e[i][1],b=e[i][2];for(var t=!0,o=0;o<c.length;o++)(!1&b||d>=b)&&Object.keys(r.O).every((e=>r.O[e](c[o])))?c.splice(o--,1):(t=!1,b<d&&(d=b));if(t){e.splice(i--,1);var n=f();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.dbce9659.js b/assets/js/runtime~main.dbce9659.js
new file mode 100644
index 000000000..20bfc371d
--- /dev/null
+++ b/assets/js/runtime~main.dbce9659.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,c,a,f,d,b={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(c,a,f,d)=>{if(!a){var b=1/0;for(i=0;i<e.length;i++){a=e[i][0],f=e[i][1],d=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&d||b>=d)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,d<b&&(b=d));if(t){e.splice(i--,1);var n=f();void 0!==n&&(c=n)}}return c}d=d||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
index e6f50ee8c..65587379a 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Archive | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/archive"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="t [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/how-opendal-read-data/index.html b/blog/how-opendal-read-data/index.html
index 2b677fea0..1aa1cc9cb 100644
--- a/blog/how-opendal-read-data/index.html
+++ b/blog/how-opendal-read-data/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">OpenDAL Internal: Data Reading | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/how-opendal-read-data"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:la [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
index 6ce622c9a..3f7ce1bbb 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Blog | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Blog | Apache OpenDAL"><meta data-rh=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/opendal-access-data-freely/index.html b/blog/opendal-access-data-freely/index.html
index 6bef6d4b7..28378563f 100644
--- a/blog/opendal-access-data-freely/index.html
+++ b/blog/opendal-access-data-freely/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Apache OpenDAL(Incubating): Access Data Freely | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-access-data-freely"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="tru [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/opendal-entered-apache-incubator/index.html b/blog/opendal-entered-apache-incubator/index.html
index 3d97fdf81..5c0bbeddb 100644
--- a/blog/opendal-entered-apache-incubator/index.html
+++ b/blog/opendal-entered-apache-incubator/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Way to Go: OpenDAL successfully entered Apache Incubator | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/opendal-entered-apache-incubator"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><m [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/announcement/index.html b/blog/tags/announcement/index.html
index e85aaa23d..c03582917 100644
--- a/blog/tags/announcement/index.html
+++ b/blog/tags/announcement/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">2 posts tagged with &quot;announcement&quot; | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/announcement"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property= [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 437bf8ea2..6d44601f2 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Tags | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Tags | Apache OpenDAL"><meta data [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/internal/index.html b/blog/tags/internal/index.html
index b9d55dd03..e296d891f 100644
--- a/blog/tags/internal/index.html
+++ b/blog/tags/internal/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">One post tagged with &quot;internal&quot; | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/blog/tags/internal"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:tit [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/contributing/index.html b/docs/category/contributing/index.html
index 7e912a03c..aaeeeced0 100644
--- a/docs/category/contributing/index.html
+++ b/docs/category/contributing/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Contributing | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/contributing"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="cu [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/reference/index.html b/docs/category/reference/index.html
index 6f4db21bb..7df139bc3 100644
--- a/docs/category/reference/index.html
+++ b/docs/category/reference/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Reference | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/reference"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/category/services/index.html b/docs/category/services/index.html
index fbbb63c46..c716c1b1a 100644
--- a/docs/category/services/index.html
+++ b/docs/category/services/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Services | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/category/services"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/committer/index.html b/docs/contributing/committer/index.html
index d115ee83b..039bd2f95 100644
--- a/docs/contributing/committer/index.html
+++ b/docs/contributing/committer/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Committer Onboarding | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/committer"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" co [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/podling-report/index.html b/docs/contributing/podling-report/index.html
index a8c321547..94be8dcb4 100644
--- a/docs/contributing/podling-report/index.html
+++ b/docs/contributing/podling-report/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Podling Status Reports | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/podling-report"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_vers [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/reference/generate_release_note/index.html b/docs/contributing/reference/generate_release_note/index.html
index 5f7f714b3..f029a3565 100644
--- a/docs/contributing/reference/generate_release_note/index.html
+++ b/docs/contributing/reference/generate_release_note/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Generate Release Note | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/reference/generate_release_note"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name= [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/reference/setup_gpg/index.html b/docs/contributing/reference/setup_gpg/index.html
index 4e5d2a46b..0fb3e8b22 100644
--- a/docs/contributing/reference/setup_gpg/index.html
+++ b/docs/contributing/reference/setup_gpg/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Setup GPG Key | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/reference/setup_gpg"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/release/index.html b/docs/contributing/release/index.html
index 335b9473e..e492fbb9d 100644
--- a/docs/contributing/release/index.html
+++ b/docs/contributing/release/index.html
@@ -5,7 +5,7 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Release | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/release"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
@@ -14,8 +14,8 @@
 how the release manager releases a new version in accordance with the Apache requirements.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2><p><code>Source Release</code> is the key point which Apache values, and is also necessary for an ASF release.</p><p>Please remember that publishing software has legal consequences.</p><p>This [...]
 we will abandon that version and prepare for the next one.
 Our release page will only display ASF releases instead of GitHub Releases.</p><ul><li><code>opendal_version</code>: the version for opendal, like <code>0.36.0</code>.</li><li><code>release_version</code>: the version for voting, like <code>0.36.0-rc1</code>.</li><li><code>rc_version</code>: the minor version for voting, like <code>rc1</code>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-asf-release">Create an ASF Release<a href="#create-an-asf-release" class="ha [...]
-please cancel the release for the current <code>release_version</code>, <em>increase th RC counting</em> and reinitiate a release with the new <code>release_version</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="voting">Voting<a href="#voting" class="hash-link" aria-label="Direct link to Voting" title="Direct link to Voting">​</a></h2><p>As an incubating project, OpenDAL requires votes from both the OpenDAL Community and Incubator Community.</p><ul><li><code>opendal_versio [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+please cancel the release for the current <code>release_version</code>, <em>increase th RC counting</em> and reinitiate a release with the new <code>release_version</code>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="voting">Voting<a href="#voting" class="hash-link" aria-label="Direct link to Voting" title="Direct link to Voting">​</a></h2><p>As an incubating project, OpenDAL requires votes from both the OpenDAL Community and Incubator Community.</p><ul><li><code>opendal_versio [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/contributing/verify/index.html b/docs/contributing/verify/index.html
index 5bd3c64b5..ad221e58d 100644
--- a/docs/contributing/verify/index.html
+++ b/docs/contributing/verify/index.html
@@ -5,15 +5,15 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Verify | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/contributing/verify"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current">< [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
 You can download it directly from <a href="https://raw.githubusercontent.com/apache/incubator-opendal/main/scripts/check.sh" target="_blank" rel="noopener noreferrer">here</a>
-or check it out from the repository:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:apache/incuba [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+or check it out from the repository:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone git@github.com:apache/incuba [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/lua/classes/opendal.metadata.html b/docs/lua/classes/opendal.metadata.html
index 0d7edf568..ccacb634c 100644
--- a/docs/lua/classes/opendal.metadata.html
+++ b/docs/lua/classes/opendal.metadata.html
@@ -138,7 +138,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2023-09-11 11:25:35 </i>
+<i style="float:right;">Last updated 2023-09-11 11:53:19 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/classes/opendal.operator.html b/docs/lua/classes/opendal.operator.html
index 33a0aa14d..e8f3c5e08 100644
--- a/docs/lua/classes/opendal.operator.html
+++ b/docs/lua/classes/opendal.operator.html
@@ -321,7 +321,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2023-09-11 11:25:35 </i>
+<i style="float:right;">Last updated 2023-09-11 11:53:19 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/lua/index.html b/docs/lua/index.html
index 621f56d45..640b75fa2 100644
--- a/docs/lua/index.html
+++ b/docs/lua/index.html
@@ -57,7 +57,7 @@
 </div> <!-- id="main" -->
 <div id="about">
 <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
-<i style="float:right;">Last updated 2023-09-11 11:25:35 </i>
+<i style="float:right;">Last updated 2023-09-11 11:53:19 </i>
 </div> <!-- id="about" -->
 </div> <!-- id="container" -->
 </body>
diff --git a/docs/nodejs/classes/BlockingLister.html b/docs/nodejs/classes/BlockingLister.html
index 57e2c1376..81034d9a9 100644
--- a/docs/nodejs/classes/BlockingLister.html
+++ b/docs/nodejs/classes/BlockingLister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">BlockingLister</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L435">index.d.ts:435</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L435">index.d.ts:435</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -51,7 +51,7 @@
 <li class="tsd-description">
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="Entry.html" class="tsd-signature-type tsd-kind-class">Entry</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L436">index.d.ts:436</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L436">index.d.ts:436</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Entry.html b/docs/nodejs/classes/Entry.html
index 18ea98be5..de9f198a3 100644
--- a/docs/nodejs/classes/Entry.html
+++ b/docs/nodejs/classes/Entry.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Entry</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L398">index.d.ts:398</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L398">index.d.ts:398</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -53,7 +53,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L400">index.d.ts:400</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L400">index.d.ts:400</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Lister.html b/docs/nodejs/classes/Lister.html
index 3c32d34f3..5b249a4b1 100644
--- a/docs/nodejs/classes/Lister.html
+++ b/docs/nodejs/classes/Lister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Lister</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L424">index.d.ts:424</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L424">index.d.ts:424</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -57,7 +57,7 @@ thing internally.</p>
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><a href="Entry.html" class="tsd-signature-type tsd-kind-class">Entry</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L433">index.d.ts:433</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L433">index.d.ts:433</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Metadata.html b/docs/nodejs/classes/Metadata.html
index d448449a5..5589bebe8 100644
--- a/docs/nodejs/classes/Metadata.html
+++ b/docs/nodejs/classes/Metadata.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Metadata</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L402">index.d.ts:402</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L402">index.d.ts:402</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -63,7 +63,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L408">index.d.ts:408</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L408">index.d.ts:408</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentLength" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Length</span><a href="#contentLength" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -73,7 +73,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">bigint</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L410">index.d.ts:410</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L410">index.d.ts:410</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentMd5" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Md5</span><a href="#contentMd5" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -83,7 +83,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L412">index.d.ts:412</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L412">index.d.ts:412</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="contentType" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Type</span><a href="#contentType" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -93,7 +93,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L414">index.d.ts:414</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L414">index.d.ts:414</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="etag" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>etag</span><a href="#etag" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -103,7 +103,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L416">index.d.ts:416</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L416">index.d.ts:416</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="lastModified" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>last<wbr/>Modified</span><a href="#lastModified" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -114,7 +114,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L422">index.d.ts:422</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L422">index.d.ts:422</a></li></ul></aside></li></ul></section></section>
 <section class="tsd-panel-group tsd-member-group">
 <h2>Methods</h2>
 <section class="tsd-panel tsd-member"><a id="isDirectory" class="tsd-anchor"></a>
@@ -126,7 +126,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L404">index.d.ts:404</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L404">index.d.ts:404</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="isFile" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -136,7 +136,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L406">index.d.ts:406</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L406">index.d.ts:406</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/classes/Operator.html b/docs/nodejs/classes/Operator.html
index 9de878911..72b6a08c6 100644
--- a/docs/nodejs/classes/Operator.html
+++ b/docs/nodejs/classes/Operator.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Operator</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L33">index.d.ts:33</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L33">index.d.ts:33</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -79,7 +79,7 @@
 <h5><code class="tsd-tag ts-flagOptional">Optional</code> <span class="tsd-kind-parameter">options</span>: <span class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Record</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">&gt;</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="Operator.html" class="tsd-signature-type tsd-kind-class">Operator</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L35">index.d.ts:35</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L35">index.d.ts:35</a></li></ul></aside></li></ul></section></section>
 <section class="tsd-panel-group tsd-member-group">
 <h2>Methods</h2>
 <section class="tsd-panel tsd-member"><a id="append" class="tsd-anchor"></a>
@@ -104,7 +104,7 @@
 <h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L170">index.d.ts:170</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L170">index.d.ts:170</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="check" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>check</span><a href="#check" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -117,7 +117,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L78">index.d.ts:78</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L78">index.d.ts:78</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="copy" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>copy</span><a href="#copy" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -136,7 +136,7 @@
 <h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L179">index.d.ts:179</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L179">index.d.ts:179</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="copySync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>copy<wbr/>Sync</span><a href="#copySync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -155,7 +155,7 @@
 <h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L188">index.d.ts:188</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L188">index.d.ts:188</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="createDir" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>create<wbr/>Dir</span><a href="#createDir" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -172,7 +172,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L105">index.d.ts:105</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L105">index.d.ts:105</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="createDirSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>create<wbr/>Dir<wbr/>Sync</span><a href="#createDirSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -189,7 +189,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L114">index.d.ts:114</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L114">index.d.ts:114</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="delete" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>delete</span><a href="#delete" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -207,7 +207,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L269">index.d.ts:269</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L269">index.d.ts:269</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="deleteSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>delete<wbr/>Sync</span><a href="#deleteSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -224,7 +224,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L278">index.d.ts:278</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L278">index.d.ts:278</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="isExist" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>Exist</span><a href="#isExist" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -241,7 +241,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L87">index.d.ts:87</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L87">index.d.ts:87</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="isExistSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>Exist<wbr/>Sync</span><a href="#isExistSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -258,7 +258,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L96">index.d.ts:96</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L96">index.d.ts:96</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="list" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>list</span><a href="#list" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -277,7 +277,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Lister.html" class="tsd-signature-type tsd-kind-class">Lister</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L325">index.d.ts:325</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L325">index.d.ts:325</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="listSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>list<wbr/>Sync</span><a href="#listSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -296,7 +296,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="BlockingLister.html" class="tsd-signature-type tsd-kind-class">BlockingLister</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L348">index.d.ts:348</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L348">index.d.ts:348</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="presignRead" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a href="#presignRead" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -316,7 +316,7 @@
 <h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L364">index.d.ts:364</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L364">index.d.ts:364</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="presignStat" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a href="#presignStat" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -336,7 +336,7 @@
 <h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L396">index.d.ts:396</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L396">index.d.ts:396</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="presignWrite" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a href="#presignWrite" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -356,7 +356,7 @@
 <h5><span class="tsd-kind-parameter">expires</span>: <span class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/PresignedRequest.html" class="tsd-signature-type tsd-kind-interface">PresignedRequest</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L380">index.d.ts:380</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L380">index.d.ts:380</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="read" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>read</span><a href="#read" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -373,7 +373,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type ">Buffer</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L123">index.d.ts:123</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L123">index.d.ts:123</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="readSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>read<wbr/>Sync</span><a href="#readSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -390,7 +390,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Buffer</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L132">index.d.ts:132</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L132">index.d.ts:132</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="remove" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>remove</span><a href="#remove" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -408,7 +408,7 @@
 <h5><span class="tsd-kind-parameter">paths</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L290">index.d.ts:290</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L290">index.d.ts:290</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="removeAll" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>remove<wbr/>All</span><a href="#removeAll" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -426,7 +426,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L302">index.d.ts:302</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L302">index.d.ts:302</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="rename" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>rename</span><a href="#rename" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -446,7 +446,7 @@
 <h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L199">index.d.ts:199</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L199">index.d.ts:199</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="renameSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>rename<wbr/>Sync</span><a href="#renameSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -466,7 +466,7 @@
 <h5><span class="tsd-kind-parameter">to</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L210">index.d.ts:210</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L210">index.d.ts:210</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="scan" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan</span><a href="#scan" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -485,7 +485,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Lister.html" class="tsd-signature-type tsd-kind-class">Lister</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L234">index.d.ts:234</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L234">index.d.ts:234</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="scanSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan<wbr/>Sync</span><a href="#scanSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -504,7 +504,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="BlockingLister.html" class="tsd-signature-type tsd-kind-class">BlockingLister</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L257">index.d.ts:257</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L257">index.d.ts:257</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="stat" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -527,7 +527,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L55">index.d.ts:55</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L55">index.d.ts:55</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="statSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>stat<wbr/>Sync</span><a href="#statSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -544,7 +544,7 @@
 <h5><span class="tsd-kind-parameter">path</span>: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="Metadata.html" class="tsd-signature-type tsd-kind-class">Metadata</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L67">index.d.ts:67</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L67">index.d.ts:67</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="write" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>write</span><a href="#write" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -563,7 +563,7 @@
 <h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L143">index.d.ts:143</a></li></ul></aside></li></ul></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L143">index.d.ts:143</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member"><a id="writeSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>write<wbr/>Sync</span><a href="#writeSync" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures">
@@ -582,7 +582,7 @@
 <h5><span class="tsd-kind-parameter">content</span>: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type ">Buffer</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L154">index.d.ts:154</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L154">index.d.ts:154</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/nodejs/interfaces/PresignedRequest.html b/docs/nodejs/interfaces/PresignedRequest.html
index 6fc88eafc..d2f534cd4 100644
--- a/docs/nodejs/interfaces/PresignedRequest.html
+++ b/docs/nodejs/interfaces/PresignedRequest.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">PresignedRequest</span></li></ul></section><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L25">index.d.ts:25</a></li></ul></aside>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L25">index.d.ts:25</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -40,21 +40,21 @@
 <div class="tsd-comment tsd-typography"><p>HTTP headers of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L31">index.d.ts:31</a></li></ul></aside></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L31">index.d.ts:31</a></li></ul></aside></section>
 <section class="tsd-panel tsd-member"><a id="method" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>method</span><a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <div class="tsd-signature"><span class="tsd-kind-property">method</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div>
 <div class="tsd-comment tsd-typography"><p>HTTP method of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside></section>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L27">index.d.ts:27</a></li></ul></aside></section>
 <section class="tsd-panel tsd-member"><a id="url" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>url</span><a href="#url" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <div class="tsd-signature"><span class="tsd-kind-property">url</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div>
 <div class="tsd-comment tsd-typography"><p>URL of this request.</p>
 </div><aside class="tsd-sources">
 <ul>
-<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/40d8793/bindings/nodejs/index.d.ts#L29">index.d.ts:29</a></li></ul></aside></section></section></div>
+<li>Defined in <a href="https://github.com/apache/incubator-opendal/blob/587e2d9/bindings/nodejs/index.d.ts#L29">index.d.ts:29</a></li></ul></aside></section></section></div>
 <div class="col-sidebar">
 <div class="page-menu">
 <div class="tsd-navigation settings">
diff --git a/docs/overview/index.html b/docs/overview/index.html
index dad570fcd..9c17fe247 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.4.1">
 <title data-rh="true">Overview | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/overview"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache OpenDAL Atom Feed"><link rel="stylesheet" href="/assets/css/styles.51c7cd0e.css">
-<link rel="preload" href="/assets/js/runtime~main.7f4312ee.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.dbce9659.js" as="script">
 <link rel="preload" href="/assets/js/main.fb452493.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
-<script src="/assets/js/runtime~main.7f4312ee.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="ro [...]
+<script src="/assets/js/runtime~main.dbce9659.js"></script>
 <script src="/assets/js/main.fb452493.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index 3b732aa72..5abe97f36 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -165,19 +165,19 @@
                     <a class="class" href="#Metadata">Metadata</a>
                             <ul class="memberlist">
                         <li>
-                                <a class="variable" href="#Metadata.content_length">content_length</a>
+                                <a class="variable" href="#Metadata.mode">mode</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.etag">etag</a>
+                                <a class="variable" href="#Metadata.content_length">content_length</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.mode">mode</a>
+                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Metadata.content_disposition">content_disposition</a>
                         </li>
                         <li>
-                                <a class="variable" href="#Metadata.content_md5">content_md5</a>
+                                <a class="variable" href="#Metadata.etag">etag</a>
                         </li>
                         <li>
                                 <a class="variable" href="#Metadata.content_type">content_type</a>
@@ -189,10 +189,10 @@
                     <a class="class" href="#PresignedRequest">PresignedRequest</a>
                             <ul class="memberlist">
                         <li>
-                                <a class="variable" href="#PresignedRequest.url">url</a>
+                                <a class="variable" href="#PresignedRequest.method">method</a>
                         </li>
                         <li>
-                                <a class="variable" href="#PresignedRequest.method">method</a>
+                                <a class="variable" href="#PresignedRequest.url">url</a>
                         </li>
                         <li>
                                 <a class="variable" href="#PresignedRequest.headers">headers</a>
@@ -924,41 +924,41 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
     
 
-                            <div id="Metadata.content_length" class="classattr">
+                            <div id="Metadata.mode" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_length</span><span class="annotation">: int</span>
+            <span class="name">mode</span><span class="annotation">: <a href="#EntryMode">EntryMode</a></span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_length"></a>
+    <a class="headerlink" href="#Metadata.mode"></a>
     
-            <div class="docstring"><p>Content length of this entry.</p>
+            <div class="docstring"><p>mode represent this entry's mode.</p>
 </div>
 
 
                             </div>
-                            <div id="Metadata.etag" class="classattr">
+                            <div id="Metadata.content_length" class="classattr">
                                 <div class="attr variable">
-            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
+            <span class="name">content_length</span><span class="annotation">: int</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.etag"></a>
+    <a class="headerlink" href="#Metadata.content_length"></a>
     
-            <div class="docstring"><p>ETag of this entry.</p>
+            <div class="docstring"><p>Content length of this entry.</p>
 </div>
 
 
                             </div>
-                            <div id="Metadata.mode" class="classattr">
+                            <div id="Metadata.content_md5" class="classattr">
                                 <div class="attr variable">
-            <span class="name">mode</span><span class="annotation">: <a href="#EntryMode">EntryMode</a></span>
+            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.mode"></a>
+    <a class="headerlink" href="#Metadata.content_md5"></a>
     
-            <div class="docstring"><p>mode represent this entry's mode.</p>
+            <div class="docstring"><p>Content MD5 of this entry.</p>
 </div>
 
 
@@ -974,15 +974,15 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
 
                             </div>
-                            <div id="Metadata.content_md5" class="classattr">
+                            <div id="Metadata.etag" class="classattr">
                                 <div class="attr variable">
-            <span class="name">content_md5</span><span class="annotation">: Optional[str]</span>
+            <span class="name">etag</span><span class="annotation">: Optional[str]</span>
 
         
     </div>
-    <a class="headerlink" href="#Metadata.content_md5"></a>
+    <a class="headerlink" href="#Metadata.etag"></a>
     
-            <div class="docstring"><p>Content MD5 of this entry.</p>
+            <div class="docstring"><p>ETag of this entry.</p>
 </div>
 
 
@@ -1013,28 +1013,28 @@ The default value for whence is <code>SEEK_SET</code>. Values for <code>whence</
     
     
 
-                            <div id="PresignedRequest.url" class="classattr">
+                            <div id="PresignedRequest.method" class="classattr">
                                 <div class="attr variable">
-            <span class="name">url</span><span class="annotation">: str</span>
+            <span class="name">method</span><span class="annotation">: str</span>
 
         
     </div>
-    <a class="headerlink" href="#PresignedRequest.url"></a>
+    <a class="headerlink" href="#PresignedRequest.method"></a>
     
-            <div class="docstring"><p>Return the URL of this request.</p>
+            <div class="docstring"><p>Return the HTTP method of this request.</p>
 </div>
 
 
                             </div>
-                            <div id="PresignedRequest.method" class="classattr">
+                            <div id="PresignedRequest.url" class="classattr">
                                 <div class="attr variable">
-            <span class="name">method</span><span class="annotation">: str</span>
+            <span class="name">url</span><span class="annotation">: str</span>
 
         
     </div>
-    <a class="headerlink" href="#PresignedRequest.method"></a>
+    <a class="headerlink" href="#PresignedRequest.url"></a>
     
-            <div class="docstring"><p>Return the HTTP method of this request.</p>
+            <div class="docstring"><p>Return the URL of this request.</p>
 </div>
 
 
diff --git a/docs/python/search.js b/docs/python/search.js
index c0e3972c8..63eed3483 100644
--- a/docs/python/search.js
+++ b/docs/python/search.js
@@ -1,6 +1,6 @@
 window.pdocSearch = (function(){
 /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.wa [...]
-    /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>OpenDAL Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\"w\"> </span> [...]
+    /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": "opendal", "modulename": "opendal", "kind": "module", "doc": "<p>OpenDAL Python binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> </span>install<span class=\"w\"> </span> [...]
 
     // mirrored in build-search-index.js (part 1)
     // Also split on html tags. this is a cheap heuristic, but good enough.
diff --git a/docs/rust/implementors/core/clone/trait.Clone.js b/docs/rust/implementors/core/clone/trait.Clone.js
index 1cd5b3110..d509b592f 100644
--- a/docs/rust/implementors/core/clone/trait.Clone.js
+++ b/docs/rust/implementors/core/clone/trait.Clone.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum opendal::raw::oio::PageOperation\">PageOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/raw/struct.RpCopy.htm [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum opendal::raw::oio::PageOperation\">PageOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html\" title=\"trait core::clone::Clone\">Clone</a> for <a class=\"struct\" href=\"opendal/raw/struct.RpCopy.htm [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/cmp/trait.Eq.js b/docs/rust/implementors/core/cmp/trait.Eq.js
index 614c05047..742635fca 100644
--- a/docs/rust/implementors/core/cmp/trait.Eq.js
+++ b/docs/rust/implementors/core/cmp/trait.Eq.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/cmp/trait.Eq.html\" title=\"trait core::cmp::Eq\">Eq</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.WriteOperation.html\" title=\"enum opendal::raw::oio::WriteOperation\">WriteOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/cmp/trait.Eq.html\" title=\"trait core::cmp::Eq\">Eq</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/cmp/trait.Eq.html\" title=\"trait core::cmp::Eq\">Eq</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.PageOperation.html\" title=\"enum opendal::raw::oio::PageOperation\">PageOperation</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/cmp/trait.Eq.html\" title=\"trait core::cmp::Eq\">Eq</a> for <a class=\"enum\" href=\"opendal/enum.Metakey.html\" title=\"enum opendal::Metakey [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/convert/trait.From.js b/docs/rust/implementors/core/convert/trait.From.js
index c5cb4b617..32361998a 100644
--- a/docs/rust/implementors/core/convert/trait.From.js
+++ b/docs/rust/implementors/core/convert/trait.From.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html\" title=\"trait core::convert::From\">From</a>&lt;<a class=\"enum\" href=\"opendal/raw/enum.Operation.html\" title=\"enum opendal::raw::Operation\">Operation</a>&gt; for &amp;'static <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.72.0/std/primitive.str.html\">str</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html\" title=\" [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html\" title=\"trait core::convert::From\">From</a>&lt;<a class=\"enum\" href=\"opendal/raw/enum.Operation.html\" title=\"enum opendal::raw::Operation\">Operation</a>&gt; for &amp;'static <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.72.0/std/primitive.str.html\">str</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html\" title=\" [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/default/trait.Default.js b/docs/rust/implementors/core/default/trait.Default.js
index 6f4b5086d..e5b41570a 100644
--- a/docs/rust/implementors/core/default/trait.Default.js
+++ b/docs/rust/implementors/core/default/trait.Default.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/services/struct.Cos.html\" title=\"struct opendal::services::Cos\">CosBuilder</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpCopy [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/services/struct.Cos.html\" title=\"struct opendal::services::Cos\">CosBuilder</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/default/trait.Default.html\" title=\"trait core::default::Default\">Default</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpCopy [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/fmt/trait.Debug.js b/docs/rust/implementors/core/fmt/trait.Debug.js
index 74ed80a3f..aab3d4ced 100644
--- a/docs/rust/implementors/core/fmt/trait.Debug.js
+++ b/docs/rust/implementors/core/fmt/trait.Debug.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpCreateDir.html\" title=\"struct opendal::raw::OpCreateDir\">OpCreateDir</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"opendal/services/struct.Ipmfs.html\" title=\"s [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"opendal/raw/struct.OpCreateDir.html\" title=\"struct opendal::raw::OpCreateDir\">OpCreateDir</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/fmt/trait.Debug.html\" title=\"trait core::fmt::Debug\">Debug</a> for <a class=\"struct\" href=\"opendal/services/struct.Ipmfs.html\" title=\"s [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Copy.js b/docs/rust/implementors/core/marker/trait.Copy.js
index 95c5eb5d1..b2dfa9078 100644
--- a/docs/rust/implementors/core/marker/trait.Copy.js
+++ b/docs/rust/implementors/core/marker/trait.Copy.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"opendal/enum.Scheme.html\" title=\"enum opendal::Scheme\">Scheme</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"struct\" href=\"opendal/raw/struct.BytesRange.html\" title=\"struct opendal::raw::Byte [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"opendal/enum.Scheme.html\" title=\"enum opendal::Scheme\">Scheme</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html\" title=\"trait core::marker::Copy\">Copy</a> for <a class=\"enum\" href=\"opendal/raw/oio/enum.WriteOperation.html\" title=\"enum opendal::raw::oi [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Freeze.js b/docs/rust/implementors/core/marker/trait.Freeze.js
index b37cd847f..494c9482e 100644
--- a/docs/rust/implementors/core/marker/trait.Freeze.js
+++ b/docs/rust/implementors/core/marker/trait.Freeze.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl Freeze for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Entry.html\" title=\"struct opendal::Entry\">Entry</a>",1,["opendal::types::entry::Entry"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Metadata.html\" title=\"struct opendal::Metadata\">Metadata</a>",1,["opendal::types::metadata::Metadata"]],[ [...]
+"opendal":[["impl Freeze for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Entry.html\" title=\"struct opendal::Entry\">Entry</a>",1,["opendal::types::entry::Entry"]],["impl Freeze for <a class=\"struct\" href=\"opendal/struct.Metadata.html\" title=\"struct opendal::Metadata\">Metadata</a>",1,["opendal::types::metadata::Metadata"]],[ [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Send.js b/docs/rust/implementors/core/marker/trait.Send.js
index fce3f835b..4e4ffd604 100644
--- a/docs/rust/implementors/core/marker/trait.Send.js
+++ b/docs/rust/implementors/core/marker/trait.Send.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html\" title=\"trait core::marker::Send\">Send</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.StructuralEq.js b/docs/rust/implementors/core/marker/trait.StructuralEq.js
index 50b63133f..f1d8e8922 100644
--- a/docs/rust/implementors/core/marker/trait.StructuralEq.js
+++ b/docs/rust/implementors/core/marker/trait.StructuralEq.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.StructuralEq.html\" title=\"trait core::marker::StructuralEq\">StructuralEq</a> for <a class=\"struct\" href=\"opendal/raw/oio/struct.Entry.html\" title=\"struct opendal::raw::oio::Entry\">Entry</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.StructuralEq.html\" title=\"trait core::marker::StructuralEq\">StructuralEq</a> for <a class=\"enum\" href=\"ope [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.StructuralEq.html\" title=\"trait core::marker::StructuralEq\">StructuralEq</a> for <a class=\"struct\" href=\"opendal/raw/oio/struct.Entry.html\" title=\"struct opendal::raw::oio::Entry\">Entry</a>"],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.StructuralEq.html\" title=\"trait core::marker::StructuralEq\">StructuralEq</a> for <a class=\"enum\" href=\"ope [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Sync.js b/docs/rust/implementors/core/marker/trait.Sync.js
index d92452598..22df00d22 100644
--- a/docs/rust/implementors/core/marker/trait.Sync.js
+++ b/docs/rust/implementors/core/marker/trait.Sync.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html\" title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" href=\"opendal/struct.Entry.ht [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/marker/trait.Unpin.js b/docs/rust/implementors/core/marker/trait.Unpin.js
index 8e4338629..983a94943 100644
--- a/docs/rust/implementors/core/marker/trait.Unpin.js
+++ b/docs/rust/implementors/core/marker/trait.Unpin.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"opendal/struct.En [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html\" title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"struct\" href=\"opendal/struct.En [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
index f71162661..c67f632a8 100644
--- a/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/docs/rust/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::u [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html\" title=\"trait core::panic::u [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
index 8dde69f1b..f829015ab 100644
--- a/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/docs/rust/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,3 +1,3 @@
 (function() {var implementors = {
-"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe:: [...]
+"opendal":[["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a class=\"enum\" href=\"opendal/enum.EntryMode.html\" title=\"enum opendal::EntryMode\">EntryMode</a>",1,["opendal::types::mode::EntryMode"]],["impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html\" title=\"trait core::panic::unwind_safe:: [...]
 };if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/implementors/opendal/raw/oio/write/api/trait.WriteExt.js b/docs/rust/implementors/opendal/raw/oio/write/api/trait.WriteExt.js
new file mode 100644
index 000000000..52a1d0def
--- /dev/null
+++ b/docs/rust/implementors/opendal/raw/oio/write/api/trait.WriteExt.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"opendal":[]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/docs/rust/opendal/all.html b/docs/rust/opendal/all.html
index 57203b149..7b34ef2e0 100644
--- a/docs/rust/opendal/all.html
+++ b/docs/rust/opendal/all.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="List of all items in this crate"><title>List of all items in this crate</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.fi [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="List of all items in this crate"><title>List of all items in this crate</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.fi [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/layers/struct.BlockingLayer.html b/docs/rust/opendal/layers/struct.BlockingLayer.html
index e0f0b413c..2b91a6e9b 100644
--- a/docs/rust/opendal/layers/struct.BlockingLayer.html
+++ b/docs/rust/opendal/layers/struct.BlockingLayer.html
@@ -1,11 +1,11 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add blocking API support for every operations."><title>BlockingLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cros [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add blocking API support for every operations."><title>BlockingLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cros [...]
 <h2 id="blocking-api"><a href="#blocking-api">Blocking API</a></h2>
 <ul>
 <li>This layer is auto-added to the operator if it’s accessor doesn’t support blocking APIs.</li>
 </ul>
 <p>Tracking issue: #2678</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/blocking.rs.html#39-47">source</a><a href="#impl-BlockingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingLayer.ht [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BlockingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/blocking.rs.html#34">source</a><a href="#impl-Clone-for-BlockingLayer" class="anchor">§</a><h3 class="co [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/blocking.rs.html#40-48">source</a><a href="#impl-BlockingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingLayer.ht [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-BlockingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/blocking.rs.html#35">source</a><a href="#impl-Clone-for-BlockingLayer" class="anchor">§</a><h3 class="co [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/layers/struct.LoggingLayer.html b/docs/rust/opendal/layers/struct.LoggingLayer.html
index 3c0d88a23..379352052 100644
--- a/docs/rust/opendal/layers/struct.LoggingLayer.html
+++ b/docs/rust/opendal/layers/struct.LoggingLayer.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add log for every operations."><title>LoggingLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add log for every operations."><title>LoggingLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../. [...]
 <h2 id="logging"><a href="#logging">Logging</a></h2>
 <ul>
 <li>OpenDAL will log in structural way.</li>
@@ -34,19 +34,19 @@
 </code></pre></div>
 <p>To config logging output, please refer to <a href="https://rust-lang-nursery.github.io/rust-cookbook/development_tools/debugging/config_log.html">Configure Logging</a>:</p>
 <div class="example-wrap"><pre class="language-shell"><code>RUST_LOG=&quot;info,opendal::services=debug&quot; ./app
-</code></pre></div></div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-LoggingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#103-150">source</a><a href="#impl-LoggingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struc [...]
+</code></pre></div></div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-LoggingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#104-151">source</a><a href="#impl-LoggingLayer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struc [...]
 <p>For example: accessor returns NotFound.</p>
 <p><code>None</code> means disable the log for error.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_failure_level" class="method"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#127-138">source</a><h4 class="code-header">pub fn <a href="#method.with_failure_level" class="fn">with_failure_level</a>(self, level: <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;<a class="primitive"  [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_failure_level" class="method"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#128-139">source</a><h4 class="code-header">pub fn <a href="#method.with_failure_level" class="fn">with_failure_level</a>(self, level: <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;<a class="primitive"  [...]
 <p>For example: accessor returns Unexpected network error.</p>
 <p><code>None</code> means disable the log for failure.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_backtrace_output" class="method"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#146-149">source</a><h4 class="code-header">pub fn <a href="#method.with_backtrace_output" class="fn">with_backtrace_output</a>(self, enable: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.bool.html">bool</a>) -&gt; Self</h4></section></summary><div class="docbloc [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_backtrace_output" class="method"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#147-150">source</a><h4 class="code-header">pub fn <a href="#method.with_backtrace_output" class="fn">with_backtrace_output</a>(self, enable: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.bool.html">bool</a>) -&gt; Self</h4></section></summary><div class="docbloc [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <ul>
 <li>When the error is an expected error, backtrace will not be output.</li>
 <li>backtrace output is disable by default.</li>
 </ul>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-LoggingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#86">source</a><a href="#impl-Clone-for-LoggingLayer" class="anchor">§</a><h3 class="code- [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-LoggingLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/logging.rs.html#87">source</a><a href="#impl-Clone-for-LoggingLayer" class="anchor">§</a><h3 class="code- [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/layers/struct.MadsimServer.html b/docs/rust/opendal/layers/struct.MadsimServer.html
index b9aba663a..d7a5bd10f 100644
--- a/docs/rust/opendal/layers/struct.MadsimServer.html
+++ b/docs/rust/opendal/layers/struct.MadsimServer.html
@@ -1,6 +1,6 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A simulated server.This an experimental feature, docs are not ready yet."><title>MadsimServer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fon [...]
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimServer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/madsim.rs.html#355-389">source</a><a href="#impl-MadsimServer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimServer.html" [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimServer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/madsim.rs.html#352">source</a><a href="#impl-Clone-for-MadsimServer" class="anchor">§</a><h3 class="code- [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A simulated server.This an experimental feature, docs are not ready yet."><title>MadsimServer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="fon [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MadsimServer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/madsim.rs.html#357-391">source</a><a href="#impl-MadsimServer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MadsimServer.html" [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MadsimServer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/madsim.rs.html#354">source</a><a href="#impl-Clone-for-MadsimServer" class="anchor">§</a><h3 class="code- [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/layers/struct.OtelTraceLayer.html b/docs/rust/opendal/layers/struct.OtelTraceLayer.html
index 4f04a450c..b8af4134f 100644
--- a/docs/rust/opendal/layers/struct.OtelTraceLayer.html
+++ b/docs/rust/opendal/layers/struct.OtelTraceLayer.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add opentelemetry::trace for every operations."><title>OtelTraceLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cro [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Add opentelemetry::trace for every operations."><title>OtelTraceLayer in opendal::layers - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cro [...]
 <p>Examples</p>
 <h3 id="basic-setup"><a href="#basic-setup">Basic Setup</a></h3>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
@@ -10,7 +10,7 @@
     .expect(<span class="string">&quot;must init&quot;</span>)
     .layer(OtelTraceLayer)
     .finish();</code></pre></div>
-</div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Layer%3CA%3E-for-OtelTraceLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/oteltrace.rs.html#55-61">source</a><a href="#impl-Layer%3CA%3E-for-OtelTraceLayer" class="anchor">§</a><h3 class="code [...]
+</div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Layer%3CA%3E-for-OtelTraceLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/oteltrace.rs.html#56-62">source</a><a href="#impl-Layer%3CA%3E-for-OtelTraceLayer" class="anchor">§</a><h3 class="code [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/raw/adapters/kv/struct.Backend.html b/docs/rust/opendal/raw/adapters/kv/struct.Backend.html
index e12a2e435..bcb440678 100644
--- a/docs/rust/opendal/raw/adapters/kv/struct.Backend.html
+++ b/docs/rust/opendal/raw/adapters/kv/struct.Backend.html
@@ -1,22 +1,22 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Backend of kv service. If the storage service is one k-v-like service, it should implement this kv `Backend` by right."><title>Backend in opendal::raw::adapters::kv - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../static.files/SourceSerif4-Regul [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Backend of kv service. If the storage service is one k-v-like service, it should implement this kv `Backend` by right."><title>Backend in opendal::raw::adapters::kv - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../static.files/SourceSerif4-Regul [...]
 <p><code>Backend</code> implements one general logic on how to read, write, scan the data from one kv store efficiently.
 And the <a href="trait.Adapter.html" title="trait opendal::raw::adapters::kv::Adapter"><code>Adapter</code></a> held by <code>Backend</code> will handle how to communicate with one k-v-like service really and provides
 a series of basic operation for this service.</p>
 <p>OpenDAL developer can implement one new k-v store backend easily with help of this Backend.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#39-56">source</a><a href="#impl-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="struct" href [...]
-    S: <a class="trait" href="trait.Adapter.html" title="trait opendal::raw::adapters::kv::Adapter">Adapter</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#44-49">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(kv: S) -&gt; Self</h4></section></summary><div class [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_root" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#52-55">source</a><h4 class="code-header">pub fn <a href="#method.with_root" class="fn">with_root</a>(self, root: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Configure root w [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Accessor-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#59-303">source</a><a href="#impl-Accessor-for-Backend%3CS%3E" class=" [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#44-61">source</a><a href="#impl-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="struct" href [...]
+    S: <a class="trait" href="trait.Adapter.html" title="trait opendal::raw::adapters::kv::Adapter">Adapter</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#49-54">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(kv: S) -&gt; Self</h4></section></summary><div class [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_root" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#57-60">source</a><h4 class="code-header">pub fn <a href="#method.with_root" class="fn">with_root</a>(self, root: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Configure root w [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Accessor-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#64-308">source</a><a href="#impl-Accessor-for-Backend%3CS%3E" class=" [...]
 <code>blocking_read</code> operation.</div></details><details class="toggle" open><summary><section id="associatedtype.Writer" class="associatedtype trait-impl"><a href="#associatedtype.Writer" class="anchor">§</a><h4 class="code-header">type <a href="../../trait.Accessor.html#associatedtype.Writer" class="associatedtype">Writer</a> = KvWriter&lt;S&gt;</h4></section></summary><div class='docblock'>Writer is the associated writer the could return in <code>write</code> operation.</div></de [...]
 <code>blocking_write</code> operation.</div></details><details class="toggle" open><summary><section id="associatedtype.Pager" class="associatedtype trait-impl"><a href="#associatedtype.Pager" class="anchor">§</a><h4 class="code-header">type <a href="../../trait.Accessor.html#associatedtype.Pager" class="associatedtype">Pager</a> = KvPager</h4></section></summary><div class='docblock'>Pager is the associated page that return in <code>list</code> operation.</div></details><details class=" [...]
-<code>blocking_list</code> operation.</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#67-99">source</a><a href="#method.info" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#tymethod.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="../../struct.AccessorInfo.html" title="struct  [...]
+<code>blocking_list</code> operation.</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#72-104">source</a><a href="#method.info" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#tymethod.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="../../struct.AccessorInfo.html" title="struct [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpCreateDir.html" title="struct opendal::raw::OpCreateDir">OpCreateDir</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>create</code> operation on the specified path <a href="../../trait.Accessor.html#method.create_dir">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_create_dir" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#107-112">source</a><a href="#method.blocking_create_dir"  [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>create</code> operation on the specified path <a href="../../trait.Accessor.html#method.create_dir">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_create_dir" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#112-117">source</a><a href="#method.blocking_create_dir"  [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpRead.html" title="struct opendal::raw::OpRead">OpRead</a>
@@ -24,11 +24,11 @@ a series of basic operation for this service.</p>
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>read</code> operation on the specified path, returns a
-<a href="../../../struct.Reader.html" title="struct opendal::Reader"><code>Reader</code></a> if operate successful. <a href="../../trait.Accessor.html#method.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_read" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#128-138">source</a><a href="#method.blocking_read" class="anchor">§</a><h4 class="code-header"> [...]
+<a href="../../../struct.Reader.html" title="struct opendal::Reader"><code>Reader</code></a> if operate successful. <a href="../../trait.Accessor.html#method.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_read" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#133-143">source</a><a href="#method.blocking_read" class="anchor">§</a><h4 class="code-header"> [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpRead.html" title="struct opendal::raw::OpRead">OpRead</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpRead.html" title="struct opendal::raw::RpRead">RpRead</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingReader" title="type opendal::raw::Accessor::BlockingReader">BlockingReader</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_read</code> operation on the specified path. <a hr [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpRead.html" title="struct opendal::raw::RpRead">RpRead</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingReader" title="type opendal::raw::Accessor::BlockingReader">BlockingReader</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_read</code> operation on the specified path. <a hr [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpWrite.html" title="struct opendal::raw::OpWrite">OpWrite</a>
@@ -36,36 +36,36 @@ a series of basic operation for this service.</p>
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>write</code> operation on the specified path, returns a
-written size if operate successful. <a href="../../trait.Accessor.html#method.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_write" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#153-164">source</a><a href="#method.blocking_write" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#method.blocking_write" class="fn">block [...]
+written size if operate successful. <a href="../../trait.Accessor.html#method.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_write" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#158-169">source</a><a href="#method.blocking_write" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#method.blocking_write" class="fn">block [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpWrite.html" title="struct opendal::raw::OpWrite">OpWrite</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpWrite.html" title="struct opendal::raw::RpWrite">RpWrite</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingWriter" title="type opendal::raw::Accessor::BlockingWriter">BlockingWriter</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_write</code> operation on the specified path. < [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpWrite.html" title="struct opendal::raw::RpWrite">RpWrite</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingWriter" title="type opendal::raw::Accessor::BlockingWriter">BlockingWriter</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_write</code> operation on the specified path. < [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpStat.html" title="struct opendal::raw::OpStat">OpStat</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>stat</code> operation on the specified path. <a href="../../trait.Accessor.html#method.stat">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_stat" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#182-196">source</a><a href="#method.blocking_stat" class="anchor">§</a [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>stat</code> operation on the specified path. <a href="../../trait.Accessor.html#method.stat">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_stat" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#187-201">source</a><a href="#method.blocking_stat" class="anchor">§</a [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpDelete.html" title="struct opendal::raw::OpDelete">OpDelete</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>delete</code> operation on the specified path. <a href="../../trait.Accessor.html#method.delete">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_delete" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#205-210">source</a><a href="#method.blocking_delete" class="anch [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>delete</code> operation on the specified path. <a href="../../trait.Accessor.html#method.delete">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_delete" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#210-215">source</a><a href="#method.blocking_delete" class="anch [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpList.html" title="struct opendal::raw::OpList">OpList</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>list</code> operation on the specified path. <a href="../../trait.Accessor.html#method.list">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_list" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#227-240">source</a><a href="#method.blocking_list" class="anchor">§</a [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>list</code> operation on the specified path. <a href="../../trait.Accessor.html#method.list">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_list" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#232-245">source</a><a href="#method.blocking_list" class="anchor">§</a [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpList.html" title="struct opendal::raw::OpList">OpList</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_list</code> operation on the specified path. <a href= [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_list</code> operation on the specified path. <a href= [...]
     &amp;'life0 self,
     from: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     to: &amp;'life2 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
@@ -74,7 +74,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,
-    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>rename</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.rename">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_rename" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#258-272">source</a><a [...]
+    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>rename</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.rename">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_rename" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#263-277">source</a><a [...]
     &amp;'life0 self,
     from: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     to: &amp;'life2 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
@@ -83,7 +83,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,
-    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>copy</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.copy">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_copy" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#289-302">source</a><a href= [...]
+    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>copy</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.copy">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_copy" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#294-307">source</a><a href= [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpPresign.html" title="struct opendal::raw::OpPresign">OpPresign</a>
@@ -95,7 +95,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     args: <a class="struct" href="../../struct.OpBatch.html" title="struct opendal::raw::OpBatch">OpBatch</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>batch</code> operations. <a href="../../trait.Accessor.html#method.batch">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#33">source</a><a href="#impl-Clone-for-Backend%3CS%3E" class="anchor">§ [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>batch</code> operations. <a href="../../trait.Accessor.html#method.batch">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/kv/backend.rs.html#38">source</a><a href="#impl-Clone-for-Backend%3CS%3E" class="anchor">§ [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-Backend%3CS%3E" class="impl"><a href="#impl-Send-for-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for < [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-Backend%3CS%3E" c [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
diff --git a/docs/rust/opendal/raw/adapters/typed_kv/struct.Backend.html b/docs/rust/opendal/raw/adapters/typed_kv/struct.Backend.html
index 4944f2274..766d4084f 100644
--- a/docs/rust/opendal/raw/adapters/typed_kv/struct.Backend.html
+++ b/docs/rust/opendal/raw/adapters/typed_kv/struct.Backend.html
@@ -1,18 +1,18 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The typed kv backend which implements Accessor for for typed kv adapter."><title>Backend in opendal::raw::adapters::typed_kv - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel [...]
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#35-52">source</a><a href="#impl-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="struct [...]
-    S: <a class="trait" href="trait.Adapter.html" title="trait opendal::raw::adapters::typed_kv::Adapter">Adapter</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#40-45">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(kv: S) -&gt; Self</h4></section></summar [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_root" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#48-51">source</a><h4 class="code-header">pub fn <a href="#method.with_root" class="fn">with_root</a>(self, root: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Configure  [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Accessor-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#55-292">source</a><a href="#impl-Accessor-for-Backend%3CS%3E" c [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The typed kv backend which implements Accessor for for typed kv adapter."><title>Backend in opendal::raw::adapters::typed_kv - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#40-57">source</a><a href="#impl-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="struct [...]
+    S: <a class="trait" href="trait.Adapter.html" title="trait opendal::raw::adapters::typed_kv::Adapter">Adapter</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#45-50">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>(kv: S) -&gt; Self</h4></section></summar [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_root" class="method"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#53-56">source</a><h4 class="code-header">pub fn <a href="#method.with_root" class="fn">with_root</a>(self, root: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Configure  [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Accessor-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#60-297">source</a><a href="#impl-Accessor-for-Backend%3CS%3E" c [...]
 <code>blocking_read</code> operation.</div></details><details class="toggle" open><summary><section id="associatedtype.Writer" class="associatedtype trait-impl"><a href="#associatedtype.Writer" class="anchor">§</a><h4 class="code-header">type <a href="../../trait.Accessor.html#associatedtype.Writer" class="associatedtype">Writer</a> = KvWriter&lt;S&gt;</h4></section></summary><div class='docblock'>Writer is the associated writer the could return in <code>write</code> operation.</div></de [...]
 <code>blocking_write</code> operation.</div></details><details class="toggle" open><summary><section id="associatedtype.Pager" class="associatedtype trait-impl"><a href="#associatedtype.Pager" class="anchor">§</a><h4 class="code-header">type <a href="../../trait.Accessor.html#associatedtype.Pager" class="associatedtype">Pager</a> = KvPager</h4></section></summary><div class='docblock'>Pager is the associated page that return in <code>list</code> operation.</div></details><details class=" [...]
-<code>blocking_list</code> operation.</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#63-106">source</a><a href="#method.info" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#tymethod.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="../../struct.AccessorInfo.html" title=" [...]
+<code>blocking_list</code> operation.</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#68-111">source</a><a href="#method.info" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#tymethod.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="../../struct.AccessorInfo.html" title=" [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpCreateDir.html" title="struct opendal::raw::OpCreateDir">OpCreateDir</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>create</code> operation on the specified path <a href="../../trait.Accessor.html#method.create_dir">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_create_dir" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#114-119">source</a><a href="#method.blocking_create [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>create</code> operation on the specified path <a href="../../trait.Accessor.html#method.create_dir">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_create_dir" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#119-124">source</a><a href="#method.blocking_create [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpRead.html" title="struct opendal::raw::OpRead">OpRead</a>
@@ -20,11 +20,11 @@
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>read</code> operation on the specified path, returns a
-<a href="../../../struct.Reader.html" title="struct opendal::Reader"><code>Reader</code></a> if operate successful. <a href="../../trait.Accessor.html#method.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_read" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#136-147">source</a><a href="#method.blocking_read" class="anchor">§</a><h4 class="code-he [...]
+<a href="../../../struct.Reader.html" title="struct opendal::Reader"><code>Reader</code></a> if operate successful. <a href="../../trait.Accessor.html#method.read">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_read" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#141-152">source</a><a href="#method.blocking_read" class="anchor">§</a><h4 class="code-he [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpRead.html" title="struct opendal::raw::OpRead">OpRead</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpRead.html" title="struct opendal::raw::RpRead">RpRead</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingReader" title="type opendal::raw::Accessor::BlockingReader">BlockingReader</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_read</code> operation on the specified path. <a hr [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpRead.html" title="struct opendal::raw::RpRead">RpRead</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingReader" title="type opendal::raw::Accessor::BlockingReader">BlockingReader</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_read</code> operation on the specified path. <a hr [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpWrite.html" title="struct opendal::raw::OpWrite">OpWrite</a>
@@ -32,36 +32,36 @@
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>write</code> operation on the specified path, returns a
-written size if operate successful. <a href="../../trait.Accessor.html#method.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_write" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#155-159">source</a><a href="#method.blocking_write" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#method.blocking_write" class="fn" [...]
+written size if operate successful. <a href="../../trait.Accessor.html#method.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_write" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#160-164">source</a><a href="#method.blocking_write" class="anchor">§</a><h4 class="code-header">fn <a href="../../trait.Accessor.html#method.blocking_write" class="fn" [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpWrite.html" title="struct opendal::raw::OpWrite">OpWrite</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpWrite.html" title="struct opendal::raw::RpWrite">RpWrite</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingWriter" title="type opendal::raw::Accessor::BlockingWriter">BlockingWriter</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_write</code> operation on the specified path. < [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpWrite.html" title="struct opendal::raw::RpWrite">RpWrite</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingWriter" title="type opendal::raw::Accessor::BlockingWriter">BlockingWriter</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_write</code> operation on the specified path. < [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpStat.html" title="struct opendal::raw::OpStat">OpStat</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>stat</code> operation on the specified path. <a href="../../trait.Accessor.html#method.stat">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_stat" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#175-187">source</a><a href="#method.blocking_stat" class="anchor [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>stat</code> operation on the specified path. <a href="../../trait.Accessor.html#method.stat">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_stat" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#180-192">source</a><a href="#method.blocking_stat" class="anchor [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     __arg2: <a class="struct" href="../../struct.OpDelete.html" title="struct opendal::raw::OpDelete">OpDelete</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>delete</code> operation on the specified path. <a href="../../trait.Accessor.html#method.delete">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_delete" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#196-201">source</a><a href="#method.blocking_delete" class [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>delete</code> operation on the specified path. <a href="../../trait.Accessor.html#method.delete">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_delete" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#201-206">source</a><a href="#method.blocking_delete" class [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpList.html" title="struct opendal::raw::OpList">OpList</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
     'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>list</code> operation on the specified path. <a href="../../trait.Accessor.html#method.list">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_list" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#218-231">source</a><a href="#method.blocking_list" class="anchor [...]
+    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>list</code> operation on the specified path. <a href="../../trait.Accessor.html#method.list">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_list" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#223-236">source</a><a href="#method.blocking_list" class="anchor [...]
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpList.html" title="struct opendal::raw::OpList">OpList</a>
-) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_list</code> operation on the specified path. <a href= [...]
+) -&gt; <a class="type" href="../../../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="../../struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="../../trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></summary><div class='docblock'>Invoke the <code>blocking_list</code> operation on the specified path. <a href= [...]
     &amp;'life0 self,
     from: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     to: &amp;'life2 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
@@ -70,7 +70,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,
-    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>rename</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.rename">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_rename" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#248-261">source [...]
+    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>rename</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.rename">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_rename" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#253-266">source [...]
     &amp;'life0 self,
     from: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     to: &amp;'life2 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
@@ -79,7 +79,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     Self: 'async_trait,
     'life0: 'async_trait,
     'life1: 'async_trait,
-    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>copy</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.copy">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_copy" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#278-291">source</a><a [...]
+    'life2: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>copy</code> operation on the specified <code>from</code> path and <code>to</code> path. <a href="../../trait.Accessor.html#method.copy">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.blocking_copy" class="method trait-impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#283-296">source</a><a [...]
     &amp;'life0 self,
     path: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="../../struct.OpPresign.html" title="struct opendal::raw::OpPresign">OpPresign</a>
@@ -91,7 +91,7 @@ written size if operate successful. <a href="../../trait.Accessor.html#method.wr
     args: <a class="struct" href="../../struct.OpBatch.html" title="struct opendal::raw::OpBatch">OpBatch</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../../type.Result.html" title="type opend [...]
     Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>batch</code> operations. <a href="../../trait.Accessor.html#method.batch">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#29">source</a><a href="#impl-Clone-for-Backend%3CS%3E" class="anc [...]
+    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Invoke the <code>batch</code> operations. <a href="../../trait.Accessor.html#method.batch">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Backend%3CS%3E" class="impl"><a class="srclink rightside" href="../../../../src/opendal/raw/adapters/typed_kv/backend.rs.html#34">source</a><a href="#impl-Clone-for-Backend%3CS%3E" class="anc [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-Backend%3CS%3E" class="impl"><a href="#impl-Send-for-Backend%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for < [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-Backend%3CS%3E" c [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
diff --git a/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html b/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html
index 51593e2e0..a9fff8bc5 100644
--- a/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html
+++ b/docs/rust/opendal/raw/oio/enum.ThreeWaysWriter.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ThreeWaysWriter is used to implement [`Write`] based on three ways."><title>ThreeWaysWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ThreeWaysWriter is used to implement [`Write`] based on three ways."><title>ThreeWaysWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as=" [...]
     One(ONE),
     Two(TWO),
     Three(THREE),
@@ -7,21 +7,11 @@
 </div></details><h2 id="variants" class="variants small-section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.One" class="variant"><a href="#variant.One" class="anchor">§</a><h3 class="code-header">One(ONE)</h3></section><div class="docblock"><p>The first type for the <a href="enum.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</code></a>.</p>
 </div><section id="variant.Two" class="variant"><a href="#variant.Two" class="anchor">§</a><h3 class="code-header">Two(TWO)</h3></section><div class="docblock"><p>The second type for the <a href="enum.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</code></a>.</p>
 </div><section id="variant.Three" class="variant"><a href="#variant.Three" class="anchor">§</a><h3 class="code-header">Three(THREE)</h3></section><div class="docblock"><p>The third type for the <a href="enum.ThreeWaysWriter.html" title="enum opendal::raw::oio::ThreeWaysWriter"><code>ThreeWaysWriter</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#93-119">source</a><a href="#impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THRE [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#104-110">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.htm [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#112-118">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a href="#impl-RefUnwindSafe-for-Three [...]
+</div></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#96-122">source</a><a href="#impl-Write-for-ThreeWaysWriter%3CONE,+TWO,+THRE [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     THREE: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     TWO: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a href="#impl-Send-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO, THREE&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trai [...]
@@ -45,4 +35,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/in [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-ThreeWaysWriter%3CONE,+TWO,+THREE%3E" class="impl"><a class="srclink righ [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html b/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
index 748979ce0..9ee4ca4ad 100644
--- a/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
+++ b/docs/rust/opendal/raw/oio/enum.TwoWaysWriter.html
@@ -1,25 +1,15 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="TwoWaysWrite is used to implement [`Write`] based on two ways."><title>TwoWaysWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" t [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="TwoWaysWrite is used to implement [`Write`] based on two ways."><title>TwoWaysWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" t [...]
     One(ONE),
     Two(TWO),
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>TwoWaysWrite is used to implement [<code>Write</code>] based on two ways.</p>
 <p>Users can wrap two different writers together.</p>
 </div></details><h2 id="variants" class="variants small-section-header">Variants<a href="#variants" class="anchor">§</a></h2><div class="variants"><section id="variant.One" class="variant"><a href="#variant.One" class="anchor">§</a><h3 class="code-header">One(ONE)</h3></section><div class="docblock"><p>The first type for the <a href="enum.TwoWaysWriter.html" title="enum opendal::raw::oio::TwoWaysWriter"><code>TwoWaysWriter</code></a>.</p>
 </div><section id="variant.Two" class="variant"><a href="#variant.Two" class="anchor">§</a><h3 class="code-header">Two(TWO)</h3></section><div class="docblock"><p>The second type for the <a href="enum.TwoWaysWriter.html" title="enum opendal::raw::oio::TwoWaysWriter"><code>TwoWaysWriter</code></a>.</p>
-</div></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#57-78">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#65-70">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html# [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#72-77">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a href="#impl-RefUnwindSafe-for-TwoWaysWriter% [...]
+</div></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#60-81">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,
     TWO: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a href="#impl-Send-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE, TWO&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait [...]
     ONE: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,
@@ -41,4 +31,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument. [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" hr [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/enum.WriteOperation.html b/docs/rust/opendal/raw/oio/enum.WriteOperation.html
index b4c638d33..589eae1ba 100644
--- a/docs/rust/opendal/raw/oio/enum.WriteOperation.html
+++ b/docs/rust/opendal/raw/oio/enum.WriteOperation.html
@@ -1,21 +1,21 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="WriteOperation is the name for APIs of Writer."><title>WriteOperation in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="WriteOperation is the name for APIs of Writer."><title>WriteOperation in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2 [...]
     Write,
     Abort,
     Close,
     BlockingWrite,
     BlockingClose,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>WriteOperation is the name for APIs of Writer.</p>
-</div></details><h2 id="variants" class="variants small-section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variant [...]
-</div><section id="variant.Abort" class="variant"><a href="#variant.Abort" class="anchor">§</a><h3 class="code-header">Abort</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.abort" title="method opendal::raw::oio::Write::abort"><code>Write::abort</code></a></p>
-</div><section id="variant.Close" class="variant"><a href="#variant.Close" class="anchor">§</a><h3 class="code-header">Close</h3></section><div class="docblock"><p>Operation for <a href="trait.Write.html#tymethod.close" title="method opendal::raw::oio::Write::close"><code>Write::close</code></a></p>
+</div></details><h2 id="variants" class="variants small-section-header">Variants (Non-exhaustive)<a href="#variants" class="anchor">§</a></h2><details class="toggle non-exhaustive"><summary class="hideme"><span>This enum is marked as non-exhaustive</span></summary><div class="docblock">Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variant [...]
+</div><section id="variant.Abort" class="variant"><a href="#variant.Abort" class="anchor">§</a><h3 class="code-header">Abort</h3></section><div class="docblock"><p>Operation for [<code>Write::abort</code>]</p>
+</div><section id="variant.Close" class="variant"><a href="#variant.Close" class="anchor">§</a><h3 class="code-header">Close</h3></section><div class="docblock"><p>Operation for [<code>Write::close</code>]</p>
 </div><section id="variant.BlockingWrite" class="variant"><a href="#variant.BlockingWrite" class="anchor">§</a><h3 class="code-header">BlockingWrite</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingWrite.html#tymethod.write" title="method opendal::raw::oio::BlockingWrite::write"><code>BlockingWrite::write</code></a></p>
 </div><section id="variant.BlockingClose" class="variant"><a href="#variant.BlockingClose" class="anchor">§</a><h3 class="code-header">BlockingClose</h3></section><div class="docblock"><p>Operation for <a href="trait.BlockingWrite.html#tymethod.close" title="method opendal::raw::oio::BlockingWrite::close"><code>BlockingWrite::close</code></a></p>
-</div></div><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#42-47">source</a><a href="#impl-WriteOperation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.WriteOperation.ht [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#27">source</a><a href="#impl-Clone-for-WriteOperation" class="anchor">§</a><h3 cl [...]
+</div></div><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#47-52">source</a><a href="#impl-WriteOperation" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.WriteOperation.ht [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#32">source</a><a href="#impl-Clone-for-WriteOperation" class="anchor">§</a><h3 cl [...]
     H: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
-    Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/1.72.0/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/1.72.0/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></det [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/1.72.0/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/1.72.0/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></det [...]
 by <code>==</code>.</div></details><details class="toggle method-toggle" open><summary><section id="method.ne" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/core/cmp.rs.html#226">source</a></span><a href="#method.ne" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.72.0/core/cmp/trait.PartialEq.html#method.ne" clas [...]
-sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#27">source</a><a href="#impl-Copy-for-WriteOperation" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href=" [...]
+sufficient, and should not be overridden without very good reason.</div></details></div></details><section id="impl-Copy-for-WriteOperation" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#32">source</a><a href="#impl-Copy-for-WriteOperation" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Copy.html" title="trait core::marker::Copy">Copy</a> for <a class="enum" href=" [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html
index 8a1a8d62e..b6380dc59 100644
--- a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html
+++ b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_std.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given reader into a wrapper with `std::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_std in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given reader into a wrapper with `std::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_std in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295 [...]
     reader: R
 ) -&gt; <a class="struct" href="struct.CloneableReaderWithinStd.html" title="struct opendal::raw::oio::CloneableReaderWithinStd">CloneableReaderWithinStd</a>&lt;R&gt;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Convert given reader into a wrapper with <code>std::sync::Mutex</code> for <code>Send + Sync + Clone</code>.</p>
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html
index 5c023a0c3..d7913f01d 100644
--- a/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html
+++ b/docs/rust/opendal/raw/oio/fn.into_cloneable_reader_within_tokio.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given reader into a wrapper with `tokio::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_tokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given reader into a wrapper with `tokio::sync::Mutex` for `Send + Sync + Clone`."><title>into_cloneable_reader_within_tokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
     reader: R
 ) -&gt; <a class="struct" href="struct.CloneableReaderWithinTokio.html" title="struct opendal::raw::oio::CloneableReaderWithinTokio">CloneableReaderWithinTokio</a>&lt;R&gt;</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Convert given reader into a wrapper with <code>tokio::sync::Mutex</code> for <code>Send + Sync + Clone</code>.</p>
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html b/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
index 7ac770de0..9f23db8d0 100644
--- a/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
+++ b/docs/rust/opendal/raw/oio/fn.into_read_from_stream.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given stream `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Reader`."><title>into_read_from_stream in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Convert given stream `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Reader`."><title>into_read_from_stream in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf. [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/index.html b/docs/rust/opendal/raw/oio/index.html
index e1a71865e..15193c7ae 100644
--- a/docs/rust/opendal/raw/oio/index.html
+++ b/docs/rust/opendal/raw/oio/index.html
@@ -8,10 +8,10 @@ reader.</div></li><li><div class="item-name"><a class="struct" href="struct.Clon
 reader.</div></li><li><div class="item-name"><a class="struct" href="struct.Cursor.html" title="struct opendal::raw::oio::Cursor">Cursor</a></div><div class="desc docblock-short">Cursor is the cursor for [<code>Bytes</code>] that implements <a href="trait.Read.html" title="trait opendal::raw::oio::Read"><code>oio::Read</code></a></div></li><li><div class="item-name"><a class="struct" href="struct.Entry.html" title="struct opendal::raw::oio::Entry">Entry</a></div><div class="desc docblock [...]
 underlying storage when the buffered size is exactly the same as the buffer size.</div></li><li><div class="item-name"><a class="struct" href="struct.FlatPager.html" title="struct opendal::raw::oio::FlatPager">FlatPager</a></div><div class="desc docblock-short">ToFlatPager will walk dir in bottom up way:</div></li><li><div class="item-name"><a class="struct" href="struct.FromFileReader.html" title="struct opendal::raw::oio::FromFileReader">FromFileReader</a></div><div class="desc docbloc [...]
 not needed entries.</div></li><li><div class="item-name"><a class="struct" href="struct.MultipartUploadPart.html" title="struct opendal::raw::oio::MultipartUploadPart">MultipartUploadPart</a></div><div class="desc docblock-short">The result of <a href="trait.MultipartUploadWrite.html#tymethod.write_part" title="method opendal::raw::oio::MultipartUploadWrite::write_part"><code>MultipartUploadWrite::write_part</code></a>.</div></li><li><div class="item-name"><a class="struct" href="struct. [...]
-uploads.</div></li><li><div class="item-name"><a class="struct" href="struct.OneShotWriter.html" title="struct opendal::raw::oio::OneShotWriter">OneShotWriter</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot.</div></li><li><div class="item-name"><a class="struct" href="struct.StreamableReader.html" title="struct opendal::raw::oio::StreamableReader">StreamableReader</a></div><div class="desc docblock-short">Make given read  [...]
+uploads.</div></li><li><div class="item-name"><a class="struct" href="struct.OneShotWriter.html" title="struct opendal::raw::oio::OneShotWriter">OneShotWriter</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot.</div></li><li><div class="item-name"><a class="struct" href="struct.RangeWriter.html" title="struct opendal::raw::oio::RangeWriter">RangeWriter</a></div><div class="desc docblock-short">RangeWriter will implements [<c [...]
 object. By implementing AppendObjectWrite, services don’t need to
 care about the details of buffering and uploading parts.</div></li><li><div class="item-name"><a class="trait" href="trait.BlockingPage.html" title="trait opendal::raw::oio::BlockingPage">BlockingPage</a></div><div class="desc docblock-short">BlockingPage is the blocking version of <a href="trait.Page.html" title="trait opendal::raw::oio::Page"><code>Page</code></a>.</div></li><li><div class="item-name"><a class="trait" href="trait.BlockingRead.html" title="trait opendal::raw::oio::Block [...]
 uploads. By implementing MultipartUploadWrite, services don’t need to
-care about the details of buffering and uploading parts.</div></li><li><div class="item-name"><a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw::oio::OneShotWrite">OneShotWrite</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot operation.
+care about the details of uploading parts.</div></li><li><div class="item-name"><a class="trait" href="trait.OneShotWrite.html" title="trait opendal::raw::oio::OneShotWrite">OneShotWrite</a></div><div class="desc docblock-short">OneShotWrite is used to implement [<code>Write</code>] based on one shot operation.
 By implementing OneShotWrite, services don’t need to care about the details.</div></li><li><div class="item-name"><a class="trait" href="trait.Page.html" title="trait opendal::raw::oio::Page">Page</a></div><div class="desc docblock-short">Page trait is used by <a href="../trait.Accessor.html" title="trait opendal::raw::Accessor"><code>raw::Accessor</code></a> to implement <code>list</code>
-or <code>scan</code> operation.</div></li><li><div class="item-name"><a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a></div><div class="desc docblock-short">Read is the trait that OpenDAL returns to callers.</div></li><li><div class="item-name"><a class="trait" href="trait.ReadExt.html" title="trait opendal::raw::oio::ReadExt">ReadExt</a></div><div class="desc docblock-short">Extension of <a href="trait.Read.html" title="trait opendal::raw::oio::Read" [...]
\ No newline at end of file
+or <code>scan</code> operation.</div></li><li><div class="item-name"><a class="trait" href="trait.RangeWrite.html" title="trait opendal::raw::oio::RangeWrite">RangeWrite</a></div><div class="desc docblock-short">RangeWrite is used to implement [<code>Write</code>] based on range write.</div></li><li><div class="item-name"><a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a></div><div class="desc docblock-short">Read is the trait that OpenDAL returns to c [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/sidebar-items.js b/docs/rust/opendal/raw/oio/sidebar-items.js
index 225ca7691..ccfb30f9f 100644
--- a/docs/rust/opendal/raw/oio/sidebar-items.js
+++ b/docs/rust/opendal/raw/oio/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"enum":["PageOperation","ReadOperation","ThreeWaysWriter","TwoWaysWriter","WriteOperation"],"fn":["into_cloneable_reader_within_std","into_cloneable_reader_within_tokio","into_flat_page","into_hierarchy_page","into_read_from_file","into_read_from_stream","into_seekable_read_by_range","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AppendObjectWriter","ByRangeSeekableReader","ChunkedCursor","CloneableReaderWithinStd","CloneableReaderWithi [...]
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"enum":["PageOperation","ReadOperation","ThreeWaysWriter","TwoWaysWriter","WriteOperation"],"fn":["into_cloneable_reader_within_std","into_cloneable_reader_within_tokio","into_flat_page","into_hierarchy_page","into_read_from_file","into_read_from_stream","into_seekable_read_by_range","into_stream","into_stream_from_reader","into_streamable_read"],"struct":["AppendObjectWriter","ByRangeSeekableReader","ChunkedCursor","CloneableReaderWithinStd","CloneableReaderWithi [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html b/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
index ba1137acf..3ad417069 100644
--- a/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.AppendObjectWriter.html
@@ -1,27 +1,15 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="AppendObjectWriter will implements [`Write`] based on append object."><title>AppendObjectWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="AppendObjectWriter will implements [`Write`] based on append object."><title>AppendObjectWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
 <h3 id="todo"><a href="#todo">TODO</a></h3>
 <ul>
 <li>Allow users to switch to un-buffered mode if users write 16MiB every time.</li>
 </ul>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#54-73">source</a><a href="#impl-AppendObjectWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#76-104">source</a><a href="#impl-Write-for-AppendObjec [...]
-    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#80-95">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="tra [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#97-99">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#101-103">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" class [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-AppendObjectWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-AppendObjectWriter%3CW%3E" class="anchor">§</a>< [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-AppendObjectWriter%3CW%3E" class="impl"><a href="#impl-Send-for-AppendObjectWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-AppendObjectWriter%3CW%3E" [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#70-78">source</a><a href="#impl-AppendObjectWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#81-135">source</a><a href="#impl-Write-for-AppendObjec [...]
+    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#85-126">source</a><a href="#method.poll_write" class="anchor">§</a><h4 class="code-header">fn < [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
@@ -39,4 +27,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-AppendObjectWriter%3CW%3E" class="impl"><a class="srclink rightside" href [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html
index abb28df9c..924f51f47 100644
--- a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html
+++ b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinStd.html
@@ -1,17 +1,17 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="CloneableReaderWithinStd is a Send + Sync + Clone with `std::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinStd in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="CloneableReaderWithinStd is a Send + Sync + Clone with `std::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinStd in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac [...]
 reader.</p>
 <p>Caller can clone this reader but only one thread can calling <code>oio::Read</code> API at the
 same time, otherwise, we will return error if lock block happened.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#37-42">source</a><a href="#impl-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">i [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#44-48">source</a><a href="#impl-Clone-for-CloneableRea [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#40-45">source</a><a href="#impl-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">i [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#47-51">source</a><a href="#impl-Clone-for-CloneableRea [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     pos: <a class="enum" href="https://doc.rust-lang.org/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="togg [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="togg [...]
     R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a href="#impl-Sync-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" [...]
     R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Unpin-for-CloneableReaderWithinStd%3CR%3E" class="impl"><a href="#impl-Unpin-for-CloneableReaderWithinStd%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="st [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
diff --git a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html
index 8d3b80a6e..7e0b9695b 100644
--- a/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html
+++ b/docs/rust/opendal/raw/oio/struct.CloneableReaderWithinTokio.html
@@ -1,17 +1,17 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="CloneableReaderWithinTokio is a Send + Sync + Clone with `tokio::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinTokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98e [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="CloneableReaderWithinTokio is a Send + Sync + Clone with `tokio::sync::Mutex` wrapper of input reader."><title>CloneableReaderWithinTokio in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98e [...]
 reader.</p>
 <p>Caller can clone this reader but only one thread can calling <code>oio::Read</code> API at the
 same time, otherwise, we will return error if lock block happened.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#94-99">source</a><a href="#impl-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-heade [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#101-105">source</a><a href="#impl-Clone-for-Cloneabl [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#97-102">source</a><a href="#impl-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-head [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/cloneable_read.rs.html#104-108">source</a><a href="#impl-Clone-for-Cloneabl [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     pos: <a class="enum" href="https://doc.rust-lang.org/1.72.0/std/io/enum.SeekFrom.html" title="enum std::io::SeekFrom">SeekFrom</a>
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="togg [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section></summary><div class='docblock'>Seek asynchronously. <a href="trait.Read.html#tymethod.poll_seek">Read more</a></div></details><details class="togg [...]
     R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a href="#impl-Sync-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="str [...]
     R: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Unpin-for-CloneableReaderWithinTokio%3CR%3E" class="impl"><a href="#impl-Unpin-for-CloneableReaderWithinTokio%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
diff --git a/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html b/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
index dfa5decbb..36d3035ff 100644
--- a/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.ExactBufWriter.html
@@ -1,26 +1,16 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ExactBufWriter is used to implement `oio::Write` based on exact buffer strategy: flush the underlying storage when the buffered size is exactly the same as the buffer size."><title>ExactBufWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorig [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="ExactBufWriter is used to implement `oio::Write` based on exact buffer strategy: flush the underlying storage when the buffered size is exactly the same as the buffer size."><title>ExactBufWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorig [...]
 underlying storage when the buffered size is exactly the same as the buffer size.</p>
 <p>ExactBufWriter makes sure that the size of the data written to the underlying storage is exactly
 <code>buffer_size</code> bytes. It’s useful when the underlying storage requires the size to be written.</p>
 <p>For example, R2 requires all parts must be the same size except the last part.</p>
 <h3 id="notes"><a href="#notes">Notes</a></h3>
 <p>ExactBufWriter is not a good choice for most cases, because it will cause more network requests.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#46-55">source</a><a href="#impl-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#64-133">source</a><a href="#impl-Write-for-ExactBufWriter%3CW% [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#104-107">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.h [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#109-132">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_tr [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-ExactBufWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-ExactBufWriter%3CW%3 [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#50-59">source</a><a href="#impl-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/exact_buf_write.rs.html#68-137">source</a><a href="#impl-Write-for-ExactBufWriter%3CW% [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-ExactBufWriter%3CW%3E" class="impl"><a href="#impl-Send-for-ExactBufWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send"> [...]
     W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-ExactBufWriter%3CW%3E" cla [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
@@ -40,4 +30,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.htm [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-ExactBufWriter%3CW%3E" class="impl"><a class="srclink rightside" href=".. [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.FromStreamReader.html b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
index 10bb8750e..4c4b9e42b 100644
--- a/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
+++ b/docs/rust/opendal/raw/oio/struct.FromStreamReader.html
@@ -1,11 +1,11 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FromStreamReader will convert a `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Read`"><title>FromStreamReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.t [...]
-</div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#39-83">source</a><a href="#impl-Read-for-FromStreamReader%3CS%3E" class="ancho [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="FromStreamReader will convert a `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into `oio::Read`"><title>FromStreamReader in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.t [...]
+</div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Read-for-FromStreamReader%3CS%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#43-87">source</a><a href="#impl-Read-for-FromStreamReader%3CS%3E" class="ancho [...]
     S: Stream&lt;Item = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;T&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::mark [...]
-    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#44-63">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="cod [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_read" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_stream.rs.html#48-67">source</a><a href="#method.poll_read" class="anchor">§</a><h4 class="cod [...]
     &amp;mut self,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Read bytes asynchronously.</div></details><details class="toggle method-toggle" open><summary><section id="meth [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Send-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Se [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a>,</span></h3></section><section id="impl-Sync-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Sync-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Fr [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Unpin-for-FromStreamReader%3CS%3E" class="impl"><a href="#impl-Unpin-for-FromStreamReader%3CS%3E" class="anchor">§</a><h3 class="code-header">impl&lt;S&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="stru [...]
diff --git a/docs/rust/opendal/raw/oio/struct.MultipartUploadPart.html b/docs/rust/opendal/raw/oio/struct.MultipartUploadPart.html
index 75bf15f35..890aeea01 100644
--- a/docs/rust/opendal/raw/oio/struct.MultipartUploadPart.html
+++ b/docs/rust/opendal/raw/oio/struct.MultipartUploadPart.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The result of `MultipartUploadWrite::write_part`."><title>MultipartUploadPart in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="fo [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The result of `MultipartUploadWrite::write_part`."><title>MultipartUploadPart in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="fo [...]
     pub part_number: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>,
     pub etag: <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>The result of <a href="trait.MultipartUploadWrite.html#tymethod.write_part" title="method opendal::raw::oio::MultipartUploadWrite::write_part"><code>MultipartUploadWrite::write_part</code></a>.</p>
@@ -9,11 +9,12 @@
 </ul>
 </div></details><h2 id="fields" class="fields small-section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.part_number" class="structfield small-section-header"><a href="#structfield.part_number" class="anchor field">§</a><code>part_number: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a></code></span><div class="docblock"><p>The number of the part, starting from 0.</p>
 </div><span id="structfield.etag" class="structfield small-section-header"><a href="#structfield.etag" class="anchor field">§</a><code>etag: <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a></code></span><div class="docblock"><p>The etag of the part.</p>
-</div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-MultipartUploadPart" class="impl"><a href="#impl-RefUnwindSafe-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait co [...]
+</div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MultipartUploadPart" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#80">source</a><a href="#impl-Clone-for-MultipartUploadPart" class="anchor">§</a><h3 class [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
-</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FutureExt-for-MultipartUploadPart" class="impl"><a href="#impl-FutureExt-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FutureExt for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_context" class="method trait-impl"><a href="#method.with_context" class="anchor">§</a><h4 cl [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FromRef%3CT%3E-for-MultipartUploadPart" class="impl"><a href="#impl-FromRef%3CT%3E-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FromRef&lt;T&gt; for T<span class="where fmt-newline">where
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from_ref" class="method trait-impl"><a href="#method.from_ref" class="anchor">§</a><h4 class="code-header">fn <a class="fn">from_ref</a>(input: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.h [...]
 wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
 wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-MultipartUploadPart" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html [...]
 <code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc [...]
@@ -21,7 +22,8 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
 <p>That is, this conversion is whatever the implementation of
 <code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
-</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-MultipartUploadPart" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::re [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-MultipartUploadPart" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-MultipartUploadPart" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::re [...]
+    T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Owned" class="associatedtype trait-impl"><a href="#associatedtype.Owned" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/alloc/borrow/trait.ToOwned.html#associatedtype.Owned" class="associated [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
     U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-MultipartUploadPart" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html# [...]
diff --git a/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html b/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
index 9a53e5f06..f40ea5c2e 100644
--- a/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.MultipartUploadWriter.html
@@ -1,30 +1,12 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="MultipartUploadWriter will implements [`Write`] based on multipart uploads."><title>MultipartUploadWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel= [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="MultipartUploadWriter will implements [`Write`] based on multipart uploads."><title>MultipartUploadWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel= [...]
 uploads.</p>
-<h3 id="todo"><a href="#todo">TODO</a></h3>
-<ul>
-<li>Add threshold for <code>write_once</code> to avoid unnecessary multipart uploads.</li>
-<li>Allow users to switch to un-buffered mode if users write 16MiB every time.</li>
-</ul>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#93-115">source</a><a href="#impl-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-heade [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.upload_id" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#105-114">source</a><h4 class="code-header">pub async fn <a href="#method.upload_id" class="fn">upload_id</a>(&amp;mut self) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/a [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#118-159">source</a><a href="#impl-Write-for-Mult [...]
-    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#122-138">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">f [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#140-148">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait. [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#150-158">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.abort" cl [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-MultipartUploadWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-MultipartUploadWriter%3CW%3E" class="anchor"> [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-MultipartUploadWriter%3CW%3E" class="impl"><a href="#impl-Send-for-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core:: [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-MultipartUploadWriter%3CW% [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#110-120">source</a><a href="#impl-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-head [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#123-252">source</a><a href="#impl-Write-for-Mult [...]
+    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.poll_write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#127-184">source</a><a href="#method.poll_write" class="anchor">§</a><h4 class="code [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
@@ -42,4 +24,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" h [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.OneShotWriter.html b/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
index abde06b8d..d2cb58755 100644
--- a/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
+++ b/docs/rust/opendal/raw/oio/struct.OneShotWriter.html
@@ -1,22 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="OneShotWrite is used to implement [`Write`] based on one shot."><title>OneShotWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" t [...]
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#42-47">source</a><a href="#impl-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="t [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#50-64">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E"  [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.write">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#57-59">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html [...]
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Abort the pending writer.</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#61-63">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="trait.Write.html#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class='docblock'>Close the writer and make sure all data has been flushed.</div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-OneShotWriter%3CW%3E" class="impl"><a href="#impl-RefUnwindSafe-for-OneShotWriter%3CW%3E" [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a>,</span></h3></section><section id="impl-Send-for-OneShotWriter%3CW%3E" class="impl"><a href="#impl-Send-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Se [...]
-    W: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a>,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-OneShotWriter%3CW%3E" clas [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="OneShotWrite is used to implement [`Write`] based on one shot."><title>OneShotWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" t [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#58-65">source</a><a href="#impl-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="t [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#68-104">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
@@ -34,4 +22,5 @@ wrapper. <a>Read more</a></div></details></div></details><details class="toggle
     V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html [...]
     S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
-<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../ [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/struct.RangeWriter.html b/docs/rust/opendal/raw/oio/struct.RangeWriter.html
new file mode 100644
index 000000000..4b4146d11
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/struct.RangeWriter.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="RangeWriter will implements [`Write`] based on range write."><title>RangeWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type=" [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#102-127">source</a><a href="#impl-RangeWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="trait" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_align_size" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#123-126">source</a><h4 class="code-header">pub fn <a href="#method.with_align_size" class="fn">with_align_size</a>(self, size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock">< [...]
+<p>The size is default to 256 KiB.</p>
+<h5 id="note"><a href="#note">Note</a></h5>
+<p>Please don’t mix this with the buffer size. Align size is usually the hard
+limit for the service to accept the chunk.</p>
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#129-292">source</a><a href="#impl-Write-for-RangeWriter%3CW%3E" class [...]
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Write given bytes into writer. <a href="trait.Write.html#tymethod.poll_write">Read more</a></div></details><det [...]
+    T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FutureExt-for-RangeWriter%3CW%3E" class="impl"><a href="#impl-FutureExt-for-RangeWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FutureExt for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_context" class="method trait-impl"><a href="#method.with_context" class="anchor">§</a><h4 clas [...]
+wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
+wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-RangeWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html"  [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc [...]
+<code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#706">source</a><a href="#impl-Into%3CU%3E-for-RangeWriter%3CW%3E" class="anchor">§</a><h3  [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/convert/mod.rs.html#715">source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+<p>That is, this conversion is whatever the implementation of
+<code><a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
+</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-IntoRequest%3CT%3E-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tonic/0.9.2/src/tonic/request.rs.html#384">source</a><a href="#impl-IntoRequest%3CT%3E-for-RangeWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tonic/0.9.2/tonic/request/trait.IntoRequest.html" title="trait tonic::requ [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html#associatedtype.Error" class=" [...]
+    U: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.72.0/core/convert/trait.TryInto.html#associatedtype.E [...]
+    V: MultiLane&lt;T&gt;,</span></h3></section></summary><div class="impl-items"><section id="method.vzip" class="method trait-impl"><a href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WithSubscriber-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#3 [...]
+    S: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Dispatch&gt;,</span></h4></section></summary><div class='docblock'>Attaches the provided <a href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_subscriber">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_subscriber" class="method trait-impl"><a class="srclink rightside" href="https://docs.rs/tracing [...]
+<a href="https://docs.rs/tracing/0.1.37/tracing/instrument/struct.WithDispatch.html" title="struct tracing::instrument::WithDispatch"><code>WithDispatch</code></a> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.WithSubscriber.html#method.with_current_subscriber">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-WriteExt-for-RangeWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../.. [...]
+    T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><a href="#method.write" class="anchor">§</a><h4 class="code-header">fn <a href="trait.WriteExt.html#method.write" class="fn">write</a [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html b/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html
index cf458363e..34a3c6f68 100644
--- a/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.AppendObjectWrite.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="AppendObjectWrite is used to implement [`Write`] based on append object. By implementing AppendObjectWrite, services don’t need to care about the details of buffering and uploading parts."><title>AppendObjectWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="fon [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="AppendObjectWrite is used to implement [`Write`] based on append object. By implementing AppendObjectWrite, services don’t need to care about the details of buffering and uploading parts."><title>AppendObjectWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="fon [...]
     // Required methods
     fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 self
@@ -22,13 +22,13 @@ care about the details of buffering and uploading parts.</p>
 <li><code>AppendObjectWriter</code> impl <code>Write</code></li>
 <li>Expose <code>AppendObjectWriter</code> as <code>Accessor::Writer</code></li>
 </ul>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.offset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#37">source</a><h4 class="code-header">fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.offset" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#42">source</a><h4 class="code-header">fn <a href="#tymethod.offset" class="fn">offset</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
     Self: 'async_trait,
     'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Get the current offset of the append object.</p>
 <p>Returns <code>0</code> if the object is not exist.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.append" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#40">source</a><h4 class="code-header">fn <a href="#tymethod.append" class="fn">append</a>&lt;'life0, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.append" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/append_object_write.rs.html#45">source</a><h4 class="code-header">fn <a href="#tymethod.append" class="fn">append</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self,
     offset: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
     size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
diff --git a/docs/rust/opendal/raw/oio/trait.BlockingWrite.html b/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
index ed52bf9ad..aed45b95e 100644
--- a/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.BlockingWrite.html
@@ -1,10 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWrite is the trait that OpenDAL returns to callers."><title>BlockingWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWrite is the trait that OpenDAL returns to callers."><title>BlockingWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type [...]
     // Required methods
     fn <a href="#tymethod.write" class="fn">write</a>(&amp;mut self, bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;;
 <span class="item-spacer"></span>    fn <a href="#tymethod.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;;
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>BlockingWrite is the trait that OpenDAL returns to callers.</p>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.write" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#140">source</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&amp;mut self, bs: &amp;dyn <a class="trait" href="trait.WriteBu [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.close" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143">source</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4 [...]
-</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-BlockingWrite-for-()" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#146-159">source</a><a href="#impl-BlockingWrite-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.BlockingWrite. [...]
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.write" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#219">source</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&amp;mut self, bs: &amp;dyn <a class="trait" href="trait.WriteBu [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.close" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#222">source</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4 [...]
+</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-BlockingWrite-for-()" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#225-238">source</a><a href="#impl-BlockingWrite-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.BlockingWrite. [...]
 <p>To make BlockingWriter work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.write-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#165-167">source</a><a href="#method.write-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&amp;mut self, bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>) -&gt; <a class="type" href="../../type.Result.html" title= [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="method.write-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#244-246">source</a><a href="#method.write-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>(&amp;mut self, bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>) -&gt; <a class="type" href="../../type.Result.html" title= [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.MultipartUploadWrite.html b/docs/rust/opendal/raw/oio/trait.MultipartUploadWrite.html
index a5bc56134..bbcbf0cb4 100644
--- a/docs/rust/opendal/raw/oio/trait.MultipartUploadWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.MultipartUploadWrite.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="MultipartUploadWrite is used to implement [`Write`] based on multipart uploads. By implementing MultipartUploadWrite, services don’t need to care about the details of buffering and uploading parts."><title>MultipartUploadWrite in opendal::raw::oio - Rust</title><link rel="preload" as="fo [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="MultipartUploadWrite is used to implement [`Write`] based on multipart uploads. By implementing MultipartUploadWrite, services don’t need to care about the details of uploading parts."><title>MultipartUploadWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font [...]
     // Required methods
     fn <a href="#tymethod.initiate_part" class="fn">initiate_part</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 self
@@ -33,14 +33,15 @@
              'life1: 'async_trait</span>;
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>MultipartUploadWrite is used to implement [<code>Write</code>] based on multipart
 uploads. By implementing MultipartUploadWrite, services don’t need to
-care about the details of buffering and uploading parts.</p>
-<p>The layout after adopting <a href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite"><code>MultipartUploadWrite</code></a>:</p>
+care about the details of uploading parts.</p>
+<h2 id="architecture"><a href="#architecture">Architecture</a></h2>
+<p>The architecture after adopting <a href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite"><code>MultipartUploadWrite</code></a>:</p>
 <ul>
 <li>Services impl <code>MultipartUploadWrite</code></li>
 <li><code>MultipartUploadWriter</code> impl <code>Write</code></li>
 <li>Expose <code>MultipartUploadWriter</code> as <code>Accessor::Writer</code></li>
 </ul>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.initiate_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#41">source</a><h4 class="code-header">fn <a href="#tymethod.initiate_part" class="fn">initiate_part</a>&lt;'life0, 'async_trait&gt;(
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.initiate_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#49">source</a><h4 class="code-header">fn <a href="#tymethod.initiate_part" class="fn">initiate_part</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
     Self: 'async_trait,
@@ -51,7 +52,7 @@ care about the details of buffering and uploading parts.</p>
 <li>the total size of data is known, but the size of current write
 is less then the total size.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.write_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#50-56">source</a><h4 class="code-header">fn <a href="#tymethod.write_part" class="fn">write_part</a>&lt;'life0, 'life1, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.write_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#58-64">source</a><h4 class="code-header">fn <a href="#tymethod.write_part" class="fn">write_part</a>&lt;'life0, 'life1, 'async_trait&gt;(
     &amp;'life0 self,
     upload_id: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     part_number: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>,
@@ -67,7 +68,7 @@ order.</p>
 <ul>
 <li>part_number is the index of the part, starting from 0.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.complete_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#60">source</a><h4 class="code-header">fn <a href="#tymethod.complete_part" class="fn">complete_part</a>&lt;'life0, 'life1, 'life2, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.complete_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#68">source</a><h4 class="code-header">fn <a href="#tymethod.complete_part" class="fn">complete_part</a>&lt;'life0, 'life1, 'life2, 'async_trait&gt;(
     &amp;'life0 self,
     upload_id: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     parts: &amp;'life2 [<a class="struct" href="struct.MultipartUploadPart.html" title="struct opendal::raw::oio::MultipartUploadPart">MultipartUploadPart</a>]
@@ -77,7 +78,7 @@ order.</p>
     'life1: 'async_trait,
     'life2: 'async_trait,</span></h4></section></summary><div class="docblock"><p>complete_part will complete the multipart upload to build the final
 file.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.abort_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#63">source</a><h4 class="code-header">fn <a href="#tymethod.abort_part" class="fn">abort_part</a>&lt;'life0, 'life1, 'async_trait&gt;(
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.abort_part" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#71">source</a><h4 class="code-header">fn <a href="#tymethod.abort_part" class="fn">abort_part</a>&lt;'life0, 'life1, 'async_trait&gt;(
     &amp;'life0 self,
     upload_id: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
diff --git a/docs/rust/opendal/raw/oio/trait.OneShotWrite.html b/docs/rust/opendal/raw/oio/trait.OneShotWrite.html
index b1ece9062..42780afe2 100644
--- a/docs/rust/opendal/raw/oio/trait.OneShotWrite.html
+++ b/docs/rust/opendal/raw/oio/trait.OneShotWrite.html
@@ -1,22 +1,20 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="OneShotWrite is used to implement [`Write`] based on one shot operation. By implementing OneShotWrite, services don’t need to care about the details."><title>OneShotWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="OneShotWrite is used to implement [`Write`] based on one shot operation. By implementing OneShotWrite, services don’t need to care about the details."><title>OneShotWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static. [...]
     // Required method
-    fn <a href="#tymethod.write_once" class="fn">write_once</a>&lt;'life0, 'life1, 'async_trait&gt;(
+    fn <a href="#tymethod.write_once" class="fn">write_once</a>&lt;'life0, 'async_trait&gt;(
         &amp;'life0 self,
-        body: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+        bs: Bytes
     ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
        <span class="where">where Self: 'async_trait,
-             'life0: 'async_trait,
-             'life1: 'async_trait</span>;
+             'life0: 'async_trait</span>;
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>OneShotWrite is used to implement [<code>Write</code>] based on one shot operation.
 By implementing OneShotWrite, services don’t need to care about the details.</p>
 <p>For example, S3 <code>PUT Object</code> and fs <code>write_all</code>.</p>
 <p>The layout after adopting <a href="trait.OneShotWrite.html" title="trait opendal::raw::oio::OneShotWrite"><code>OneShotWrite</code></a>:</p>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.write_once" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#34">source</a><h4 class="code-header">fn <a href="#tymethod.write_once" class="fn">write_once</a>&lt;'life0, 'life1, 'async_trait&gt;(
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.write_once" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#40">source</a><h4 class="code-header">fn <a href="#tymethod.write_once" class="fn">write_once</a>&lt;'life0, 'async_trait&gt;(
     &amp;'life0 self,
-    body: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+    bs: Bytes
 ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
     Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class="docblock"><p>write_once write all data at once.</p>
+    'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>write_once write all data at once.</p>
 <p>Implementations should make sure that the data is written correctly at once.</p>
 </div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"></div><script src="../../../implementors/opendal/raw/oio/write/one_shot_write/trait.OneShotWrite.js" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.RangeWrite.html b/docs/rust/opendal/raw/oio/trait.RangeWrite.html
new file mode 100644
index 000000000..6fafae9da
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/trait.RangeWrite.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="RangeWrite is used to implement [`Write`] based on range write."><title>RangeWrite in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" typ [...]
+    // Required methods
+    fn <a href="#tymethod.initiate_range" class="fn">initiate_range</a>&lt;'life0, 'async_trait&gt;(
+        &amp;'life0 self
+    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
+       <span class="where">where Self: 'async_trait,
+             'life0: 'async_trait</span>;
+<span class="item-spacer"></span>    fn <a href="#tymethod.write_range" class="fn">write_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+        &amp;'life0 self,
+        location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
+        written: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+        size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+        body: <a class="enum" href="../enum.AsyncBody.html" title="enum opendal::raw::AsyncBody">AsyncBody</a>
+    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
+       <span class="where">where Self: 'async_trait,
+             'life0: 'async_trait,
+             'life1: 'async_trait</span>;
+<span class="item-spacer"></span>    fn <a href="#tymethod.complete_range" class="fn">complete_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+        &amp;'life0 self,
+        location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
+        written: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+        size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+        body: <a class="enum" href="../enum.AsyncBody.html" title="enum opendal::raw::AsyncBody">AsyncBody</a>
+    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
+       <span class="where">where Self: 'async_trait,
+             'life0: 'async_trait,
+             'life1: 'async_trait</span>;
+<span class="item-spacer"></span>    fn <a href="#tymethod.abort_range" class="fn">abort_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+        &amp;'life0 self,
+        location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>
+    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
+       <span class="where">where Self: 'async_trait,
+             'life0: 'async_trait,
+             'life1: 'async_trait</span>;
+}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>RangeWrite is used to implement [<code>Write</code>] based on range write.</p>
+<h2 id="services"><a href="#services">Services</a></h2>
+<p>Services like gcs support range write via <a href="https://cloud.google.com/storage/docs/resumable-uploads">GCS Resumable Upload</a>.</p>
+<p>GCS will support upload content by specifying the range of the file in <code>CONTENT-RANGE</code>.</p>
+<p>Most range based services will have the following limitations:</p>
+<ul>
+<li>The size of chunk per upload must be aligned to a certain size. For example, GCS requires
+to align with 256KiB.</li>
+<li>Some services requires to complete the write at the last chunk with the total size.</li>
+</ul>
+<h2 id="architecture"><a href="#architecture">Architecture</a></h2>
+<p>The architecture after adopting <a href="trait.RangeWrite.html" title="trait opendal::raw::oio::RangeWrite"><code>RangeWrite</code></a>:</p>
+<ul>
+<li>Services impl <code>RangeWrite</code></li>
+<li><code>RangeWriter</code> impl <code>Write</code></li>
+<li>Expose <code>RangeWriter</code> as <code>Accessor::Writer</code></li>
+</ul>
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.initiate_range" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#54">source</a><h4 class="code-header">fn <a href="#tymethod.initiate_range" class="fn">initiate_range</a>&lt;'life0, 'async_trait&gt;(
+    &amp;'life0 self
+) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
+    Self: 'async_trait,
+    'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Initiate range the range write, the returning value is the location.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.write_range" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#57-63">source</a><h4 class="code-header">fn <a href="#tymethod.write_range" class="fn">write_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+    &amp;'life0 self,
+    location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
+    written: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+    size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+    body: <a class="enum" href="../enum.AsyncBody.html" title="enum opendal::raw::AsyncBody">AsyncBody</a>
+) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
+    Self: 'async_trait,
+    'life0: 'async_trait,
+    'life1: 'async_trait,</span></h4></section></summary><div class="docblock"><p>write_range will write a range of data.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.complete_range" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#66-72">source</a><h4 class="code-header">fn <a href="#tymethod.complete_range" class="fn">complete_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+    &amp;'life0 self,
+    location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
+    written: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+    size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>,
+    body: <a class="enum" href="../enum.AsyncBody.html" title="enum opendal::raw::AsyncBody">AsyncBody</a>
+) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
+    Self: 'async_trait,
+    'life0: 'async_trait,
+    'life1: 'async_trait,</span></h4></section></summary><div class="docblock"><p>complete_range will complete the range write by uploading the last chunk.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.abort_range" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/range_write.rs.html#75">source</a><h4 class="code-header">fn <a href="#tymethod.abort_range" class="fn">abort_range</a>&lt;'life0, 'life1, 'async_trait&gt;(
+    &amp;'life0 self,
+    location: &amp;'life1 <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>
+) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
+    Self: 'async_trait,
+    'life0: 'async_trait,
+    'life1: 'async_trait,</span></h4></section></summary><div class="docblock"><p>abort_range will abort the range write by abort all already uploaded data.</p>
+</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"></div><script src="../../../implementors/opendal/raw/oio/write/range_write/trait.RangeWrite.js" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.Read.html b/docs/rust/opendal/raw/oio/trait.Read.html
index 5f948be77..93b6d83b0 100644
--- a/docs/rust/opendal/raw/oio/trait.Read.html
+++ b/docs/rust/opendal/raw/oio/trait.Read.html
@@ -75,6 +75,6 @@ work as expected, we must add this impl.</p>
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u64</a>&gt;&gt;</h4></section><section id="method.poll_next-3" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/api.rs.html#146-148 [...]
     A: <a class="trait" href="../trait.Accessor.html" title="trait opendal::raw::Accessor">Accessor</a>&lt;Reader = R&gt;,
     R: <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a>,</span></h3></section><section id="impl-Read-for-FromFileReader%3CR%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/read/into_read_from_file.rs.html#60-132">source</a><a href="#impl-Read-for-FromFileReader%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.Read.html" title="trait opendal::raw::oio::Read">Read</a> for <a [...]
-    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Read-for-CloneableReaderWithinStd [...]
+    R: AsyncRead + AsyncSeek + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a>,</span></h3></section><section id="impl-Read-for-CloneableReaderWithinStd [...]
     S: Stream&lt;Item = <a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;T&gt;&gt; + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::mark [...]
     T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h3></section></div><script src="../../../implementors/opendal/raw/oio/read/api/trait.Read.js" data-ignore-extern-crates="std,alloc" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.Write.html b/docs/rust/opendal/raw/oio/trait.Write.html
index 90577bce9..657503df4 100644
--- a/docs/rust/opendal/raw/oio/trait.Write.html
+++ b/docs/rust/opendal/raw/oio/trait.Write.html
@@ -1,30 +1,18 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Write is the trait that OpenDAL returns to callers."><title>Write in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cr [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Write is the trait that OpenDAL returns to callers."><title>Write in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cr [...]
     // Required methods
-    fn <a href="#tymethod.write" class="fn">write</a>&lt;'life0, 'life1, 'async_trait&gt;(
-        &amp;'life0 mut self,
-        bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
-       <span class="where">where Self: 'async_trait,
-             'life0: 'async_trait,
-             'life1: 'async_trait</span>;
-<span class="item-spacer"></span>    fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
-        &amp;'life0 mut self
-    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
-       <span class="where">where Self: 'async_trait,
-             'life0: 'async_trait</span>;
-<span class="item-spacer"></span>    fn <a href="#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-        &amp;'life0 mut self
-    ) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type open [...]
-       <span class="where">where Self: 'async_trait,
-             'life0: 'async_trait</span>;
+    fn <a href="#tymethod.poll_write" class="fn">poll_write</a>(
+        &amp;mut self,
+        cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+        bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+    ) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;;
+<span class="item-spacer"></span>    fn <a href="#tymethod.poll_close" class="fn">poll_close</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Res [...]
+<span class="item-spacer"></span>    fn <a href="#tymethod.poll_abort" class="fn">poll_abort</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Res [...]
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Write is the trait that OpenDAL returns to callers.</p>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.write" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#84">source</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>&lt;'life0, 'life1, 'async_trait&gt;(
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Write given bytes into writer.</p>
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.poll_write" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#89">source</a><h4 class="code-header">fn <a href="#tymethod.poll_write" class="fn">poll_write</a>(
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Write given bytes into writer.</p>
 <h5 id="behavior"><a href="#behavior">Behavior</a></h5>
 <ul>
 <li><code>Ok(n)</code> means <code>n</code> bytes has been written successfully.</li>
@@ -32,46 +20,18 @@
 </ul>
 <p>It’s possible that <code>n &lt; bs.len()</code>, caller should pass the remaining bytes
 repeatedly until all bytes has been written.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.abort" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#87">source</a><h4 class="code-header">fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Abort the pending writer.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.close" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#90">source</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></summary><div class="docblock"><p>Close the writer and make sure all data has been flushed.</p>
-</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-Write-for-()" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#94-114">source</a><a href="#impl-Write-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.Write.html" title="trait openda [...]
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section><section id="method.abort" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#101-106">source</a><a href="#method.abort" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section><section id="method.close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#108-113">source</a><a href="#method.close" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Write-for-Box%3CT%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#120-132">source</a><a href="#impl-Write-for-Box%3CT%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a> + ?<a class="trait" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.poll_close" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#92">source</a><h4 class="code-header">fn <a href="#tymethod.poll_close" class="fn">poll_close</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a c [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.poll_abort" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#95">source</a><h4 class="code-header">fn <a href="#tymethod.poll_abort" class="fn">poll_abort</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt; <a c [...]
+</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-Write-for-Box%3CT%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#123-135">source</a><a href="#impl-Write-for-Box%3CT%3E" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Write.ht [...]
 <p>To make Writer work as expected, we must add this impl.</p>
-</div><div class="impl-items"><section id="method.write-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#121-123">source</a><a href="#method.write-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.write" class="fn">write</a>&lt;'life0, 'life1, 'async_trait&gt;(
-    &amp;'life0 mut self,
-    bs: &amp;'life1 dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,
-    'life1: 'async_trait,</span></h4></section><section id="method.abort-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#125-127">source</a><a href="#method.abort-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.abort" class="fn">abort</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section><section id="method.close-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#129-131">source</a><a href="#method.close-1" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.close" class="fn">close</a>&lt;'life0, 'async_trait&gt;(
-    &amp;'life0 mut self
-) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="type" href="../../type.Result.html" title="type opendal: [...]
-    Self: 'async_trait,
-    'life0: 'async_trait,</span></h4></section></div></details><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/compose_write.rs.html#57-78">source</a><a href="#impl-Write-for-TwoWaysWriter%3CONE,+TWO%3E" class="anchor">§</a><h3 class="code-header">impl&lt;ONE: [...]
-    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#118-159">source</a><a href="#impl-Write-for-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Writ [...]
-    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#50-64">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="trait" href="trait.OneShotWrite.html" title [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="method.poll_write" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#124-126">source</a><a href="#method.poll_write" class="anchor">§</a><h4 class="code-header">fn <a href="#tymethod.poll_write" class="fn">poll_write</a>(
+    &amp;mut self,
+    cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    bs: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_close" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#128 [...]
+    &amp;mut self,
+    _: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
+    _: &amp;dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="../../type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section><section id="method.poll_close-1" class="method trait-impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#1 [...]
+    W: <a class="trait" href="trait.AppendObjectWrite.html" title="trait opendal::raw::oio::AppendObjectWrite">AppendObjectWrite</a>,</span></h3></section><section id="impl-Write-for-MultipartUploadWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/multipart_upload_write.rs.html#123-252">source</a><a href="#impl-Write-for-MultipartUploadWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W&gt; <a class="trait" href="trait.Writ [...]
+    W: <a class="trait" href="trait.MultipartUploadWrite.html" title="trait opendal::raw::oio::MultipartUploadWrite">MultipartUploadWrite</a>,</span></h3></section><section id="impl-Write-for-OneShotWriter%3CW%3E" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/one_shot_write.rs.html#68-104">source</a><a href="#impl-Write-for-OneShotWriter%3CW%3E" class="anchor">§</a><h3 class="code-header">impl&lt;W: <a class="trait" href="trait.OneShotWrite.html" titl [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.WriteBuf.html b/docs/rust/opendal/raw/oio/trait.WriteBuf.html
index bf11816e2..20d2e9c00 100644
--- a/docs/rust/opendal/raw/oio/trait.WriteBuf.html
+++ b/docs/rust/opendal/raw/oio/trait.WriteBuf.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="WriteBuf is used in [`oio::Write`] to provide a trait similar to `bytes::Buf`."><title>WriteBuf in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="WriteBuf is used in [`oio::Write`] to provide a trait similar to `bytes::Buf`."><title>WriteBuf in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload"  [...]
     // Required methods
     fn <a href="#tymethod.remaining" class="fn">remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>;
 <span class="item-spacer"></span>    fn <a href="#tymethod.chunk" class="fn">chunk</a>(&amp;self) -&gt; &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[u8]">ⓘ</a>;
@@ -10,29 +10,29 @@
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>WriteBuf is used in [<code>oio::Write</code>] to provide a trait similar to [<code>bytes::Buf</code>].</p>
 <p>The biggest difference is that <code>Buf</code>’s <code>copy_to_slice</code> and <code>copy_to_bytes</code> only needs <code>&amp;self</code>
 instead of <code>&amp;mut self</code>.</p>
-</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.remaining" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#35">source</a><h4 class="code-header">fn <a href="#tymethod.remaining" class="fn">remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rus [...]
+</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.remaining" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#38">source</a><h4 class="code-header">fn <a href="#tymethod.remaining" class="fn">remaining</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rus [...]
 <p>This value is greater than or equal to the length of the slice returned by chunk().</p>
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>Implementations of remaining should ensure that the return value does not change unless a
 call is made to advance or any other function that is documented to change the Buf’s
 current position.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.chunk" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#45">source</a><h4 class="code-header">fn <a href="#tymethod.chunk" class="fn">chunk</a>(&amp;self) -&gt; &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[u8]">ⓘ</a></h4></section></summary><div class="docb [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.chunk" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#48">source</a><h4 class="code-header">fn <a href="#tymethod.chunk" class="fn">chunk</a>(&amp;self) -&gt; &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[u8]">ⓘ</a></h4></section></summary><div class="docb [...]
 Buf::remaining(). Note that this can return shorter slice (this allows non-continuous
 internal representation).</p>
 <h5 id="notes-1"><a href="#notes-1">Notes</a></h5>
 <p>This function should never panic. Once the end of the buffer is reached, i.e.,
 Buf::remaining returns 0, calls to chunk() should return an empty slice.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.advance" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#53">source</a><h4 class="code-header">fn <a href="#tymethod.advance" class="fn">advance</a>(&amp;mut self, cnt: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>)</h4></section></summary><div class="docblock"><p>Advance the internal cursor of the Buf</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.advance" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#56">source</a><h4 class="code-header">fn <a href="#tymethod.advance" class="fn">advance</a>(&amp;mut self, cnt: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>)</h4></section></summary><div class="docblock"><p>Advance the internal cursor of the Buf</p>
 <p>The next call to chunk() will return a slice starting cnt bytes further into the underlying buffer.</p>
 <p>Panics
 This function may panic if cnt &gt; self.remaining().</p>
-</div></details></div><h2 id="provided-methods" class="small-section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.copy_to_slice" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#62-74">source</a><h4 class="code-header">fn <a href="#method.copy_to_slice" class="fn">copy_to_slice</a>(&amp;self, dst: &amp;mut [<a class="primit [...]
+</div></details></div><h2 id="provided-methods" class="small-section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.copy_to_slice" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#65-77">source</a><h4 class="code-header">fn <a href="#method.copy_to_slice" class="fn">copy_to_slice</a>(&amp;self, dst: &amp;mut [<a class="primit [...]
 <p>Returns the number of bytes copied.</p>
 <h5 id="notes-2"><a href="#notes-2">Notes</a></h5>
 <p>Users should not assume the returned bytes is the same as the Buf::remaining().</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.copy_to_bytes" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#84-91">source</a><h4 class="code-header">fn <a href="#method.copy_to_bytes" class="fn">copy_to_bytes</a>(&amp;self, len: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Bytes</h4></section></summary><div class="docblock"><p>Copies current chun [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.copy_to_bytes" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#87-94">source</a><h4 class="code-header">fn <a href="#method.copy_to_bytes" class="fn">copy_to_bytes</a>(&amp;self, len: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Bytes</h4></section></summary><div class="docblock"><p>Copies current chun [...]
 <p>This function may be optimized by the underlying type to avoid actual copies.
 For example, Bytes implementation will do a shallow copy (ref-count increment).</p>
 <h5 id="notes-3"><a href="#notes-3">Notes</a></h5>
 <p>Users should not assume the returned bytes is the same as the Buf::remaining().</p>
-</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-WriteBuf-for-BytesMut" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#199-220">source</a><a href="#impl-WriteBuf-for-BytesMut" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.WriteBuf.html" tit [...]
\ No newline at end of file
+</div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-WriteBuf-for-BytesMut" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/buf.rs.html#202-223">source</a><a href="#impl-WriteBuf-for-BytesMut" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.WriteBuf.html" tit [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/trait.WriteExt.html b/docs/rust/opendal/raw/oio/trait.WriteExt.html
new file mode 100644
index 000000000..9a0f067a4
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/trait.WriteExt.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Extension of [`Read`] to make it easier for use."><title>WriteExt in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" cr [...]
+    // Provided methods
+    fn <a href="#method.write" class="fn">write</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a dyn <a class="trait" href="trait.WriteBuf.html" title="trait opendal::raw::oio::WriteBuf">WriteBuf</a>) -&gt; WriteFuture&lt;'a, Self&gt; { ... }
+<span class="item-spacer"></span>    fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; CloseFuture&lt;'_, Self&gt; { ... }
+<span class="item-spacer"></span>    fn <a href="#method.abort" class="fn">abort</a>(&amp;mut self) -&gt; AbortFuture&lt;'_, Self&gt; { ... }
+}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Extension of [<code>Read</code>] to make it easier for use.</p>
+</div></details><h2 id="provided-methods" class="small-section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.write" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#143-145">source</a><h4 class="code-header">fn <a href="#method.write" class="fn">write</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a dyn <a class="trait" hr [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#148-150">source</a><h4 class="code-header">fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; CloseFuture&lt;'_, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>poll_close</code>.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#153-155">source</a><h4 class="code-header">fn <a href="#method.abort" class="fn">abort</a>(&amp;mut self) -&gt; AbortFuture&lt;'_, Self&gt;</h4></section></summary><div class="docblock"><p>Build a future for <code>poll_abort</code>.</p>
+</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-WriteExt-for-T" class="impl"><a class="srclink rightside" href="../../../src/opendal/raw/oio/write/api.rs.html#138">source</a><a href="#impl-WriteExt-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T: <a class="trait" href="trait.Write.html" title="trait opendal::raw::oio::Write">Write</a>&gt; <a cla [...]
+</div></div><script src="../../../implementors/opendal/raw/oio/write/api/trait.WriteExt.js" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/type.BlockingWriter.html b/docs/rust/opendal/raw/oio/type.BlockingWriter.html
index 4f626c2cd..95be1575c 100644
--- a/docs/rust/opendal/raw/oio/type.BlockingWriter.html
+++ b/docs/rust/opendal/raw/oio/type.BlockingWriter.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWriter is a type erased `BlockingWrite`"><title>BlockingWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWriter is a type erased `BlockingWrite`"><title>BlockingWriter in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/type.Writer.html b/docs/rust/opendal/raw/oio/type.Writer.html
index 14bb0e236..ec2725bc2 100644
--- a/docs/rust/opendal/raw/oio/type.Writer.html
+++ b/docs/rust/opendal/raw/oio/type.Writer.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Writer is a type erased `Write`"><title>Writer in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../ [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Writer is a type erased `Write`"><title>Writer in opendal::raw::oio - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../ [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/api/trait.WriteExt.html b/docs/rust/opendal/raw/oio/write/api/trait.WriteExt.html
new file mode 100644
index 000000000..873be89d5
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/write/api/trait.WriteExt.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/trait.WriteExt.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/trait.WriteExt.html">../../../../../opendal/raw/oio/trait.WriteExt.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/trait.WriteExt.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/range_write/struct.RangeWriter.html b/docs/rust/opendal/raw/oio/write/range_write/struct.RangeWriter.html
new file mode 100644
index 000000000..5b7c621db
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/write/range_write/struct.RangeWriter.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/struct.RangeWriter.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/struct.RangeWriter.html">../../../../../opendal/raw/oio/struct.RangeWriter.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/struct.RangeWriter.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/oio/write/range_write/trait.RangeWrite.html b/docs/rust/opendal/raw/oio/write/range_write/trait.RangeWrite.html
new file mode 100644
index 000000000..4db231db5
--- /dev/null
+++ b/docs/rust/opendal/raw/oio/write/range_write/trait.RangeWrite.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" content="0;URL=../../../../../opendal/raw/oio/trait.RangeWrite.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a href="../../../../../opendal/raw/oio/trait.RangeWrite.html">../../../../../opendal/raw/oio/trait.RangeWrite.html</a>...</p>
+    <script>location.replace("../../../../../opendal/raw/oio/trait.RangeWrite.html" + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/trait.Accessor.html b/docs/rust/opendal/raw/trait.Accessor.html
index b8bb35297..05ffb5710 100644
--- a/docs/rust/opendal/raw/trait.Accessor.html
+++ b/docs/rust/opendal/raw/trait.Accessor.html
@@ -457,4 +457,4 @@ written size if operate successful.</p>
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     args: <a class="struct" href="struct.OpList.html" title="struct opendal::raw::OpList">OpList</a>
-) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></div></details><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2>< [...]
\ No newline at end of file
+) -&gt; <a class="type" href="../type.Result.html" title="type opendal::Result">Result</a>&lt;(<a class="struct" href="struct.RpList.html" title="struct opendal::raw::RpList">RpList</a>, Self::<a class="associatedtype" href="trait.Accessor.html#associatedtype.BlockingPager" title="type opendal::raw::Accessor::BlockingPager">BlockingPager</a>)&gt;</h4></section></div></details><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2>< [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/raw/trait.Layer.html b/docs/rust/opendal/raw/trait.Layer.html
index bd12179bc..20d85f2e0 100644
--- a/docs/rust/opendal/raw/trait.Layer.html
+++ b/docs/rust/opendal/raw/trait.Layer.html
@@ -86,4 +86,4 @@ requires <code>Send</code> and <code>Sync</code>.</p>
 }</code></pre></div>
 </div></details><h2 id="required-associated-types" class="small-section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><details class="toggle" open><summary><section id="associatedtype.LayeredAccessor" class="method"><a class="srclink rightside" href="../../src/opendal/raw/layer.rs.html#119">source</a><h4 class="code-header">type <a href="#associatedtype.LayeredAccessor" class="associatedtype">LayeredAccessor</a>: <a cl [...]
 </div></details></div><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.layer" class="method"><a class="srclink rightside" href="../../src/opendal/raw/layer.rs.html#122">source</a><h4 class="code-header">fn <a href="#tymethod.layer" class="fn">layer</a>(&amp;self, inner: A) -&gt; Self::<a class="associatedtype" href="trai [...]
-</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/async_backtrace.rs.html#48-54">source</a><a href="#impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: [...]
\ No newline at end of file
+</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="impl"><a class="srclink rightside" href="../../src/opendal/layers/async_backtrace.rs.html#48-54">source</a><a href="#impl-Layer%3CA%3E-for-AsyncBacktraceLayer" class="anchor">§</a><h3 class="code-header">impl&lt;A: [...]
\ No newline at end of file
diff --git a/docs/rust/opendal/services/struct.Azblob.html b/docs/rust/opendal/services/struct.Azblob.html
index 93fa9eead..9066223e1 100644
--- a/docs/rust/opendal/services/struct.Azblob.html
+++ b/docs/rust/opendal/services/struct.Azblob.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Azure Storage Blob services support."><title>Azblob in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=". [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Azure Storage Blob services support."><title>Azblob in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=". [...]
 <h3 id="capabilities"><a href="#capabilities">Capabilities</a></h3>
 <p>This service can be used to:</p>
 <ul>
@@ -75,47 +75,47 @@ az storage container create --name test --connection-string &quot;DefaultEndpoin
     </span><span class="kw">let </span>op: Operator = Operator::new(builder)<span class="question-mark">?</span>.finish();
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AzblobBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#94-349">source</a><a href="#impl-AzblobBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Azblob. [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AzblobBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#95-350">source</a><a href="#impl-AzblobBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Azblob. [...]
 <p>All operations will happen under this root.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.container" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#107-111">source</a><h4 class="code-header">pub fn <a href="#method.container" class="fn">container</a>(&amp;mut self, container: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/ [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#119-126">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.container" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#108-112">source</a><h4 class="code-header">pub fn <a href="#method.container" class="fn">container</a>(&amp;mut self, container: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#120-127">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/ [...]
 <p>Endpoint must be full uri, e.g.</p>
 <ul>
 <li>Azblob: <code>https://accountname.blob.core.windows.net</code></li>
 <li>Azurite: <code>http://127.0.0.1:10000/devstoreaccount1</code></li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.account_name" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#132-138">source</a><h4 class="code-header">pub fn <a href="#method.account_name" class="fn">account_name</a>(&amp;mut self, account_name: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.account_name" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#133-139">source</a><h4 class="code-header">pub fn <a href="#method.account_name" class="fn">account_name</a>(&amp;mut self, account_name: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
 <ul>
 <li>If account_name is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.account_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#144-150">source</a><h4 class="code-header">pub fn <a href="#method.account_key" class="fn">account_key</a>(&amp;mut self, account_key: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.account_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#145-151">source</a><h4 class="code-header">pub fn <a href="#method.account_key" class="fn">account_key</a>(&amp;mut self, account_key: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org [...]
 <ul>
 <li>If account_key is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#164-170">source</a><h4 class="code-header">pub fn <a href="#method.encryption_key" class="fn">encryption_key</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#165-171">source</a><h4 class="code-header">pub fn <a href="#method.encryption_key" class="fn">encryption_key</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/ [...]
 <h5 id="args"><a href="#args">Args</a></h5>
 <p><code>v</code>: Base64-encoded key that matches algorithm specified in <code>encryption_algorithm</code>.</p>
 <h5 id="note"><a href="#note">Note</a></h5>
 <p>This function is the low-level setting for SSE related features.</p>
 <p>SSE related options should be set carefully to make them works.
 Please use <code>server_side_encryption_with_*</code> helpers if even possible.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_key_sha256" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#184-190">source</a><h4 class="code-header">pub fn <a href="#method.encryption_key_sha256" class="fn">encryption_key_sha256</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_key_sha256" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#185-191">source</a><h4 class="code-header">pub fn <a href="#method.encryption_key_sha256" class="fn">encryption_key_sha256</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https [...]
 <h5 id="args-1"><a href="#args-1">Args</a></h5>
 <p><code>v</code>: Base64-encoded SHA256 digest of the key specified in encryption_key.</p>
 <h5 id="note-1"><a href="#note-1">Note</a></h5>
 <p>This function is the low-level setting for SSE related features.</p>
 <p>SSE related options should be set carefully to make them works.
 Please use <code>server_side_encryption_with_*</code> helpers if even possible.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_algorithm" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#204-210">source</a><h4 class="code-header">pub fn <a href="#method.encryption_algorithm" class="fn">encryption_algorithm</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https:// [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.encryption_algorithm" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#205-211">source</a><h4 class="code-header">pub fn <a href="#method.encryption_algorithm" class="fn">encryption_algorithm</a>(&amp;mut self, v: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https:// [...]
 <h5 id="args-2"><a href="#args-2">Args</a></h5>
 <p><code>v</code>: server-side encryption algorithm. (Available values: <code>AES256</code>)</p>
 <h5 id="note-2"><a href="#note-2">Note</a></h5>
 <p>This function is the low-level setting for SSE related features.</p>
 <p>SSE related options should be set carefully to make them works.
 Please use <code>server_side_encryption_with_*</code> helpers if even possible.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.server_side_encryption_with_customer_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#225-231">source</a><h4 class="code-header">pub fn <a href="#method.server_side_encryption_with_customer_key" class="fn">server_side_encryption_with_customer_key</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.server_side_encryption_with_customer_key" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#226-232">source</a><h4 class="code-header">pub fn <a href="#method.server_side_encryption_with_customer_key" class="fn">server_side_encryption_with_customer_key</a>(
     &amp;mut self,
     key: &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
 ) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a></h4></section></summary><div class="docblock"><p>Enable server side encryption with customer key.</p>
@@ -126,19 +126,19 @@ Please use <code>server_side_encryption_with_*</code> helpers if even possible.<
 <p>Function that helps the user to set the server-side customer-provided encryption key, the key’s SHA256, and the algorithm.
 See <a href="https://learn.microsoft.com/en-us/azure/storage/blobs/encryption-customer-provided-keys">Server-side encryption with customer-provided keys (CPK)</a>
 for more info.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sas_token" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#240-246">source</a><h4 class="code-header">pub fn <a href="#method.sas_token" class="fn">sas_token</a>(&amp;mut self, sas_token: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sas_token" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#241-247">source</a><h4 class="code-header">pub fn <a href="#method.sas_token" class="fn">sas_token</a>(&amp;mut self, sas_token: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/ [...]
 <ul>
 <li>If sas_token is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
 <p>See <a href="https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview">Grant limited access to Azure Storage resources using shared access signatures (SAS)</a>
 for more info.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#254-257">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https://doc.rust- [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#255-258">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https://doc.rust- [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>This API is part of OpenDAL’s Raw API. <code>HttpClient</code> could be changed
 during minor updates.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.batch_max_operations" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#260-264">source</a><h4 class="code-header">pub fn <a href="#method.batch_max_operations" class="fn">batch_max_operations</a>(&amp;mut self, batch_max_operations: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primiti [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.from_connection_string" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#293-348">source</a><h4 class="code-header">pub fn <a href="#method.from_connection_string" class="fn">from_connection_string</a>(conn: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="../type.Result.html [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.batch_max_operations" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#261-265">source</a><h4 class="code-header">pub fn <a href="#method.batch_max_operations" class="fn">batch_max_operations</a>(&amp;mut self, batch_max_operations: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primiti [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.from_connection_string" class="method"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#294-349">source</a><h4 class="code-header">pub fn <a href="#method.from_connection_string" class="fn">from_connection_string</a>(conn: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="../type.Result.html [...]
 <p>connection string looks like:</p>
 <div class="example-wrap"><pre class="language-txt"><code>DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
 AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
@@ -156,7 +156,7 @@ EndpointSuffix=core.chinacloudapi.cn;
 <h5 id="note-4"><a href="#note-4">Note</a></h5>
 <p>connection string only configures the endpoint, account name and account key.
 User still needs to configure bucket names.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-AzblobBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#351-472">source</a><a href="#impl-Builder-for-AzblobBuilder" class="anchor">§ [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-AzblobBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#352-473">source</a><a href="#impl-Builder-for-AzblobBuilder" class="anchor">§ [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/services/struct.Gcs.html b/docs/rust/opendal/services/struct.Gcs.html
index a8a29cdea..374e34fd4 100644
--- a/docs/rust/opendal/services/struct.Gcs.html
+++ b/docs/rust/opendal/services/struct.Gcs.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Google Cloud Storage services support."><title>Gcs in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=".. [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Google Cloud Storage services support."><title>Gcs in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=".. [...]
 <h3 id="capabilities"><a href="#capabilities">Capabilities</a></h3>
 <p>This service can be used to:</p>
 <ul>
@@ -60,9 +60,9 @@ blocking</li>
     <span class="kw">let </span>op: Operator = Operator::new(builder)<span class="question-mark">?</span>.finish();
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-GcsBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#75-200">source</a><a href="#impl-GcsBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Gcs.html" title= [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.bucket" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#86-89">source</a><h4 class="code-header">pub fn <a href="#method.bucket" class="fn">bucket</a>(&amp;mut self, bucket: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.ref [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.scope" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#102-107">source</a><h4 class="code-header">pub fn <a href="#method.scope" class="fn">scope</a>(&amp;mut self, scope: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.refer [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-GcsBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#76-201">source</a><a href="#impl-GcsBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Gcs.html" title= [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.bucket" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#87-90">source</a><h4 class="code-header">pub fn <a href="#method.bucket" class="fn">bucket</a>(&amp;mut self, bucket: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.ref [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.scope" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#103-108">source</a><h4 class="code-header">pub fn <a href="#method.scope" class="fn">scope</a>(&amp;mut self, scope: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.refer [...]
 <p>If not set, we will use <code>https://www.googleapis.com/auth/devstorage.read_write</code>.</p>
 <h5 id="valid-scope-examples"><a href="#valid-scope-examples">Valid scope examples</a></h5>
 <ul>
@@ -71,21 +71,21 @@ blocking</li>
 <li>full-control: <code>https://www.googleapis.com/auth/devstorage.full_control</code></li>
 </ul>
 <p>Reference: <a href="https://cloud.google.com/storage/docs/authentication">Cloud Storage authentication</a></p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.service_account" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#113-118">source</a><h4 class="code-header">pub fn <a href="#method.service_account" class="fn">service_account</a>(&amp;mut self, service_account: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.service_account" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#114-119">source</a><h4 class="code-header">pub fn <a href="#method.service_account" class="fn">service_account</a>(&amp;mut self, service_account: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc. [...]
 <p>service account will be used for fetch token from vm metadata.
 If not set, we will try to fetch with <code>default</code> service account.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#121-126">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/pri [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.credential" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#129-134">source</a><h4 class="code-header">pub fn <a href="#method.credential" class="fn">credential</a>(&amp;mut self, credential: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0 [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.credential_path" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#137-142">source</a><h4 class="code-header">pub fn <a href="#method.credential_path" class="fn">credential_path</a>(&amp;mut self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.o [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#150-153">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https://doc.rust-lan [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#122-127">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/pri [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.credential" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#130-135">source</a><h4 class="code-header">pub fn <a href="#method.credential" class="fn">credential</a>(&amp;mut self, credential: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0 [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.credential_path" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#138-143">source</a><h4 class="code-header">pub fn <a href="#method.credential_path" class="fn">credential_path</a>(&amp;mut self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#151-154">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https://doc.rust-lan [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>This API is part of OpenDAL’s Raw API. <code>HttpClient</code> could be changed
 during minor updates.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.customed_token_loader" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#156-159">source</a><h4 class="code-header">pub fn <a href="#method.customed_token_loader" class="fn">customed_token_loader</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.customed_token_loader" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#157-160">source</a><h4 class="code-header">pub fn <a href="#method.customed_token_loader" class="fn">customed_token_loader</a>(
     &amp;mut self,
     token_load: <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn GoogleTokenLoad&gt;
 ) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a></h4></section></summary><div class="docblock"><p>Specify the customed token loader used by this service.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.predefined_acl" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#170-175">source</a><h4 class="code-header">pub fn <a href="#method.predefined_acl" class="fn">predefined_acl</a>(&amp;mut self, acl: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1 [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.predefined_acl" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#171-176">source</a><h4 class="code-header">pub fn <a href="#method.predefined_acl" class="fn">predefined_acl</a>(&amp;mut self, acl: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1 [...]
 <p>Available values are:</p>
 <ul>
 <li><code>authenticatedRead</code></li>
@@ -95,7 +95,7 @@ during minor updates.</p>
 <li><code>projectPrivate</code></li>
 <li><code>publicRead</code></li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.default_storage_class" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#184-189">source</a><h4 class="code-header">pub fn <a href="#method.default_storage_class" class="fn">default_storage_class</a>(&amp;mut self, class: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="http [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.default_storage_class" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#185-190">source</a><h4 class="code-header">pub fn <a href="#method.default_storage_class" class="fn">default_storage_class</a>(&amp;mut self, class: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="http [...]
 <p>Available values are:</p>
 <ul>
 <li><code>STANDARD</code></li>
@@ -103,11 +103,11 @@ during minor updates.</p>
 <li><code>COLDLINE</code></li>
 <li><code>ARCHIVE</code></li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write_fixed_size" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#195-199">source</a><h4 class="code-header">pub fn <a href="#method.write_fixed_size" class="fn">write_fixed_size</a>(&amp;mut self, fixed_buffer_size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primitive" href="https:// [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write_fixed_size" class="method"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#196-200">source</a><h4 class="code-header">pub fn <a href="#method.write_fixed_size" class="fn">write_fixed_size</a>(&amp;mut self, fixed_buffer_size: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; <a class="primitive" href="https:// [...]
 Larger chunk sizes typically make uploads faster, but note that there’s a tradeoff between speed and memory usage.
 It’s recommended that you use at least 8 MiB for the chunk size.
 Reference: <a href="https://cloud.google.com/storage/docs/performing-resumable-uploads">Perform resumable uploads</a></p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-GcsBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#220-327">source</a><a href="#impl-Builder-for-GcsBuilder" class="anchor">§</a><h3 c [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-GcsBuilder" class="impl"><a class="srclink rightside" href="../../src/opendal/services/gcs/backend.rs.html#221-328">source</a><a href="#impl-Builder-for-GcsBuilder" class="anchor">§</a><h3 c [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/struct.BlockingWriter.html b/docs/rust/opendal/struct.BlockingWriter.html
index 1f1c9604c..b853bfedd 100644
--- a/docs/rust/opendal/struct.BlockingWriter.html
+++ b/docs/rust/opendal/struct.BlockingWriter.html
@@ -1,8 +1,8 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWriter is designed to write data into given path in an blocking manner."><title>BlockingWriter in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="BlockingWriter is designed to write data into given path in an blocking manner."><title>BlockingWriter in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" [...]
 manner.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#405-434">source</a><a href="#impl-BlockingWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingWriter.htm [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#431-433">source</a><h4 class="code-header">pub fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></section></ [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#436-446">source</a><a href="#impl-Write-for-BlockingWriter" class="anchor">§</a><h3 class="c [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#247-276">source</a><a href="#impl-BlockingWriter" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.BlockingWriter.htm [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#273-275">source</a><h4 class="code-header">pub fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></section></ [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Write-for-BlockingWriter" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#278-288">source</a><a href="#impl-Write-for-BlockingWriter" class="anchor">§</a><h3 class="c [...]
 contents reach their destination. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#tymethod.flush">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.write_vectored" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.36.0">1.36.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1495">source</a></span><a href="#method.write_vecto [...]
 implementation. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#method.is_write_vectored">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.write_all" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1572">source</a></span><a href="#method.write_all" class="anchor"> [...]
 encountered. <a href="https://doc.rust-lang.org/1.72.0/std/io/trait.Write.html#method.write_fmt">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.by_ref" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="srclink" href="https://doc.rust-lang.org/1.72.0/src/std/io/mod.rs.html#1749-1751">source</a></span><a href="#method.by_ref" class="anchor">§</a><h4 cla [...]
diff --git a/docs/rust/opendal/struct.Error.html b/docs/rust/opendal/struct.Error.html
index 2b5913161..3e17cb053 100644
--- a/docs/rust/opendal/struct.Error.html
+++ b/docs/rust/opendal/struct.Error.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Error is the error struct returned by all opendal functions."><title>Error in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorig [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Error is the error struct returned by all opendal functions."><title>Error in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorig [...]
 <h3 id="display"><a href="#display">Display</a></h3>
 <p>Error can be displayed in two ways:</p>
 <ul>
@@ -68,10 +68,10 @@ Backtrace:
 <p>By setting persistent, we indicate the retry should be stopped.</p>
 </div></details><details class="toggle method-toggle" open><summary><section id="method.kind" class="method"><a class="srclink rightside" href="../src/opendal/types/error.rs.html#406-408">source</a><h4 class="code-header">pub fn <a href="#method.kind" class="fn">kind</a>(&amp;self) -&gt; <a class="enum" href="enum.ErrorKind.html" title="enum opendal::ErrorKind">ErrorKind</a></h4></section></summary><div class="docblock"><p>Return error’s kind.</p>
 </div></details><details class="toggle method-toggle" open><summary><section id="method.is_temporary" class="method"><a class="srclink rightside" href="../src/opendal/types/error.rs.html#411-413">source</a><h4 class="code-header">pub fn <a href="#method.is_temporary" class="fn">is_temporary</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if this error is temporary.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-Error" class="impl"><a class="srclink rightside" href="../src/opendal/types/error.rs.html#277-317">source</a><a href="#impl-Debug-for-Error" class="anchor">§</a><h3 class="code-header">impl <a [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-Error" class="impl"><a class="srclink rightside" href="../src/opendal/types/error.rs.html#277-317">source</a><a href="#impl-Debug-for-Error" class="anchor">§</a><h3 class="code-header">impl <a [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
-    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
+    T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
 </div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-FutureExt-for-Error" class="impl"><a href="#impl-FutureExt-for-Error" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; FutureExt for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.with_context-1" class="method trait-impl"><a href="#method.with_context-1" class="anchor">§</a><h4 class="code-header">fn <a  [...]
 wrapper. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.with_current_context" class="method trait-impl"><a href="#method.with_current_context" class="anchor">§</a><h4 class="code-header">fn <a class="fn">with_current_context</a>(self) -&gt; WithContext&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches the current <a href="crate::Context"><code>Context</code></a> to this type, returning a <code>WithContext</code>
 wrapper. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-Error" class="impl"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-Error" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html" title="trait tracing::inst [...]
diff --git a/docs/rust/opendal/struct.Operator.html b/docs/rust/opendal/struct.Operator.html
index 2e8c6d00a..522bf76e8 100644
--- a/docs/rust/opendal/struct.Operator.html
+++ b/docs/rust/opendal/struct.Operator.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Operator is the entry for all public async APIs."><title>Operator in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Operator is the entry for all public async APIs."><title>Operator in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href=" [...]
 <p>Developer should manipulate the data from storage service through Operator only by right.</p>
 <p>We will usually do some general checks and data transformations in this layer,
 like normalizing path from input, checking whether the path refers to one file or one directory, and so on.
@@ -22,25 +22,25 @@ Read <a href="docs/concepts/index.html" title="mod opendal::docs::concepts"><cod
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#74-132">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#76-134">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title [...]
 Limit is usually the maximum size of data that operator will handle in one operation.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#101-105">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Specify the bat [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#103-107">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Specify the bat [...]
 <p>Default: 1000</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#122-124">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underlying accessor.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#124-126">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underlying accessor.</p>
 <h5 id="examples-1"><a href="#examples-1">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 <span class="kw">let </span>info = op.info();</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#129-131">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Create a new b [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#131-133">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Create a new b [...]
 <p>This operation is nearly no cost.</p>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#135-1294">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator async API.</p>
-</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.check" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#151-158">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html"> [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#137-1296">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator async API.</p>
+</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.check" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#153-160">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html"> [...]
 <p>We will send a <code>list</code> request to path and return any errors we met.</p>
 
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 op.check().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#186-188">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&l [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#188-190">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&l [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>For fetch metadata of entries returned by <a href="struct.Lister.html" title="struct opendal::Lister"><code>Lister</code></a>, it’s better to use [<code>list_with</code>] and
 [<code>lister_with</code>] with <code>metakey</code> query like <code>Metakey::ContentLength | Metakey::LastModified</code>
@@ -52,7 +52,7 @@ so that we can avoid extra requests.</p>
         <span class="macro">println!</span>(<span class="string">&quot;file not exist&quot;</span>)
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.stat_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#221-239">source</a><h4 class="code-header">pub fn <a href="#method.stat_with" class="fn">stat_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureStat.html" title=" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.stat_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#223-241">source</a><h4 class="code-header">pub fn <a href="#method.stat_with" class="fn">stat_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureStat.html" title=" [...]
 <h5 id="notes-1"><a href="#notes-1">Notes</a></h5>
 <p>Use <code>stat</code> if you:</p>
 <ul>
@@ -69,7 +69,7 @@ you want has already been cached.</p>
         <span class="macro">println!</span>(<span class="string">&quot;file not exist&quot;</span>)
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#257-266">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#259-268">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
 <h5 id="example"><a href="#example">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -81,7 +81,7 @@ you want has already been cached.</p>
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#293-309">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#295-311">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
 <h5 id="notes-2"><a href="#notes-2">Notes</a></h5>
 <p>To indicate that a path is a directory, it is compulsory to include
 a trailing / in the path. Failure to do so may result in
@@ -93,24 +93,24 @@ a trailing / in the path. Failure to do so may result in
 </ul>
 <h5 id="examples-4"><a href="#examples-4">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.create_dir(<span class="string">&quot;path/to/dir/&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#328-330">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&l [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#330-332">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&l [...]
 <p>This function will allocate a new bytes internally. For more precise memory control or
 reading data lazily, please use <a href="struct.Operator.html#method.reader" title="method opendal::Operator::reader"><code>Operator::reader</code></a></p>
 <h5 id="examples-5"><a href="#examples-5">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>bs = op.read(<span class="string">&quot;path/to/file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#350-402">source</a><h4 class="code-header">pub fn <a href="#method.read_with" class="fn">read_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureRead.html" title=" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#352-404">source</a><h4 class="code-header">pub fn <a href="#method.read_with" class="fn">read_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureRead.html" title=" [...]
 <p>This function will allocate a new bytes internally. For more precise memory control or
 reading data lazily, please use <a href="struct.Operator.html#method.reader" title="method opendal::Operator::reader"><code>Operator::reader</code></a></p>
 <h5 id="examples-6"><a href="#examples-6">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>bs = op.read_with(<span class="string">&quot;path/to/file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;
 <span class="kw">let </span>bs = op.read_with(<span class="string">&quot;path/to/file&quot;</span>).range(<span class="number">0</span>..<span class="number">10</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.reader" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#419-421">source</a><h4 class="code-header">pub async fn <a href="#method.reader" class="fn">reader</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.reader" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#421-423">source</a><h4 class="code-header">pub async fn <a href="#method.reader" class="fn">reader</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
 <h5 id="examples-7"><a href="#examples-7">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>r = op.reader(<span class="string">&quot;path/to/file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.reader_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#438-464">source</a><h4 class="code-header">pub fn <a href="#method.reader_with" class="fn">reader_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureReader.html" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.reader_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#440-466">source</a><h4 class="code-header">pub fn <a href="#method.reader_with" class="fn">reader_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureReader.html" [...]
 <h5 id="examples-8"><a href="#examples-8">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>r = op.reader_with(<span class="string">&quot;path/to/file&quot;</span>).range((<span class="number">0</span>..<span class="number">10</span>)).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#487-490">source</a><h4 class="code-header">pub async fn <a href="#method.write" class="fn">write</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#489-492">source</a><h4 class="code-header">pub async fn <a href="#method.write" class="fn">write</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait. [...]
 <h5 id="notes-3"><a href="#notes-3">Notes</a></h5>
 <ul>
 <li>Write will make sure all bytes has been written, or an error will be returned.</li>
@@ -119,7 +119,7 @@ reading data lazily, please use <a href="struct.Operator.html#method.reader" tit
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>bytes::Bytes;
 
 op.write(<span class="string">&quot;path/to/file&quot;</span>, <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#513-549">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>(&amp;self, from: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, to: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#515-551">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>(&amp;self, from: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, to: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str. [...]
 <h5 id="notes-4"><a href="#notes-4">Notes</a></h5>
 <ul>
 <li><code>from</code> and <code>to</code> must be a file.</li>
@@ -130,7 +130,7 @@ op.write(<span class="string">&quot;path/to/file&quot;</span>, <span class="macr
 <h5 id="examples-10"><a href="#examples-10">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>
 op.copy(<span class="string">&quot;path/to/file&quot;</span>, <span class="string">&quot;path/to/file2&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.rename" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#571-607">source</a><h4 class="code-header">pub async fn <a href="#method.rename" class="fn">rename</a>(&amp;self, from: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, to: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitiv [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.rename" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#573-609">source</a><h4 class="code-header">pub async fn <a href="#method.rename" class="fn">rename</a>(&amp;self, from: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, to: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitiv [...]
 <h5 id="notes-5"><a href="#notes-5">Notes</a></h5>
 <ul>
 <li><code>from</code> and <code>to</code> must be a file.</li>
@@ -140,7 +140,7 @@ op.copy(<span class="string">&quot;path/to/file&quot;</span>, <span class="strin
 <h5 id="examples-11"><a href="#examples-11">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>
 op.rename(<span class="string">&quot;path/to/file&quot;</span>, <span class="string">&quot;path/to/file2&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.writer" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#631-633">source</a><h4 class="code-header">pub async fn <a href="#method.writer" class="fn">writer</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.writer" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#633-635">source</a><h4 class="code-header">pub async fn <a href="#method.writer" class="fn">writer</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
 <p>Refer to <a href="struct.Writer.html" title="struct opendal::Writer"><code>Writer</code></a> for more details.</p>
 <h5 id="examples-12"><a href="#examples-12">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>bytes::Bytes;
@@ -149,7 +149,7 @@ op.rename(<span class="string">&quot;path/to/file&quot;</span>, <span class="str
 w.write(<span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.write(<span class="macro">vec!</span>[<span class="number">1</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.close().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.writer_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#660-686">source</a><h4 class="code-header">pub fn <a href="#method.writer_with" class="fn">writer_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureWriter.html" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.writer_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#662-688">source</a><h4 class="code-header">pub fn <a href="#method.writer_with" class="fn">writer_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureWriter.html" [...]
 <p>Refer to <a href="struct.Writer.html" title="struct opendal::Writer"><code>Writer</code></a> for more details.</p>
 <h5 id="examples-13"><a href="#examples-13">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>bytes::Bytes;
@@ -161,7 +161,7 @@ w.close().<span class="kw">await</span><span class="question-mark">?</span>;</co
 w.write(<span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.write(<span class="macro">vec!</span>[<span class="number">1</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.close().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#711-745">source</a><h4 class="code-header">pub fn <a href="#method.write_with" class="fn">write_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/conve [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#713-747">source</a><h4 class="code-header">pub fn <a href="#method.write_with" class="fn">write_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/conve [...]
 <h5 id="notes-6"><a href="#notes-6">Notes</a></h5>
 <ul>
 <li>Write will make sure all bytes has been written, or an error will be returned.</li>
@@ -174,14 +174,14 @@ w.close().<span class="kw">await</span><span class="question-mark">?</span>;</co
     .write_with(<span class="string">&quot;path/to/file&quot;</span>, bs)
     .content_type(<span class="string">&quot;text/plain&quot;</span>)
     .<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.delete" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#765-767">source</a><h4 class="code-header">pub async fn <a href="#method.delete" class="fn">delete</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.delete" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#767-769">source</a><h4 class="code-header">pub async fn <a href="#method.delete" class="fn">delete</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result [...]
 <h5 id="notes-7"><a href="#notes-7">Notes</a></h5>
 <ul>
 <li>Deleting a file that does not exist won’t return errors.</li>
 </ul>
 <h5 id="examples-15"><a href="#examples-15">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.delete(<span class="string">&quot;test&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.delete_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#788-806">source</a><h4 class="code-header">pub fn <a href="#method.delete_with" class="fn">delete_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureDelete.html" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.delete_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#790-808">source</a><h4 class="code-header">pub fn <a href="#method.delete_with" class="fn">delete_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureDelete.html" [...]
 <h5 id="notes-8"><a href="#notes-8">Notes</a></h5>
 <ul>
 <li>Deleting a file that does not exist won’t return errors.</li>
@@ -189,13 +189,13 @@ w.close().<span class="kw">await</span><span class="question-mark">?</span>;</co
 <h5 id="examples-16"><a href="#examples-16">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>
 op.delete_with(<span class="string">&quot;test&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#828-830">source</a><h4 class="code-header">pub async fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#830-832">source</a><h4 class="code-header">pub async fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust-lang.org/1. [...]
 <p>If underlying services support delete in batch, we will use batch
 delete instead.</p>
 <h5 id="examples-17"><a href="#examples-17">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove(<span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()])
     .<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#858-887">source</a><h4 class="code-header">pub async fn <a href="#method.remove_via" class="fn">remove_via</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#860-889">source</a><h4 class="code-header">pub async fn <a href="#method.remove_via" class="fn">remove_via</a>(
     &amp;self,
     input: impl Stream&lt;Item = <a class="struct" href="https://doc.rust-lang.org/1.72.0/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt; + <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>
 ) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></section></summary><div class="docblock"><p>remove will remove files via the given paths.</p>
@@ -208,13 +208,13 @@ delete instead.</p>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>futures::stream;
 <span class="kw">let </span>stream = stream::iter(<span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()]);
 op.remove_via(stream).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#909-957">source</a><h4 class="code-header">pub async fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#911-959">source</a><h4 class="code-header">pub async fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
 <h5 id="notes-11"><a href="#notes-11">Notes</a></h5>
 <p>If underlying services support delete in batch, we will use batch
 delete instead.</p>
 <h5 id="examples-19"><a href="#examples-19">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove_all(<span class="string">&quot;path/to/dir&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1007-1009">source</a><h4 class="code-header">pub async fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1009-1011">source</a><h4 class="code-header">pub async fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a> [...]
 <h5 id="notes-12"><a href="#notes-12">Notes</a></h5><h6 id="listing-recursively"><a href="#listing-recursively">Listing recursively</a></h6>
 <p>This function only read the children of the given directory. To read
 all entries recursively, use <code>Operator::list_with(&quot;path&quot;).delimiter(&quot;&quot;)</code>
@@ -244,7 +244,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.list_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1090-1117">source</a><h4 class="code-header">pub fn <a href="#method.list_with" class="fn">list_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureList.html" title [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.list_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1092-1119">source</a><h4 class="code-header">pub fn <a href="#method.list_with" class="fn">list_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureList.html" title [...]
 <h5 id="notes-13"><a href="#notes-13">Notes</a></h5><h6 id="for-streaming"><a href="#for-streaming">For streaming</a></h6>
 <p>This function will read all entries in the given directory. It could
 take very long time and consume a lot of memory if the directory
@@ -296,7 +296,7 @@ For fetching more metadata, please specify the <code>metakey</code>.</p>
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.lister" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1164-1166">source</a><h4 class="code-header">pub async fn <a href="#method.lister" class="fn">lister</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Resu [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.lister" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1166-1168">source</a><h4 class="code-header">pub async fn <a href="#method.lister" class="fn">lister</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Resu [...]
 <p>This function will create a new handle to list entries.</p>
 <p>An error will be returned if given path doesn’t end with <code>/</code>.</p>
 <h5 id="notes-14"><a href="#notes-14">Notes</a></h5><h6 id="listing-recursively-1"><a href="#listing-recursively-1">Listing recursively</a></h6>
@@ -323,7 +323,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.lister_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1268-1293">source</a><h4 class="code-header">pub fn <a href="#method.lister_with" class="fn">lister_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureLister.htm [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.lister_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1270-1295">source</a><h4 class="code-header">pub fn <a href="#method.lister_with" class="fn">lister_with</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>) -&gt; <a class="struct" href="operator_futures/struct.FutureLister.htm [...]
 <p>This function will create a new handle to list entries.</p>
 <p>An error will be returned if given path doesn’t end with <code>/</code>.</p>
 <h5 id="examples-23"><a href="#examples-23">Examples</a></h5><h6 id="list-current-dir"><a href="#list-current-dir">List current dir</a></h6>
@@ -389,8 +389,8 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-2" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1297-1475">source</a><a href="#impl-Operator-2" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator presign API.</p>
-</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.presign_stat" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1319-1326">source</a><h4 class="code-header">pub async fn <a href="#method.presign_stat" class="fn">presign_stat</a>(
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-2" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1299-1477">source</a><a href="#impl-Operator-2" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator presign API.</p>
+</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.presign_stat" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1321-1328">source</a><h4 class="code-header">pub async fn <a href="#method.presign_stat" class="fn">presign_stat</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     expire: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
@@ -409,7 +409,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
         .uri(signed_req.uri())
         .body(())<span class="question-mark">?</span>;
 </code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1354-1361">source</a><h4 class="code-header">pub async fn <a href="#method.presign_read" class="fn">presign_read</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1356-1363">source</a><h4 class="code-header">pub async fn <a href="#method.presign_read" class="fn">presign_read</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     expire: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
@@ -430,7 +430,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
 </ul>
 <p>We can download this file via <code>curl</code> or other tools without credentials:</p>
 <div class="example-wrap"><pre class="language-shell"><code>curl &quot;https://s3.amazonaws.com/examplebucket/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=access_key_id/20130721/us-east-1/s3/aws4_request&amp;X-Amz-Date=20130721T201207Z&amp;X-Amz-Expires=86400&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=&lt;signature-value&gt;&quot; -O /tmp/test.txt
-</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1384-1401">source</a><h4 class="code-header">pub fn <a href="#method.presign_read_with" class="fn">presign_read_with</a>(
+</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1386-1403">source</a><h4 class="code-header">pub fn <a href="#method.presign_read_with" class="fn">presign_read_with</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     expire: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
@@ -448,7 +448,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
         .presign_read_with(<span class="string">&quot;test.txt&quot;</span>, Duration::from_secs(<span class="number">3600</span>))
         .override_content_disposition(<span class="string">&quot;attachment; filename=\&quot;othertext.txt\&quot;&quot;</span>)
         .<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1429-1431">source</a><h4 class="code-header">pub async fn <a href="#method.presign_write" class="fn">presign_write</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1431-1433">source</a><h4 class="code-header">pub async fn <a href="#method.presign_write" class="fn">presign_write</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     expire: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
@@ -469,7 +469,7 @@ For fetching more metadata, please use <a href="struct.Operator.html#method.list
 </ul>
 <p>We can upload file as this file via <code>curl</code> or other tools without credential:</p>
 <div class="example-wrap"><pre class="language-shell"><code>curl -X PUT &quot;https://s3.amazonaws.com/examplebucket/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=access_key_id/20130721/us-east-1/s3/aws4_request&amp;X-Amz-Date=20130721T201207Z&amp;X-Amz-Expires=86400&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=&lt;signature-value&gt;&quot; -d &quot;Hello, World!&quot;
-</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1457-1474">source</a><h4 class="code-header">pub fn <a href="#method.presign_write_with" class="fn">presign_write_with</a>(
+</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write_with" class="method"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1459-1476">source</a><h4 class="code-header">pub fn <a href="#method.presign_write_with" class="fn">presign_write_with</a>(
     &amp;self,
     path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.str.html">str</a>,
     expire: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/time/struct.Duration.html" title="struct core::time::Duration">Duration</a>
@@ -599,7 +599,7 @@ inline.</p>
 <span class="kw">let </span>op = op.layer(LoggingLayer::default());
 <span class="comment">// All operations will go through the new_layer
 </span><span class="kw">let _ </span>= op.read(<span class="string">&quot;test_file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operator" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#64">source</a><a href="#impl-Clone-for-Operator" class="anchor">§</a><h3 class="code-he [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Operator" class="impl"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#66">source</a><a href="#impl-Clone-for-Operator" class="anchor">§</a><h3 class="code-he [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#210">source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="http [...]
     T: ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/borrow.rs.html#217">source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a hr [...]
diff --git a/docs/rust/opendal/struct.Writer.html b/docs/rust/opendal/struct.Writer.html
index 0606b1d1b..266b6b847 100644
--- a/docs/rust/opendal/struct.Writer.html
+++ b/docs/rust/opendal/struct.Writer.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Writer is designed to write data into given path in an asynchronous manner."><title>Writer in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/ [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Writer is designed to write data into given path in an asynchronous manner."><title>Writer in opendal - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/ [...]
 manner.</p>
 <h3 id="notes"><a href="#notes">Notes</a></h3>
 <p>Please make sure either <code>close</code> or <code>abort</code> has been called before
@@ -15,8 +15,8 @@ be written in one request.</p>
 <p>Some services also supports <code>unsized</code> writer. They MAY buffer part of the data
 and flush them into storage at needs. And finally, the file will be available
 after <code>close</code> has been called.</p>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#67-236">source</a><a href="#impl-Writer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Writer.html" title="struct opendal: [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#135-160">source</a><h4 class="code-header">pub async fn <a href="#method.sink" class="fn">sink</a>&lt;S, T&gt;(&amp;mut self, sink_from: S) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html" [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#59-194">source</a><a href="#impl-Writer" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Writer.html" title="struct opendal: [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sink" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#116-132">source</a><h4 class="code-header">pub async fn <a href="#method.sink" class="fn">sink</a>&lt;S, T&gt;(&amp;mut self, sink_from: S) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html" [...]
     S: Stream&lt;Item = <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;T&gt;&gt;,
     T: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;Bytes&gt;,</span></h4></section></summary><div class="docblock"><p>Sink into writer.</p>
 <p>sink will read data from given streamer and write them into writer
@@ -45,7 +45,7 @@ directly without extra in-memory buffer.</p>
     w.close().<span class="kw">await</span><span class="question-mark">?</span>;
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#192-201">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>&lt;R&gt;(&amp;mut self, read_from: R) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u6 [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.copy" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#164-173">source</a><h4 class="code-header">pub async fn <a href="#method.copy" class="fn">copy</a>&lt;R&gt;(&amp;mut self, read_from: R) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u64.html">u6 [...]
     R: AsyncRead,</span></h4></section></summary><div class="docblock"><p>Copy into writer.</p>
 <p>copy will read data from given reader and write them into writer
 directly with only one constant in-memory buffer.</p>
@@ -71,38 +71,36 @@ directly with only one constant in-memory buffer.</p>
     w.close().<span class="kw">await</span><span class="question-mark">?</span>;
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#209-218">source</a><h4 class="code-header">pub async fn <a href="#method.abort" class="fn">abort</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.abort" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#181-183">source</a><h4 class="code-header">pub async fn <a href="#method.abort" class="fn">abort</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
 <h6 id="notes-4"><a href="#notes-4">Notes</a></h6>
 <p>Abort should only be called when the writer is not closed or
 aborted, otherwise an unexpected error could be returned.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#226-235">source</a><h4 class="code-header">pub async fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.close" class="method"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#191-193">source</a><h4 class="code-header">pub async fn <a href="#method.close" class="fn">close</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.unit.html">()</a>&gt;</h4></sect [...]
 <h6 id="notes-5"><a href="#notes-5">Notes</a></h6>
 <p>Close should only be called when the writer is not closed or
 aborted, otherwise an unexpected error could be returned.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#327-397">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#219-239">source</a><a href="#impl-AsyncWrite-for-Writer" class="anchor">§</a><h3 class="code-he [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
-their destination. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_shutdown" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#368-396">source</a><a href="#method.poll_shutdown" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_shutdown</a>(self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>& [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
+their destination. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_shutdown" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#234-238">source</a><a href="#method.poll_shutdown" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_shutdown</a>(self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>& [...]
 the I/O connection has completely shut down. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write_vectored" class="method trait-impl"><a href="#method.poll_write_vectored" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write_vectored</a>(
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bufs: &amp;[<a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/struct.IoSlice.html" title="struct std::io::IoSlice">IoSlice</a>&lt;'_&gt;]
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.72.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/error/struct.Error.html" title="struct std::io::error::E [...]
-implementation. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#254-325">source</a><a href="#impl-AsyncWrite-for-Writer-1" class="anchor">§</a><h3 class="code-header">impl AsyncWrite for <a class="struct" href="struct.Writer.html" title="struct opendal::Writer">Writer</a></h3></section></summary><div class [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write-1" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#255-289">source</a><a href="#method.poll_write-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write</a>(
+implementation. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncWrite-for-Writer-1" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#196-217">source</a><a href="#impl-AsyncWrite-for-Writer-1" class="anchor">§</a><h3 class="code-header">impl AsyncWrite for <a class="struct" href="struct.Writer.html" title="struct opendal::Writer">Writer</a></h3></section></summary><div class [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.poll_write-1" class="method trait-impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#197-205">source</a><a href="#method.poll_write-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_write</a>(
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     buf: &amp;[<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.u8.html">u8</a>]
-) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
+) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="type" href="https://doc.rust-lang.org/1.72.0/std/io/error/type.Result.html" title="type std::io::error::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>&gt;&gt;</h4></section></summary><div class='docblock'>Attempt to write bytes from <code>buf</code> into the object. <a [...]
     self: <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/pin/struct.Pin.html" title="struct core::pin::Pin">Pin</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.reference.html">&amp;mut Self</a>&gt;,
     cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.72.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;,
     bufs: &amp;[<a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/struct.IoSlice.html" title="struct std::io::IoSlice">IoSlice</a>&lt;'_&gt;]
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.72.0/core/task/poll/enum.Poll.html" title="enum core::task::poll::Poll">Poll</a>&lt;<a class="enum" href="https://doc.rust-lang.org/1.72.0/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.72.0/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/1.72.0/std/io/error/struct.Error.html" title="struct std::io::error::E [...]
-IO operations. <a>Read more</a></div></details></div></details><section id="impl-Sync-for-Writer" class="impl"><a class="srclink rightside" href="../src/opendal/types/writer.rs.html#65">source</a><a href="#impl-Sync-for-Writer" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Writer.html" title="struct opendal::Writer">Writer</a [...]
-<p>Writer will only be accessed by <code>&amp;mut Self</code></p>
-</div></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-Writer" class="impl"><a href="#impl-RefUnwindSafe-for-Writer" class="anchor">§</a><h3 class="code-header">impl !<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_s [...]
+IO operations. <a>Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-Writer" class="impl"><a href="#impl-RefUnwindSafe-for-Writer" class="anchor">§</a><h3 class="code-header">impl !<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/panic/unwind_safe/tra [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="srclink rightside" href="https://doc.rust-lang.org/1.72.0/src/core/any.rs.html#202">source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a h [...]
     W: AsyncWrite + ?<a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</span></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.flush" class="method trait-impl"><a href="#method.flush" class="anchor">§</a><h4 class="code-header">fn <a class="fn">flush</a>(&amp;mut self) -&gt; Flush&lt;'_, Self&gt;<span class="where fmt-newline">where
     Self: <a class="trait" href="https://doc.rust-lang.org/1.72.0/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a>,</span></h4></section></summary><div class='docblock'>Creates a future which will entirely flush this <code>AsyncWrite</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.close-1" class="method trait-impl"><a href="#method.close-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn" [...]
diff --git a/docs/rust/opendal/trait.Builder.html b/docs/rust/opendal/trait.Builder.html
index 64956c0ff..bd7a55199 100644
--- a/docs/rust/opendal/trait.Builder.html
+++ b/docs/rust/opendal/trait.Builder.html
@@ -22,4 +22,4 @@ We also promise that every public API will provide detailed documentation.</p>
 </div></details></div><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.from_map" class="method"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#45">source</a><h4 class="code-header">fn <a href="#tymethod.from_map" class="fn">from_map</a>(map: <a class="struct" href="https://doc.rust-lang.org/1.72. [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="tymethod.build" class="method"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#48">source</a><h4 class="code-header">fn <a href="#tymethod.build" class="fn">build</a>(&amp;mut self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;Self::<a class="associatedtype" href="trait.Builder.html#associatedtype.Accessor" title="type opendal::Builder::Acce [...]
 </div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-Builder-for-()" class="impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#52-62">source</a><a href="#impl-Builder-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.Builder.html" title="trait opendal::Bu [...]
-</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#53">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Accessor-1" cla [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#53">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Accessor-1" cla [...]
\ No newline at end of file
diff --git a/docs/rust/search-index.js b/docs/rust/search-index.js
index 190953fff..349572dcf 100644
--- a/docs/rust/search-index.js
+++ b/docs/rust/search-index.js
@@ -1,5 +1,5 @@
 var searchIndex = JSON.parse('{\
-"opendal":{"doc":"OpenDAL is the Open Data Access Layer to <strong>freely</strong> access …","t":"QNNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNNDNNGNNSENNNNNNNNNNNNDLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL [...]
+"opendal":{"doc":"OpenDAL is the Open Data Access Layer to <strong>freely</strong> access …","t":"QNNNDDDDINNDNNNNNNNNNNNNNNNDEDENNNNNNNNNNNNNNNNNDNNDENNNNNNNDDDNNNNNDNNGNNSENNNNNNNNNNNNDLMMMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLMLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL [...]
 }');
 if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
 if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/docs/rust/source-files.js b/docs/rust/source-files.js
index d4d0258c8..acc791098 100644
--- a/docs/rust/source-files.js
+++ b/docs/rust/source-files.js
@@ -1,4 +1,4 @@
 var sourcesIndex = JSON.parse('{\
-"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters", [...]
+"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["async_backtrace.rs","await_tree.rs","blocking.rs","chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","madsim.rs","metrics.rs","minitrace.rs","mod.rs","oteltrace.rs","prometheus.rs","retry.rs","throttle.rs","timeout.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters", [...]
 }');
 createSourceSidebar();
diff --git a/docs/rust/src/opendal/layers/blocking.rs.html b/docs/rust/src/opendal/layers/blocking.rs.html
index 34873e176..9b67022c5 100644
--- a/docs/rust/src/opendal/layers/blocking.rs.html
+++ b/docs/rust/src/opendal/layers/blocking.rs.html
@@ -250,6 +250,9 @@
 <a href="#250" id="250">250</a>
 <a href="#251" id="251">251</a>
 <a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -270,6 +273,7 @@
 </span><span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes;
 <span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>futures::future::poll_fn;
 <span class="kw">use </span>tokio::runtime::Handle;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::oio::ReadExt;
@@ -449,11 +453,13 @@
 
 <span class="kw">impl</span>&lt;I: oio::Write + <span class="lifetime">&#39;static</span>&gt; oio::BlockingWrite <span class="kw">for </span>BlockingWrapper&lt;I&gt; {
     <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.write(bs))
+        <span class="self">self</span>.handle
+            .block_on(poll_fn(|cx| <span class="self">self</span>.inner.poll_write(cx, bs)))
     }
 
     <span class="kw">fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.handle.block_on(<span class="self">self</span>.inner.close())
+        <span class="self">self</span>.handle
+            .block_on(poll_fn(|cx| <span class="self">self</span>.inner.poll_close(cx)))
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/complete.rs.html b/docs/rust/src/opendal/layers/complete.rs.html
index 4a3c75d67..28afdeeca 100644
--- a/docs/rust/src/opendal/layers/complete.rs.html
+++ b/docs/rust/src/opendal/layers/complete.rs.html
@@ -968,6 +968,7 @@
 <a href="#968" id="968">968</a>
 <a href="#969" id="969">969</a>
 <a href="#970" id="970">970</a>
+<a href="#971" id="971">971</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -989,6 +990,7 @@
 <span class="kw">use </span>std::fmt::Formatter;
 <span class="kw">use </span>std::io;
 <span class="kw">use </span>std::sync::Arc;
+<span class="kw">use </span>std::task::ready;
 <span class="kw">use </span>std::task::Context;
 <span class="kw">use </span>std::task::Poll;
 
@@ -1681,49 +1683,49 @@
 <span class="kw">where
     </span>W: oio::Write,
 {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="kw">let </span>w = <span class="self">self</span>.inner.as_mut().ok_or_else(|| {
             Error::new(ErrorKind::Unexpected, <span class="string">&quot;writer has been closed or aborted&quot;</span>)
         })<span class="question-mark">?</span>;
-        <span class="kw">let </span>n = w.write(bs).<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span>n = <span class="macro">ready!</span>(w.poll_write(cx, bs))<span class="question-mark">?</span>;
         <span class="self">self</span>.written += n <span class="kw">as </span>u64;
 
         <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
             <span class="kw">if </span><span class="self">self</span>.written &gt; size {
-                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+                <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
                     ErrorKind::ContentTruncated,
                     <span class="kw-2">&amp;</span><span class="macro">format!</span>(
                         <span class="string">&quot;writer got too much data, expect: {size}, actual: {}&quot;</span>,
                         <span class="self">self</span>.written + n <span class="kw">as </span>u64
                     ),
-                ));
+                )));
             }
         }
 
-        <span class="prelude-val">Ok</span>(n)
+        Poll::Ready(<span class="prelude-val">Ok</span>(n))
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">let </span>w = <span class="self">self</span>.inner.as_mut().ok_or_else(|| {
             Error::new(ErrorKind::Unexpected, <span class="string">&quot;writer has been closed or aborted&quot;</span>)
         })<span class="question-mark">?</span>;
 
-        w.abort().<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">ready!</span>(w.poll_abort(cx))<span class="question-mark">?</span>;
         <span class="self">self</span>.inner = <span class="prelude-val">None</span>;
 
-        <span class="prelude-val">Ok</span>(())
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">if let </span><span class="prelude-val">Some</span>(size) = <span class="self">self</span>.size {
             <span class="kw">if </span><span class="self">self</span>.written &lt; size {
-                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+                <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
                     ErrorKind::ContentIncomplete,
                     <span class="kw-2">&amp;</span><span class="macro">format!</span>(
                         <span class="string">&quot;writer got too less data, expect: {size}, actual: {}&quot;</span>,
                         <span class="self">self</span>.written
                     ),
-                ));
+                )));
             }
         }
 
@@ -1731,10 +1733,10 @@
             Error::new(ErrorKind::Unexpected, <span class="string">&quot;writer has been closed or aborted&quot;</span>)
         })<span class="question-mark">?</span>;
 
-        w.close().<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="macro">ready!</span>(w.poll_close(cx))<span class="question-mark">?</span>;
         <span class="self">self</span>.inner = <span class="prelude-val">None</span>;
 
-        <span class="prelude-val">Ok</span>(())
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 }
 
diff --git a/docs/rust/src/opendal/layers/concurrent_limit.rs.html b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
index 71008f520..350cad77b 100644
--- a/docs/rust/src/opendal/layers/concurrent_limit.rs.html
+++ b/docs/rust/src/opendal/layers/concurrent_limit.rs.html
@@ -607,17 +607,17 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>ConcurrentLimitWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.inner.write(bs).<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="self">self</span>.inner.poll_write(cx, bs)
+    }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>ConcurrentLimitWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/error_context.rs.html b/docs/rust/src/opendal/layers/error_context.rs.html
index 263a7ecd4..f502867ef 100644
--- a/docs/rust/src/opendal/layers/error_context.rs.html
+++ b/docs/rust/src/opendal/layers/error_context.rs.html
@@ -871,24 +871,24 @@
 
 <span class="attr">#[async_trait::async_trait]
 </span><span class="kw">impl</span>&lt;T: oio::Write&gt; oio::Write <span class="kw">for </span>ErrorContextWrapper&lt;T&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.inner.write(bs).<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="self">self</span>.inner.poll_write(cx, bs).map_err(|err| {
             err.with_operation(WriteOperation::Write)
                 .with_context(<span class="string">&quot;service&quot;</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
         })
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx).map_err(|err| {
             err.with_operation(WriteOperation::Abort)
                 .with_context(<span class="string">&quot;service&quot;</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
         })
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx).map_err(|err| {
             err.with_operation(WriteOperation::Close)
                 .with_context(<span class="string">&quot;service&quot;</span>, <span class="self">self</span>.scheme)
                 .with_context(<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path)
diff --git a/docs/rust/src/opendal/layers/logging.rs.html b/docs/rust/src/opendal/layers/logging.rs.html
index ef55fe972..451f475eb 100644
--- a/docs/rust/src/opendal/layers/logging.rs.html
+++ b/docs/rust/src/opendal/layers/logging.rs.html
@@ -1545,6 +1545,9 @@
 <a href="#1545" id="1545">1545</a>
 <a href="#1546" id="1546">1546</a>
 <a href="#1547" id="1547">1547</a>
+<a href="#1548" id="1548">1548</a>
+<a href="#1549" id="1549">1549</a>
+<a href="#1550" id="1550">1550</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1564,6 +1567,7 @@
 
 </span><span class="kw">use </span>std::fmt::Debug;
 <span class="kw">use </span>std::io;
+<span class="kw">use </span>std::task::ready;
 <span class="kw">use </span>std::task::Context;
 <span class="kw">use </span>std::task::Poll;
 
@@ -2799,27 +2803,28 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;W: oio::Write&gt; oio::Write <span class="kw">for </span>LoggingWriter&lt;W&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.write(bs).<span class="kw">await </span>{
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_write(cx, bs)) {
             <span class="prelude-val">Ok</span>(n) =&gt; {
                 <span class="self">self</span>.written += n <span class="kw">as </span>u64;
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">&quot;service={} operation={} path={} written={} -&gt; data write {}B&quot;</span>,
+                    <span class="string">&quot;service={} operation={} path={} written={}B -&gt; input data {}B, write {}B&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
                     WriteOperation::Write,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.written,
-                    n
+                    bs.remaining(),
+                    n,
                 );
-                <span class="prelude-val">Ok</span>(n)
+                Poll::Ready(<span class="prelude-val">Ok</span>(n))
             }
             <span class="prelude-val">Err</span>(err) =&gt; {
                 <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
                     <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
                         lvl,
-                        <span class="string">&quot;service={} operation={} path={} written={} -&gt; data write failed: {}&quot;</span>,
+                        <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data write failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
                         WriteOperation::Write,
                         <span class="self">self</span>.path,
@@ -2827,30 +2832,30 @@
                         <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
                     )
                 }
-                <span class="prelude-val">Err</span>(err)
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
             }
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.abort().<span class="kw">await </span>{
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_abort(cx)) {
             <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">&quot;service={} operation={} path={} written={} -&gt; abort writer&quot;</span>,
+                    <span class="string">&quot;service={} operation={} path={} written={}B -&gt; abort writer&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
                     WriteOperation::Abort,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.written,
                 );
-                <span class="prelude-val">Ok</span>(())
+                Poll::Ready(<span class="prelude-val">Ok</span>(()))
             }
             <span class="prelude-val">Err</span>(err) =&gt; {
                 <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
                     <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
                         lvl,
-                        <span class="string">&quot;service={} operation={} path={} written={} -&gt; abort writer failed: {}&quot;</span>,
+                        <span class="string">&quot;service={} operation={} path={} written={}B -&gt; abort writer failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
                         WriteOperation::Abort,
                         <span class="self">self</span>.path,
@@ -2858,30 +2863,30 @@
                         <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
                     )
                 }
-                <span class="prelude-val">Err</span>(err)
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
             }
         }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">match </span><span class="self">self</span>.inner.close().<span class="kw">await </span>{
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_close(cx)) {
             <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
                 <span class="macro">debug!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">&quot;service={} operation={} path={} written={} -&gt; data written finished&quot;</span>,
+                    <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data written finished&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
                     <span class="self">self</span>.op,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.written
                 );
-                <span class="prelude-val">Ok</span>(())
+                Poll::Ready(<span class="prelude-val">Ok</span>(()))
             }
             <span class="prelude-val">Err</span>(err) =&gt; {
                 <span class="kw">if let </span><span class="prelude-val">Some</span>(lvl) = <span class="self">self</span>.ctx.error_level(<span class="kw-2">&amp;</span>err) {
                     <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
                         lvl,
-                        <span class="string">&quot;service={} operation={} path={} written={} -&gt; data close failed: {}&quot;</span>,
+                        <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data close failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
                         WriteOperation::Close,
                         <span class="self">self</span>.path,
@@ -2889,7 +2894,7 @@
                         <span class="self">self</span>.ctx.error_print(<span class="kw-2">&amp;</span>err),
                     )
                 }
-                <span class="prelude-val">Err</span>(err)
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
             }
         }
     }
@@ -2902,11 +2907,12 @@
                 <span class="self">self</span>.written += n <span class="kw">as </span>u64;
                 <span class="macro">trace!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">&quot;service={} operation={} path={} written={} -&gt; data write {}B&quot;</span>,
+                    <span class="string">&quot;service={} operation={} path={} written={}B -&gt; input data {}B, write {}B&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
                     WriteOperation::BlockingWrite,
                     <span class="self">self</span>.path,
                     <span class="self">self</span>.written,
+                    bs.remaining(),
                     n
                 );
                 <span class="prelude-val">Ok</span>(n)
@@ -2916,7 +2922,7 @@
                     <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
                         lvl,
-                        <span class="string">&quot;service={} operation={} path={} written={} -&gt; data write failed: {}&quot;</span>,
+                        <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data write failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
                         WriteOperation::BlockingWrite,
                         <span class="self">self</span>.path,
@@ -2934,7 +2940,7 @@
             <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
                 <span class="macro">debug!</span>(
                     target: LOGGING_TARGET,
-                    <span class="string">&quot;service={} operation={} path={} written={} -&gt; data written finished&quot;</span>,
+                    <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data written finished&quot;</span>,
                     <span class="self">self</span>.ctx.scheme,
                     <span class="self">self</span>.op,
                     <span class="self">self</span>.path,
@@ -2947,7 +2953,7 @@
                     <span class="macro">log!</span>(
                         target: LOGGING_TARGET,
                         lvl,
-                        <span class="string">&quot;service={} operation={} path={} written={} -&gt; data close failed: {}&quot;</span>,
+                        <span class="string">&quot;service={} operation={} path={} written={}B -&gt; data close failed: {}&quot;</span>,
                         <span class="self">self</span>.ctx.scheme,
                         WriteOperation::BlockingClose,
                         <span class="self">self</span>.path,
diff --git a/docs/rust/src/opendal/layers/madsim.rs.html b/docs/rust/src/opendal/layers/madsim.rs.html
index bf7ae3204..8e25a9207 100644
--- a/docs/rust/src/opendal/layers/madsim.rs.html
+++ b/docs/rust/src/opendal/layers/madsim.rs.html
@@ -464,6 +464,8 @@
 <a href="#464" id="464">464</a>
 <a href="#465" id="465">465</a>
 <a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -768,7 +770,11 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>MadsimWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="kw">crate</span>::Result&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(
+        <span class="kw-2">&amp;mut </span><span class="self">self</span>,
+        cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;,
+        bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf,
+    ) -&gt; Poll&lt;<span class="kw">crate</span>::Result&lt;usize&gt;&gt; {
         <span class="attr">#[cfg(madsim)]
         </span>{
             <span class="kw">let </span>req = Request::Write(<span class="self">self</span>.path.to_string(), bs);
@@ -784,15 +790,15 @@
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::Result&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="kw">crate</span>::Result&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
             <span class="string">&quot;will be supported in the future&quot;</span>,
-        ))
+        )))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::Result&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="kw">crate</span>::Result&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 }
 
@@ -808,10 +814,8 @@
     }
 }
 
-<span class="kw">impl </span>From&lt;std::io::Error&gt; <span class="kw">for </span>Error {
-    <span class="kw">fn </span>from(e: std::io::Error) -&gt; <span class="self">Self </span>{
-        Error::new(ErrorKind::Unexpected, <span class="string">&quot;madsim error&quot;</span>)
-    }
+<span class="kw">fn </span>parse_io_error(e: std::io::Error) -&gt; Error {
+    Error::new(ErrorKind::Unexpected, <span class="string">&quot;madsim error&quot;</span>)
 }
 
 <span class="doccomment">/// A simulated server.This an experimental feature, docs are not ready yet.
diff --git a/docs/rust/src/opendal/layers/metrics.rs.html b/docs/rust/src/opendal/layers/metrics.rs.html
index 5806a25a3..fcab9d3ba 100644
--- a/docs/rust/src/opendal/layers/metrics.rs.html
+++ b/docs/rust/src/opendal/layers/metrics.rs.html
@@ -896,7 +896,6 @@
 <a href="#896" id="896">896</a>
 <a href="#897" id="897">897</a>
 <a href="#898" id="898">898</a>
-<a href="#899" id="899">899</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1746,11 +1745,10 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>MetricWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="self">self</span>.inner
-            .write(bs)
-            .<span class="kw">await
-            </span>.map(|n| {
+            .poll_write(cx, bs)
+            .map_ok(|n| {
                 <span class="self">self</span>.bytes += n <span class="kw">as </span>u64;
                 n
             })
@@ -1760,15 +1758,15 @@
             })
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx).map_err(|err| {
             <span class="self">self</span>.handle.increment_errors_total(<span class="self">self</span>.op, err.kind());
             err
         })
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx).map_err(|err| {
             <span class="self">self</span>.handle.increment_errors_total(<span class="self">self</span>.op, err.kind());
             err
         })
diff --git a/docs/rust/src/opendal/layers/minitrace.rs.html b/docs/rust/src/opendal/layers/minitrace.rs.html
index 8e034e239..53d1af67e 100644
--- a/docs/rust/src/opendal/layers/minitrace.rs.html
+++ b/docs/rust/src/opendal/layers/minitrace.rs.html
@@ -390,18 +390,6 @@
 <a href="#390" id="390">390</a>
 <a href="#391" id="391">391</a>
 <a href="#392" id="392">392</a>
-<a href="#393" id="393">393</a>
-<a href="#394" id="394">394</a>
-<a href="#395" id="395">395</a>
-<a href="#396" id="396">396</a>
-<a href="#397" id="397">397</a>
-<a href="#398" id="398">398</a>
-<a href="#399" id="399">399</a>
-<a href="#400" id="400">400</a>
-<a href="#401" id="401">401</a>
-<a href="#402" id="402">402</a>
-<a href="#403" id="403">403</a>
-<a href="#404" id="404">404</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -741,35 +729,23 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>MinitraceWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.inner
-            .write(bs)
-            .in_span(Span::enter_with_parent(
-                WriteOperation::Write.into_static(),
-                <span class="kw-2">&amp;</span><span class="self">self</span>.span,
-            ))
-            .<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
+        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(WriteOperation::Write.into_static());
+        <span class="self">self</span>.inner.poll_write(cx, bs)
+    }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner
-            .abort()
-            .in_span(Span::enter_with_parent(
-                WriteOperation::Abort.into_static(),
-                <span class="kw-2">&amp;</span><span class="self">self</span>.span,
-            ))
-            .<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
+        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(WriteOperation::Abort.into_static());
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner
-            .close()
-            .in_span(Span::enter_with_parent(
-                WriteOperation::Close.into_static(),
-                <span class="kw-2">&amp;</span><span class="self">self</span>.span,
-            ))
-            .<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">let </span>_g = <span class="self">self</span>.span.set_local_parent();
+        <span class="kw">let </span>_span = LocalSpan::enter_with_local_parent(WriteOperation::Close.into_static());
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>MinitraceWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/oteltrace.rs.html b/docs/rust/src/opendal/layers/oteltrace.rs.html
index 05b721d0d..27f324fb6 100644
--- a/docs/rust/src/opendal/layers/oteltrace.rs.html
+++ b/docs/rust/src/opendal/layers/oteltrace.rs.html
@@ -341,13 +341,6 @@
 <a href="#341" id="341">341</a>
 <a href="#342" id="342">342</a>
 <a href="#343" id="343">343</a>
-<a href="#344" id="344">344</a>
-<a href="#345" id="345">345</a>
-<a href="#346" id="346">346</a>
-<a href="#347" id="347">347</a>
-<a href="#348" id="348">348</a>
-<a href="#349" id="349">349</a>
-<a href="#350" id="350">350</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -366,7 +359,8 @@
 // under the License.
 
 </span><span class="kw">use </span>std::io;
-<span class="kw">use </span>std::task;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Bytes;
@@ -377,7 +371,7 @@
 <span class="kw">use </span>opentelemetry::trace::Span;
 <span class="kw">use </span>opentelemetry::trace::TraceContextExt;
 <span class="kw">use </span>opentelemetry::trace::Tracer;
-<span class="kw">use </span>opentelemetry::Context;
+<span class="kw">use </span>opentelemetry::Context <span class="kw">as </span>TraceContext;
 <span class="kw">use </span>opentelemetry::KeyValue;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -439,7 +433,7 @@
         <span class="kw">let </span><span class="kw-2">mut </span>span = tracer.start(<span class="string">&quot;create&quot;</span>);
         span.set_attribute(KeyValue::new(<span class="string">&quot;path&quot;</span>, path.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner.create_dir(path, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -471,7 +465,7 @@
         span.set_attribute(KeyValue::new(<span class="string">&quot;from&quot;</span>, from.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;to&quot;</span>, to.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().copy(from, to, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -481,7 +475,7 @@
         span.set_attribute(KeyValue::new(<span class="string">&quot;from&quot;</span>, from.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;to&quot;</span>, to.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().rename(from, to, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -490,7 +484,7 @@
         <span class="kw">let </span><span class="kw-2">mut </span>span = tracer.start(<span class="string">&quot;stat&quot;</span>);
         span.set_attribute(KeyValue::new(<span class="string">&quot;path&quot;</span>, path.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().stat(path, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -499,7 +493,7 @@
         <span class="kw">let </span><span class="kw-2">mut </span>span = tracer.start(<span class="string">&quot;delete&quot;</span>);
         span.set_attribute(KeyValue::new(<span class="string">&quot;path&quot;</span>, path.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().delete(path, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -518,7 +512,7 @@
         <span class="kw">let </span>tracer = global::tracer(<span class="string">&quot;opendal&quot;</span>);
         <span class="kw">let </span><span class="kw-2">mut </span>span = tracer.start(<span class="string">&quot;batch&quot;</span>);
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().batch(args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -527,7 +521,7 @@
         <span class="kw">let </span><span class="kw-2">mut </span>span = tracer.start(<span class="string">&quot;presign&quot;</span>);
         span.set_attribute(KeyValue::new(<span class="string">&quot;path&quot;</span>, path.to_string()));
         span.set_attribute(KeyValue::new(<span class="string">&quot;args&quot;</span>, <span class="macro">format!</span>(<span class="string">&quot;{:?}&quot;</span>, args)));
-        <span class="kw">let </span>cx = Context::current_with_span(span);
+        <span class="kw">let </span>cx = TraceContext::current_with_span(span);
         <span class="self">self</span>.inner().presign(path, args).with_context(cx).<span class="kw">await
     </span>}
 
@@ -626,23 +620,15 @@
 }
 
 <span class="kw">impl</span>&lt;R: oio::Read&gt; oio::Read <span class="kw">for </span>OtelTraceWrapper&lt;R&gt; {
-    <span class="kw">fn </span>poll_read(
-        <span class="kw-2">&amp;mut </span><span class="self">self</span>,
-        cx: <span class="kw-2">&amp;mut </span>task::Context&lt;<span class="lifetime">&#39;_</span>&gt;,
-        buf: <span class="kw-2">&amp;mut </span>[u8],
-    ) -&gt; task::Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+    <span class="kw">fn </span>poll_read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="self">self</span>.inner.poll_read(cx, buf)
     }
 
-    <span class="kw">fn </span>poll_seek(
-        <span class="kw-2">&amp;mut </span><span class="self">self</span>,
-        cx: <span class="kw-2">&amp;mut </span>task::Context&lt;<span class="lifetime">&#39;_</span>&gt;,
-        pos: io::SeekFrom,
-    ) -&gt; task::Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
+    <span class="kw">fn </span>poll_seek(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, pos: io::SeekFrom) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;u64&gt;&gt; {
         <span class="self">self</span>.inner.poll_seek(cx, pos)
     }
 
-    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>task::Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; task::Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
+    <span class="kw">fn </span>poll_next(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Option</span>&lt;<span class="prelude-ty">Result</span>&lt;Bytes&gt;&gt;&gt; {
         <span class="self">self</span>.inner.poll_next(cx)
     }
 }
@@ -663,17 +649,17 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>OtelTraceWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.inner.write(bs).<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="self">self</span>.inner.poll_write(cx, bs)
+    }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>OtelTraceWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/prometheus.rs.html b/docs/rust/src/opendal/layers/prometheus.rs.html
index bc2848f14..36ab70b22 100644
--- a/docs/rust/src/opendal/layers/prometheus.rs.html
+++ b/docs/rust/src/opendal/layers/prometheus.rs.html
@@ -717,7 +717,6 @@
 <a href="#717" id="717">717</a>
 <a href="#718" id="718">718</a>
 <a href="#719" id="719">719</a>
-<a href="#720" id="720">720</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1382,11 +1381,10 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>PrometheusMetricWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="self">self</span>.inner
-            .write(bs)
-            .<span class="kw">await
-            </span>.map(|n| {
+            .poll_write(cx, bs)
+            .map_ok(|n| {
                 <span class="self">self</span>.stats
                     .bytes_total
                     .with_label_values(<span class="kw-2">&amp;</span>[<span class="kw-2">&amp;</span><span class="self">self</span>.scheme, Operation::Write.into_static()])
@@ -1399,15 +1397,15 @@
             })
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx).map_err(|err| {
             <span class="self">self</span>.stats.increment_errors_total(<span class="self">self</span>.op, err.kind());
             err
         })
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await</span>.map_err(|err| {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx).map_err(|err| {
             <span class="self">self</span>.stats.increment_errors_total(<span class="self">self</span>.op, err.kind());
             err
         })
diff --git a/docs/rust/src/opendal/layers/retry.rs.html b/docs/rust/src/opendal/layers/retry.rs.html
index bcd3d6aa5..c696a8709 100644
--- a/docs/rust/src/opendal/layers/retry.rs.html
+++ b/docs/rust/src/opendal/layers/retry.rs.html
@@ -1341,6 +1341,66 @@
 <a href="#1341" id="1341">1341</a>
 <a href="#1342" id="1342">1342</a>
 <a href="#1343" id="1343">1343</a>
+<a href="#1344" id="1344">1344</a>
+<a href="#1345" id="1345">1345</a>
+<a href="#1346" id="1346">1346</a>
+<a href="#1347" id="1347">1347</a>
+<a href="#1348" id="1348">1348</a>
+<a href="#1349" id="1349">1349</a>
+<a href="#1350" id="1350">1350</a>
+<a href="#1351" id="1351">1351</a>
+<a href="#1352" id="1352">1352</a>
+<a href="#1353" id="1353">1353</a>
+<a href="#1354" id="1354">1354</a>
+<a href="#1355" id="1355">1355</a>
+<a href="#1356" id="1356">1356</a>
+<a href="#1357" id="1357">1357</a>
+<a href="#1358" id="1358">1358</a>
+<a href="#1359" id="1359">1359</a>
+<a href="#1360" id="1360">1360</a>
+<a href="#1361" id="1361">1361</a>
+<a href="#1362" id="1362">1362</a>
+<a href="#1363" id="1363">1363</a>
+<a href="#1364" id="1364">1364</a>
+<a href="#1365" id="1365">1365</a>
+<a href="#1366" id="1366">1366</a>
+<a href="#1367" id="1367">1367</a>
+<a href="#1368" id="1368">1368</a>
+<a href="#1369" id="1369">1369</a>
+<a href="#1370" id="1370">1370</a>
+<a href="#1371" id="1371">1371</a>
+<a href="#1372" id="1372">1372</a>
+<a href="#1373" id="1373">1373</a>
+<a href="#1374" id="1374">1374</a>
+<a href="#1375" id="1375">1375</a>
+<a href="#1376" id="1376">1376</a>
+<a href="#1377" id="1377">1377</a>
+<a href="#1378" id="1378">1378</a>
+<a href="#1379" id="1379">1379</a>
+<a href="#1380" id="1380">1380</a>
+<a href="#1381" id="1381">1381</a>
+<a href="#1382" id="1382">1382</a>
+<a href="#1383" id="1383">1383</a>
+<a href="#1384" id="1384">1384</a>
+<a href="#1385" id="1385">1385</a>
+<a href="#1386" id="1386">1386</a>
+<a href="#1387" id="1387">1387</a>
+<a href="#1388" id="1388">1388</a>
+<a href="#1389" id="1389">1389</a>
+<a href="#1390" id="1390">1390</a>
+<a href="#1391" id="1391">1391</a>
+<a href="#1392" id="1392">1392</a>
+<a href="#1393" id="1393">1393</a>
+<a href="#1394" id="1394">1394</a>
+<a href="#1395" id="1395">1395</a>
+<a href="#1396" id="1396">1396</a>
+<a href="#1397" id="1397">1397</a>
+<a href="#1398" id="1398">1398</a>
+<a href="#1399" id="1399">1399</a>
+<a href="#1400" id="1400">1400</a>
+<a href="#1401" id="1401">1401</a>
+<a href="#1402" id="1402">1402</a>
+<a href="#1403" id="1403">1403</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -2215,80 +2275,140 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write, I: RetryInterceptor&gt; oio::Write <span class="kw">for </span>RetryWrapper&lt;R, I&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
+            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
+            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
+        }
 
-        <span class="kw">loop </span>{
-            <span class="kw">match </span><span class="self">self</span>.inner.write(bs).<span class="kw">await </span>{
-                <span class="prelude-val">Ok</span>(v) =&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(v),
-                <span class="prelude-val">Err</span>(e) <span class="kw">if </span>!e.is_temporary() =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
-                <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_write(cx, bs)) {
+            <span class="prelude-val">Ok</span>(v) =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Ok</span>(v))
+            }
+            <span class="prelude-val">Err</span>(err) <span class="kw">if </span>!err.is_temporary() =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
+            }
+            <span class="prelude-val">Err</span>(err) =&gt; {
+                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
+                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
+                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
+                    }
+                };
+
+                <span class="kw">match </span>backoff.next() {
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                        Poll::Ready(<span class="prelude-val">Err</span>(err))
+                    }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
                         <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>e,
+                            <span class="kw-2">&amp;</span>err,
                             dur,
                             <span class="kw-2">&amp;</span>[
                                 (<span class="string">&quot;operation&quot;</span>, WriteOperation::Write.into_static()),
                                 (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
                             ],
                         );
-                        tokio::time::sleep(dur).<span class="kw">await</span>;
-                        <span class="kw">continue</span>;
+                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
+                        <span class="self">self</span>.poll_write(cx, bs)
                     }
-                },
+                }
             }
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
+            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
+            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
+        }
 
-        <span class="kw">loop </span>{
-            <span class="kw">match </span><span class="self">self</span>.inner.abort().<span class="kw">await </span>{
-                <span class="prelude-val">Ok</span>(v) =&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(v),
-                <span class="prelude-val">Err</span>(e) <span class="kw">if </span>!e.is_temporary() =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
-                <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_abort(cx)) {
+            <span class="prelude-val">Ok</span>(v) =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Ok</span>(v))
+            }
+            <span class="prelude-val">Err</span>(err) <span class="kw">if </span>!err.is_temporary() =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
+            }
+            <span class="prelude-val">Err</span>(err) =&gt; {
+                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
+                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
+                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
+                    }
+                };
+
+                <span class="kw">match </span>backoff.next() {
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                        Poll::Ready(<span class="prelude-val">Err</span>(err))
+                    }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
                         <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>e,
+                            <span class="kw-2">&amp;</span>err,
                             dur,
                             <span class="kw-2">&amp;</span>[
                                 (<span class="string">&quot;operation&quot;</span>, WriteOperation::Abort.into_static()),
                                 (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
                             ],
                         );
-                        tokio::time::sleep(dur).<span class="kw">await</span>;
-                        <span class="kw">continue</span>;
+                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
+                        <span class="self">self</span>.poll_abort(cx)
                     }
-                },
+                }
             }
         }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span><span class="kw-2">mut </span>backoff = <span class="self">self</span>.builder.build();
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">if let </span><span class="prelude-val">Some</span>(sleep) = <span class="self">self</span>.sleep.as_mut() {
+            <span class="macro">ready!</span>(sleep.poll_unpin(cx));
+            <span class="self">self</span>.sleep = <span class="prelude-val">None</span>;
+        }
 
-        <span class="kw">loop </span>{
-            <span class="kw">match </span><span class="self">self</span>.inner.close().<span class="kw">await </span>{
-                <span class="prelude-val">Ok</span>(v) =&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(v),
-                <span class="prelude-val">Err</span>(e) <span class="kw">if </span>!e.is_temporary() =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
-                <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">match </span>backoff.next() {
-                    <span class="prelude-val">None </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
+        <span class="kw">match </span><span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_close(cx)) {
+            <span class="prelude-val">Ok</span>(v) =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Ok</span>(v))
+            }
+            <span class="prelude-val">Err</span>(err) <span class="kw">if </span>!err.is_temporary() =&gt; {
+                <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                Poll::Ready(<span class="prelude-val">Err</span>(err))
+            }
+            <span class="prelude-val">Err</span>(err) =&gt; {
+                <span class="kw">let </span>backoff = <span class="kw">match </span><span class="self">self</span>.current_backoff.as_mut() {
+                    <span class="prelude-val">Some</span>(backoff) =&gt; backoff,
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">Some</span>(<span class="self">self</span>.builder.build());
+                        <span class="self">self</span>.current_backoff.as_mut().unwrap()
+                    }
+                };
+
+                <span class="kw">match </span>backoff.next() {
+                    <span class="prelude-val">None </span>=&gt; {
+                        <span class="self">self</span>.current_backoff = <span class="prelude-val">None</span>;
+                        Poll::Ready(<span class="prelude-val">Err</span>(err))
+                    }
                     <span class="prelude-val">Some</span>(dur) =&gt; {
                         <span class="self">self</span>.notify.intercept(
-                            <span class="kw-2">&amp;</span>e,
+                            <span class="kw-2">&amp;</span>err,
                             dur,
                             <span class="kw-2">&amp;</span>[
-                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Close.into_static()),
+                                (<span class="string">&quot;operation&quot;</span>, WriteOperation::Abort.into_static()),
                                 (<span class="string">&quot;path&quot;</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.path),
                             ],
                         );
-                        tokio::time::sleep(dur).<span class="kw">await</span>;
-                        <span class="kw">continue</span>;
+                        <span class="self">self</span>.sleep = <span class="prelude-val">Some</span>(Box::pin(tokio::time::sleep(dur)));
+                        <span class="self">self</span>.poll_close(cx)
                     }
-                },
+                }
             }
         }
     }
diff --git a/docs/rust/src/opendal/layers/throttle.rs.html b/docs/rust/src/opendal/layers/throttle.rs.html
index 3ee554242..b1cf608f4 100644
--- a/docs/rust/src/opendal/layers/throttle.rs.html
+++ b/docs/rust/src/opendal/layers/throttle.rs.html
@@ -279,6 +279,8 @@
 <a href="#279" id="279">279</a>
 <a href="#280" id="280">280</a>
 <a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -497,38 +499,40 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>ThrottleWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="kw">let </span>buf_length = NonZeroU32::new(bs.remaining() <span class="kw">as </span>u32).unwrap();
 
         <span class="kw">loop </span>{
             <span class="kw">match </span><span class="self">self</span>.limiter.check_n(buf_length) {
-                <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="kw">return </span><span class="self">self</span>.inner.write(bs).<span class="kw">await</span>,
+                <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="kw">return </span><span class="self">self</span>.inner.poll_write(cx, bs),
                 <span class="prelude-val">Err</span>(negative) =&gt; <span class="kw">match </span>negative {
                     <span class="comment">// the query is valid but the Decider can not accommodate them.
                     </span>NegativeMultiDecision::BatchNonConforming(<span class="kw">_</span>, not_until) =&gt; {
-                        <span class="kw">let </span>wait_time = not_until.wait_time_from(DefaultClock::default().now());
+                        <span class="kw">let _ </span>= not_until.wait_time_from(DefaultClock::default().now());
                         <span class="comment">// TODO: Should lock the limiter and wait for the wait_time, or should let other small requests go first?
-                        </span>tokio::time::sleep(wait_time).<span class="kw">await</span>;
-                    }
+
+                        // FIXME: we should sleep here.
+                        // tokio::time::sleep(wait_time).await;
+                    </span>}
                     <span class="comment">// the query was invalid as the rate limit parameters can &quot;never&quot; accommodate the number of cells queried for.
                     </span>NegativeMultiDecision::InsufficientCapacity(<span class="kw">_</span>) =&gt; {
-                        <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
                             ErrorKind::RateLimited,
                             <span class="string">&quot;InsufficientCapacity due to burst size being smaller than the request size&quot;</span>,
-                        ))
+                        )))
                     }
                 },
             }
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>ThrottleWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/layers/timeout.rs.html b/docs/rust/src/opendal/layers/timeout.rs.html
index 8f36f7a4f..1404cdc3c 100644
--- a/docs/rust/src/opendal/layers/timeout.rs.html
+++ b/docs/rust/src/opendal/layers/timeout.rs.html
@@ -371,6 +371,63 @@
 <a href="#371" id="371">371</a>
 <a href="#372" id="372">372</a>
 <a href="#373" id="373">373</a>
+<a href="#374" id="374">374</a>
+<a href="#375" id="375">375</a>
+<a href="#376" id="376">376</a>
+<a href="#377" id="377">377</a>
+<a href="#378" id="378">378</a>
+<a href="#379" id="379">379</a>
+<a href="#380" id="380">380</a>
+<a href="#381" id="381">381</a>
+<a href="#382" id="382">382</a>
+<a href="#383" id="383">383</a>
+<a href="#384" id="384">384</a>
+<a href="#385" id="385">385</a>
+<a href="#386" id="386">386</a>
+<a href="#387" id="387">387</a>
+<a href="#388" id="388">388</a>
+<a href="#389" id="389">389</a>
+<a href="#390" id="390">390</a>
+<a href="#391" id="391">391</a>
+<a href="#392" id="392">392</a>
+<a href="#393" id="393">393</a>
+<a href="#394" id="394">394</a>
+<a href="#395" id="395">395</a>
+<a href="#396" id="396">396</a>
+<a href="#397" id="397">397</a>
+<a href="#398" id="398">398</a>
+<a href="#399" id="399">399</a>
+<a href="#400" id="400">400</a>
+<a href="#401" id="401">401</a>
+<a href="#402" id="402">402</a>
+<a href="#403" id="403">403</a>
+<a href="#404" id="404">404</a>
+<a href="#405" id="405">405</a>
+<a href="#406" id="406">406</a>
+<a href="#407" id="407">407</a>
+<a href="#408" id="408">408</a>
+<a href="#409" id="409">409</a>
+<a href="#410" id="410">410</a>
+<a href="#411" id="411">411</a>
+<a href="#412" id="412">412</a>
+<a href="#413" id="413">413</a>
+<a href="#414" id="414">414</a>
+<a href="#415" id="415">415</a>
+<a href="#416" id="416">416</a>
+<a href="#417" id="417">417</a>
+<a href="#418" id="418">418</a>
+<a href="#419" id="419">419</a>
+<a href="#420" id="420">420</a>
+<a href="#421" id="421">421</a>
+<a href="#422" id="422">422</a>
+<a href="#423" id="423">423</a>
+<a href="#424" id="424">424</a>
+<a href="#425" id="425">425</a>
+<a href="#426" id="426">426</a>
+<a href="#427" id="427">427</a>
+<a href="#428" id="428">428</a>
+<a href="#429" id="429">429</a>
+<a href="#430" id="430">430</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -579,7 +636,8 @@
     inner: R,
 
     timeout: Duration,
-    speed: u64,
+    <span class="attr">#[allow(dead_code)]
+    </span>speed: u64,
 
     start: <span class="prelude-ty">Option</span>&lt;Instant&gt;,
 }
@@ -594,7 +652,8 @@
         }
     }
 
-    <span class="kw">fn </span>io_timeout(<span class="kw-2">&amp;</span><span class="self">self</span>, size: u64) -&gt; Duration {
+    <span class="attr">#[allow(dead_code)]
+    </span><span class="kw">fn </span>io_timeout(<span class="kw-2">&amp;</span><span class="self">self</span>, size: u64) -&gt; Duration {
         <span class="kw">let </span>timeout = Duration::from_millis(size * <span class="number">1000 </span>/ <span class="self">self</span>.speed + <span class="number">1</span>);
 
         timeout.max(<span class="self">self</span>.timeout)
@@ -695,40 +754,95 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;R: oio::Write&gt; oio::Write <span class="kw">for </span>TimeoutWrapper&lt;R&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>timeout = <span class="self">self</span>.io_timeout(bs.remaining() <span class="kw">as </span>u64);
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">match </span><span class="self">self</span>.start {
+            <span class="prelude-val">Some</span>(start) =&gt; {
+                <span class="kw">if </span>start.elapsed() &gt; <span class="self">self</span>.timeout {
+                    <span class="comment">// Clean up the start time before return ready.
+                    </span><span class="self">self</span>.start = <span class="prelude-val">None</span>;
 
-        tokio::time::timeout(timeout, <span class="self">self</span>.inner.write(bs))
-            .<span class="kw">await
-            </span>.map_err(|<span class="kw">_</span>| {
-                Error::new(ErrorKind::Unexpected, <span class="string">&quot;operation timeout&quot;</span>)
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;operation timeout&quot;</span>,
+                    )
                     .with_operation(WriteOperation::Write)
-                    .with_context(<span class="string">&quot;timeout&quot;</span>, timeout.as_secs_f64().to_string())
-                    .set_temporary()
-            })<span class="question-mark">?
-    </span>}
+                    .with_context(<span class="string">&quot;timeout&quot;</span>, <span class="self">self</span>.timeout.as_secs_f64().to_string())
+                    .set_temporary()));
+                }
+            }
+            <span class="prelude-val">None </span>=&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">Some</span>(Instant::now());
+            }
+        }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        tokio::time::timeout(<span class="self">self</span>.timeout, <span class="self">self</span>.inner.abort())
-            .<span class="kw">await
-            </span>.map_err(|<span class="kw">_</span>| {
-                Error::new(ErrorKind::Unexpected, <span class="string">&quot;operation timeout&quot;</span>)
+        <span class="kw">match </span><span class="self">self</span>.inner.poll_write(cx, bs) {
+            Poll::Pending =&gt; Poll::Pending,
+            Poll::Ready(v) =&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">None</span>;
+                Poll::Ready(v)
+            }
+        }
+    }
+
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">match </span><span class="self">self</span>.start {
+            <span class="prelude-val">Some</span>(start) =&gt; {
+                <span class="kw">if </span>start.elapsed() &gt; <span class="self">self</span>.timeout {
+                    <span class="comment">// Clean up the start time before return ready.
+                    </span><span class="self">self</span>.start = <span class="prelude-val">None</span>;
+
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;operation timeout&quot;</span>,
+                    )
                     .with_operation(WriteOperation::Abort)
                     .with_context(<span class="string">&quot;timeout&quot;</span>, <span class="self">self</span>.timeout.as_secs_f64().to_string())
-                    .set_temporary()
-            })<span class="question-mark">?
-    </span>}
+                    .set_temporary()));
+                }
+            }
+            <span class="prelude-val">None </span>=&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">Some</span>(Instant::now());
+            }
+        }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        tokio::time::timeout(<span class="self">self</span>.timeout, <span class="self">self</span>.inner.close())
-            .<span class="kw">await
-            </span>.map_err(|<span class="kw">_</span>| {
-                Error::new(ErrorKind::Unexpected, <span class="string">&quot;operation timeout&quot;</span>)
+        <span class="kw">match </span><span class="self">self</span>.inner.poll_abort(cx) {
+            Poll::Pending =&gt; Poll::Pending,
+            Poll::Ready(v) =&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">None</span>;
+                Poll::Ready(v)
+            }
+        }
+    }
+
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">match </span><span class="self">self</span>.start {
+            <span class="prelude-val">Some</span>(start) =&gt; {
+                <span class="kw">if </span>start.elapsed() &gt; <span class="self">self</span>.timeout {
+                    <span class="comment">// Clean up the start time before return ready.
+                    </span><span class="self">self</span>.start = <span class="prelude-val">None</span>;
+
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;operation timeout&quot;</span>,
+                    )
                     .with_operation(WriteOperation::Close)
                     .with_context(<span class="string">&quot;timeout&quot;</span>, <span class="self">self</span>.timeout.as_secs_f64().to_string())
-                    .set_temporary()
-            })<span class="question-mark">?
-    </span>}
+                    .set_temporary()));
+                }
+            }
+            <span class="prelude-val">None </span>=&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">Some</span>(Instant::now());
+            }
+        }
+
+        <span class="kw">match </span><span class="self">self</span>.inner.poll_close(cx) {
+            Poll::Pending =&gt; Poll::Pending,
+            Poll::Ready(v) =&gt; {
+                <span class="self">self</span>.start = <span class="prelude-val">None</span>;
+                Poll::Ready(v)
+            }
+        }
+    }
 }
 
 <span class="attr">#[async_trait]
diff --git a/docs/rust/src/opendal/layers/tracing.rs.html b/docs/rust/src/opendal/layers/tracing.rs.html
index 6db7d01c2..bb7aae78e 100644
--- a/docs/rust/src/opendal/layers/tracing.rs.html
+++ b/docs/rust/src/opendal/layers/tracing.rs.html
@@ -703,25 +703,25 @@
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">&quot;trace&quot;</span>,
         skip_all)]
-    </span><span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.inner.write(bs).<span class="kw">await
-    </span>}
+    </span><span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="self">self</span>.inner.poll_write(cx, bs)
+    }
 
     <span class="attr">#[tracing::instrument(
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">&quot;trace&quot;</span>,
         skip_all)]
-    </span><span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
+    </span><span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
     <span class="attr">#[tracing::instrument(
         parent = <span class="kw-2">&amp;</span><span class="self">self</span>.span,
         level = <span class="string">&quot;trace&quot;</span>,
         skip_all)]
-    </span><span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
+    </span><span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="kw">impl</span>&lt;R: oio::BlockingWrite&gt; oio::BlockingWrite <span class="kw">for </span>TracingWrapper&lt;R&gt; {
diff --git a/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html b/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
index 71cb526df..82672489d 100644
--- a/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
+++ b/docs/rust/src/opendal/raw/adapters/kv/backend.rs.html
@@ -435,6 +435,47 @@
 <a href="#435" id="435">435</a>
 <a href="#436" id="436">436</a>
 <a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -453,8 +494,13 @@
 // under the License.
 
 </span><span class="kw">use </span>std::sync::Arc;
+<span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
+<span class="kw">use </span>futures::FutureExt;
 
 <span class="kw">use </span><span class="kw">super</span>::Adapter;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -811,6 +857,7 @@
 
     <span class="doccomment">/// TODO: if kv supports append, we can use them directly.
     </span>buf: <span class="prelude-ty">Option</span>&lt;Vec&lt;u8&gt;&gt;,
+    future: <span class="prelude-ty">Option</span>&lt;BoxFuture&lt;<span class="lifetime">&#39;static</span>, <span class="prelude-ty">Result</span>&lt;()&gt;&gt;&gt;,
 }
 
 <span class="kw">impl</span>&lt;S&gt; KvWriter&lt;S&gt; {
@@ -819,36 +866,71 @@
             kv,
             path,
             buf: <span class="prelude-val">None</span>,
+            future: <span class="prelude-val">None</span>,
         }
     }
 }
 
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for KvWriter.
+</span><span class="kw">unsafe impl</span>&lt;S: Adapter&gt; Sync <span class="kw">for </span>KvWriter&lt;S&gt; {}
+
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;S: Adapter&gt; oio::Write <span class="kw">for </span>KvWriter&lt;S&gt; {
     <span class="comment">// TODO: we need to support append in the future.
-    </span><span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    </span><span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">if </span><span class="self">self</span>.future.is_some() {
+            <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;there is a future on going, it&#39;s maybe a bug to go into this case&quot;</span>,
+            )));
+        }
+
         <span class="kw">let </span>size = bs.chunk().len();
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buf.take().unwrap_or_else(|| Vec::with_capacity(size));
         buf.extend_from_slice(bs.chunk());
         <span class="self">self</span>.buf = <span class="prelude-val">Some</span>(buf);
 
-        <span class="prelude-val">Ok</span>(size)
+        Poll::Ready(<span class="prelude-val">Ok</span>(size))
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">&quot;output writer doesn&#39;t support abort&quot;</span>,
-        ))
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">if </span><span class="self">self</span>.future.is_some() {
+            <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;there is a future on going, it&#39;s maybe a bug to go into this case&quot;</span>,
+            )));
+        }
+
+        <span class="self">self</span>.buf = <span class="prelude-val">None</span>;
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(buf) = <span class="self">self</span>.buf.as_deref() {
-            <span class="self">self</span>.kv.set(<span class="kw-2">&amp;</span><span class="self">self</span>.path, buf).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="self">self</span>.future.as_mut() {
+                <span class="prelude-val">Some</span>(fut) =&gt; {
+                    <span class="macro">ready!</span>(fut.poll_unpin(cx))<span class="question-mark">?</span>;
+                    <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(()));
+                }
+                <span class="prelude-val">None </span>=&gt; {
+                    <span class="kw">let </span>kv = <span class="self">self</span>.kv.clone();
+                    <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
+                    <span class="kw">let </span>buf = <span class="kw">match </span><span class="self">self</span>.buf.take() {
+                        <span class="prelude-val">Some</span>(buf) =&gt; buf,
+                        <span class="prelude-val">None </span>=&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(())),
+                    };
+
+                    <span class="kw">let </span>fut = <span class="kw">async move </span>{ kv.set(<span class="kw-2">&amp;</span>path, <span class="kw-2">&amp;</span>buf).<span class="kw">await </span>};
+                    <span class="self">self</span>.future = <span class="prelude-val">Some</span>(Box::pin(fut));
+                }
+            }
         }
-
-        <span class="prelude-val">Ok</span>(())
     }
 }
 
diff --git a/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html b/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
index 30017a345..82b37c310 100644
--- a/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
+++ b/docs/rust/src/opendal/raw/adapters/typed_kv/backend.rs.html
@@ -446,6 +446,46 @@
 <a href="#446" id="446">446</a>
 <a href="#447" id="447">447</a>
 <a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
+<a href="#481" id="481">481</a>
+<a href="#482" id="482">482</a>
+<a href="#483" id="483">483</a>
+<a href="#484" id="484">484</a>
+<a href="#485" id="485">485</a>
+<a href="#486" id="486">486</a>
+<a href="#487" id="487">487</a>
+<a href="#488" id="488">488</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -464,9 +504,14 @@
 // under the License.
 
 </span><span class="kw">use </span>std::sync::Arc;
+<span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>futures::future::BoxFuture;
+<span class="kw">use </span>futures::FutureExt;
 
 <span class="kw">use </span><span class="kw">super</span>::Adapter;
 <span class="kw">use </span><span class="kw">super</span>::Value;
@@ -811,8 +856,14 @@
 
     op: OpWrite,
     buf: <span class="prelude-ty">Option</span>&lt;Vec&lt;u8&gt;&gt;,
+    future: <span class="prelude-ty">Option</span>&lt;BoxFuture&lt;<span class="lifetime">&#39;static</span>, <span class="prelude-ty">Result</span>&lt;()&gt;&gt;&gt;,
 }
 
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for KvWriter.
+</span><span class="kw">unsafe impl</span>&lt;S: Adapter&gt; Sync <span class="kw">for </span>KvWriter&lt;S&gt; {}
+
 <span class="kw">impl</span>&lt;S&gt; KvWriter&lt;S&gt; {
     <span class="kw">fn </span>new(kv: Arc&lt;S&gt;, path: String, op: OpWrite) -&gt; <span class="self">Self </span>{
         KvWriter {
@@ -820,6 +871,7 @@
             path,
             op,
             buf: <span class="prelude-val">None</span>,
+            future: <span class="prelude-val">None</span>,
         }
     }
 
@@ -849,7 +901,15 @@
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;S: Adapter&gt; oio::Write <span class="kw">for </span>KvWriter&lt;S&gt; {
     <span class="comment">// TODO: we need to support append in the future.
-    </span><span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    </span><span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">if </span><span class="self">self</span>.future.is_some() {
+            <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;there is a future on going, it&#39;s maybe a bug to go into this case&quot;</span>,
+            )));
+        }
+
         <span class="kw">let </span>size = bs.chunk().len();
 
         <span class="kw">let </span><span class="kw-2">mut </span>buf = <span class="self">self</span>.buf.take().unwrap_or_else(|| Vec::with_capacity(size));
@@ -857,20 +917,40 @@
 
         <span class="self">self</span>.buf = <span class="prelude-val">Some</span>(buf);
 
-        <span class="prelude-val">Ok</span>(size)
+        Poll::Ready(<span class="prelude-val">Ok</span>(size))
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">if </span><span class="self">self</span>.future.is_some() {
+            <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+            <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+                ErrorKind::Unexpected,
+                <span class="string">&quot;there is a future on going, it&#39;s maybe a bug to go into this case&quot;</span>,
+            )));
+        }
+
         <span class="self">self</span>.buf = <span class="prelude-val">None</span>;
-        <span class="prelude-val">Ok</span>(())
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>kv = <span class="self">self</span>.kv.clone();
-        <span class="kw">let </span>value = <span class="self">self</span>.build();
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="self">self</span>.future.as_mut() {
+                <span class="prelude-val">Some</span>(fut) =&gt; {
+                    <span class="macro">ready!</span>(fut.poll_unpin(cx))<span class="question-mark">?</span>;
+                    <span class="self">self</span>.future = <span class="prelude-val">None</span>;
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(()));
+                }
+                <span class="prelude-val">None </span>=&gt; {
+                    <span class="kw">let </span>kv = <span class="self">self</span>.kv.clone();
+                    <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
+                    <span class="kw">let </span>value = <span class="self">self</span>.build();
 
-        kv.set(<span class="kw-2">&amp;</span><span class="self">self</span>.path, value).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="prelude-val">Ok</span>(())
+                    <span class="kw">let </span>fut = <span class="kw">async move </span>{ kv.set(<span class="kw-2">&amp;</span>path, value).<span class="kw">await </span>};
+                    <span class="self">self</span>.future = <span class="prelude-val">Some</span>(Box::pin(fut));
+                }
+            }
+        }
     }
 }
 
diff --git a/docs/rust/src/opendal/raw/oio/buf.rs.html b/docs/rust/src/opendal/raw/oio/buf.rs.html
index ef73cb500..494b83e3e 100644
--- a/docs/rust/src/opendal/raw/oio/buf.rs.html
+++ b/docs/rust/src/opendal/raw/oio/buf.rs.html
@@ -218,6 +218,9 @@
 <a href="#218" id="218">218</a>
 <a href="#219" id="219">219</a>
 <a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -235,8 +238,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>bytes::{Bytes, BytesMut};
-<span class="kw">use </span>std::{cmp, ptr};
+</span><span class="kw">use </span>std::cmp;
+<span class="kw">use </span>std::ptr;
+
+<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>bytes::BytesMut;
 
 <span class="doccomment">/// WriteBuf is used in [`oio::Write`] to provide a trait similar to [`bytes::Buf`].
 ///
diff --git a/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html b/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html
index 2c8af971d..f88920aca 100644
--- a/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/cloneable_read.rs.html
@@ -135,6 +135,9 @@
 <a href="#135" id="135">135</a>
 <a href="#136" id="136">136</a>
 <a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -152,12 +155,15 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
-<span class="kw">use crate</span>::<span class="kw-2">*</span>;
-<span class="kw">use </span>bytes::Bytes;
-<span class="kw">use </span>std::io::SeekFrom;
+</span><span class="kw">use </span>std::io::SeekFrom;
 <span class="kw">use </span>std::sync::Arc;
-<span class="kw">use </span>std::task::{Context, Poll};
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>bytes::Bytes;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="doccomment">/// Convert given reader into a wrapper with `std::sync::Mutex` for `Send + Sync + Clone`.
 </span><span class="kw">pub fn </span>into_cloneable_reader_within_std&lt;R&gt;(reader: R) -&gt; CloneableReaderWithinStd&lt;R&gt; {
diff --git a/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html b/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
index af99cd8ba..4fdabf134 100644
--- a/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
+++ b/docs/rust/src/opendal/raw/oio/read/into_read_from_stream.rs.html
@@ -81,6 +81,10 @@
 <a href="#81" id="81">81</a>
 <a href="#82" id="82">82</a>
 <a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -98,12 +102,16 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
-<span class="kw">use crate</span>::<span class="kw-2">*</span>;
-<span class="kw">use </span>bytes::{Buf, Bytes};
+</span><span class="kw">use </span>std::io::SeekFrom;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>bytes::Buf;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>futures::StreamExt;
-<span class="kw">use </span>std::io::SeekFrom;
-<span class="kw">use </span>std::task::{Context, Poll};
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="doccomment">/// Convert given stream `futures::Stream&lt;Item = Result&lt;Bytes&gt;&gt;` into [`oio::Reader`].
 </span><span class="kw">pub fn </span>into_read_from_stream&lt;S&gt;(stream: S) -&gt; FromStreamReader&lt;S&gt; {
diff --git a/docs/rust/src/opendal/raw/oio/write/api.rs.html b/docs/rust/src/opendal/raw/oio/write/api.rs.html
index 83e5abedc..a5fa1e862 100644
--- a/docs/rust/src/opendal/raw/oio/write/api.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/api.rs.html
@@ -170,6 +170,85 @@
 <a href="#170" id="170">170</a>
 <a href="#171" id="171">171</a>
 <a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -189,8 +268,13 @@
 
 </span><span class="kw">use </span>std::fmt::Display;
 <span class="kw">use </span>std::fmt::Formatter;
+<span class="kw">use </span>std::future::Future;
+<span class="kw">use </span>std::pin::Pin;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>pin_project::pin_project;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -253,35 +337,33 @@
     ///
     /// It&#39;s possible that `n &lt; bs.len()`, caller should pass the remaining bytes
     /// repeatedly until all bytes has been written.
-    </span><span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt;;
-
-    <span class="doccomment">/// Abort the pending writer.
-    </span><span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+    </span><span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt;;
 
     <span class="doccomment">/// Close the writer and make sure all data has been flushed.
-    </span><span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+    </span><span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt;;
+
+    <span class="doccomment">/// Abort the pending writer.
+    </span><span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt;;
 }
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>Write <span class="kw">for </span>() {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let _ </span>= bs;
-
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, <span class="kw">_</span>: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="macro">unimplemented!</span>(<span class="string">&quot;write is required to be implemented for oio::Write&quot;</span>)
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
-            <span class="string">&quot;output writer doesn&#39;t support abort&quot;</span>,
-        ))
+            <span class="string">&quot;output writer doesn&#39;t support close&quot;</span>,
+        )))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
-            <span class="string">&quot;output writer doesn&#39;t support close&quot;</span>,
-        ))
+            <span class="string">&quot;output writer doesn&#39;t support abort&quot;</span>,
+        )))
     }
 }
 
@@ -290,17 +372,93 @@
 /// To make Writer work as expected, we must add this impl.
 </span><span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;T: Write + <span class="question-mark">?</span>Sized&gt; Write <span class="kw">for </span>Box&lt;T&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).write(bs).<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        (<span class="kw-2">**</span><span class="self">self</span>).poll_write(cx, bs)
+    }
+
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        (<span class="kw-2">**</span><span class="self">self</span>).poll_close(cx)
+    }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).abort().<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        (<span class="kw-2">**</span><span class="self">self</span>).poll_abort(cx)
+    }
+}
+
+<span class="doccomment">/// Impl WriteExt for all T: Write
+</span><span class="kw">impl</span>&lt;T: Write&gt; WriteExt <span class="kw">for </span>T {}
+
+<span class="doccomment">/// Extension of [`Read`] to make it easier for use.
+</span><span class="kw">pub trait </span>WriteExt: Write {
+    <span class="doccomment">/// Build a future for `poll_write`.
+    </span><span class="kw">fn </span>write&lt;<span class="lifetime">&#39;a</span>&gt;(<span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw-2">mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw">dyn </span>oio::WriteBuf) -&gt; WriteFuture&lt;<span class="lifetime">&#39;a</span>, <span class="self">Self</span>&gt; {
+        WriteFuture { writer: <span class="self">self</span>, buf }
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        (<span class="kw-2">**</span><span class="self">self</span>).close().<span class="kw">await
-    </span>}
+    <span class="doccomment">/// Build a future for `poll_close`.
+    </span><span class="kw">fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; CloseFuture&lt;<span class="self">Self</span>&gt; {
+        CloseFuture { writer: <span class="self">self </span>}
+    }
+
+    <span class="doccomment">/// Build a future for `poll_abort`.
+    </span><span class="kw">fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; AbortFuture&lt;<span class="self">Self</span>&gt; {
+        AbortFuture { writer: <span class="self">self </span>}
+    }
+}
+
+<span class="doccomment">/// Make this future `!Unpin` for compatibility with async trait methods.
+</span><span class="attr">#[pin_project(!Unpin)]
+</span><span class="kw">pub struct </span>WriteFuture&lt;<span class="lifetime">&#39;a</span>, W: Write + Unpin + <span class="question-mark">?</span>Sized&gt; {
+    writer: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw-2">mut </span>W,
+    buf: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw">dyn </span>oio::WriteBuf,
+}
+
+<span class="kw">impl</span>&lt;W&gt; Future <span class="kw">for </span>WriteFuture&lt;<span class="lifetime">&#39;_</span>, W&gt;
+<span class="kw">where
+    </span>W: Write + Unpin + <span class="question-mark">?</span>Sized,
+{
+    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;usize&gt;;
+
+    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">let </span>this = <span class="self">self</span>.project();
+        Pin::new(this.writer).poll_write(cx, <span class="kw-2">*</span>this.buf)
+    }
+}
+
+<span class="doccomment">/// Make this future `!Unpin` for compatibility with async trait methods.
+</span><span class="attr">#[pin_project(!Unpin)]
+</span><span class="kw">pub struct </span>AbortFuture&lt;<span class="lifetime">&#39;a</span>, W: Write + Unpin + <span class="question-mark">?</span>Sized&gt; {
+    writer: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw-2">mut </span>W,
+}
+
+<span class="kw">impl</span>&lt;W&gt; Future <span class="kw">for </span>AbortFuture&lt;<span class="lifetime">&#39;_</span>, W&gt;
+<span class="kw">where
+    </span>W: Write + Unpin + <span class="question-mark">?</span>Sized,
+{
+    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;()&gt;;
+
+    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">let </span>this = <span class="self">self</span>.project();
+        Pin::new(this.writer).poll_abort(cx)
+    }
+}
+
+<span class="doccomment">/// Make this future `!Unpin` for compatibility with async trait methods.
+</span><span class="attr">#[pin_project(!Unpin)]
+</span><span class="kw">pub struct </span>CloseFuture&lt;<span class="lifetime">&#39;a</span>, W: Write + Unpin + <span class="question-mark">?</span>Sized&gt; {
+    writer: <span class="kw-2">&amp;</span><span class="lifetime">&#39;a </span><span class="kw-2">mut </span>W,
+}
+
+<span class="kw">impl</span>&lt;W&gt; Future <span class="kw">for </span>CloseFuture&lt;<span class="lifetime">&#39;_</span>, W&gt;
+<span class="kw">where
+    </span>W: Write + Unpin + <span class="question-mark">?</span>Sized,
+{
+    <span class="kw">type </span>Output = <span class="prelude-ty">Result</span>&lt;()&gt;;
+
+    <span class="kw">fn </span>poll(<span class="self">self</span>: Pin&lt;<span class="kw-2">&amp;mut </span><span class="self">Self</span>&gt;, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">let </span>this = <span class="self">self</span>.project();
+        Pin::new(this.writer).poll_close(cx)
+    }
 }
 
 <span class="doccomment">/// BlockingWriter is a type erased [`BlockingWrite`]
diff --git a/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html b/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
index 6841296ca..a9c3c0a26 100644
--- a/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/append_object_write.rs.html
@@ -102,6 +102,37 @@
 <a href="#102" id="102">102</a>
 <a href="#103" id="103">103</a>
 <a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -119,7 +150,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -134,7 +170,7 @@
 /// - `AppendObjectWriter` impl `Write`
 /// - Expose `AppendObjectWriter` as `Accessor::Writer`
 </span><span class="attr">#[async_trait]
-</span><span class="kw">pub trait </span>AppendObjectWrite: Send + Sync + Unpin {
+</span><span class="kw">pub trait </span>AppendObjectWrite: Send + Sync + Unpin + <span class="lifetime">&#39;static </span>{
     <span class="doccomment">/// Get the current offset of the append object.
     ///
     /// Returns `0` if the object is not exist.
@@ -150,30 +186,30 @@
 ///
 /// - Allow users to switch to un-buffered mode if users write 16MiB every time.
 </span><span class="kw">pub struct </span>AppendObjectWriter&lt;W: AppendObjectWrite&gt; {
-    inner: W,
+    state: State&lt;W&gt;,
 
     offset: <span class="prelude-ty">Option</span>&lt;u64&gt;,
 }
 
+<span class="kw">enum </span>State&lt;W&gt; {
+    Idle(<span class="prelude-ty">Option</span>&lt;W&gt;),
+    Offset(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;u64&gt;)&gt;),
+    Append(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;usize&gt;)&gt;),
+}
+
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for State.
+</span><span class="kw">unsafe impl</span>&lt;S: AppendObjectWrite&gt; Sync <span class="kw">for </span>State&lt;S&gt; {}
+
 <span class="kw">impl</span>&lt;W: AppendObjectWrite&gt; AppendObjectWriter&lt;W&gt; {
     <span class="doccomment">/// Create a new AppendObjectWriter.
     </span><span class="kw">pub fn </span>new(inner: W) -&gt; <span class="self">Self </span>{
         <span class="self">Self </span>{
-            inner,
+            state: State::Idle(<span class="prelude-val">Some</span>(inner)),
             offset: <span class="prelude-val">None</span>,
         }
     }
-
-    <span class="kw">async fn </span>offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(offset) = <span class="self">self</span>.offset {
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(offset);
-        }
-
-        <span class="kw">let </span>offset = <span class="self">self</span>.inner.offset().<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="self">self</span>.offset = <span class="prelude-val">Some</span>(offset);
-
-        <span class="prelude-val">Ok</span>(offset)
-    }
 }
 
 <span class="attr">#[async_trait]
@@ -181,29 +217,55 @@
 <span class="kw">where
     </span>W: AppendObjectWrite,
 {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>offset = <span class="self">self</span>.offset().<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().expect(<span class="string">&quot;writer must be valid&quot;</span>);
+                    <span class="kw">match </span><span class="self">self</span>.offset {
+                        <span class="prelude-val">Some</span>(offset) =&gt; {
+                            <span class="kw">let </span>size = bs.remaining();
+                            <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+
+                            <span class="self">self</span>.state = State::Append(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>res = w.append(offset, size <span class="kw">as </span>u64, AsyncBody::Bytes(bs)).<span class="kw">await</span>;
 
-        <span class="kw">let </span>size = bs.remaining();
+                                (w, res.map(|<span class="kw">_</span>| size))
+                            }));
+                        }
+                        <span class="prelude-val">None </span>=&gt; {
+                            <span class="self">self</span>.state = State::Offset(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>offset = w.offset().<span class="kw">await</span>;
 
-        <span class="self">self</span>.inner
-            .append(
-                offset,
-                size <span class="kw">as </span>u64,
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
-            )
-            .<span class="kw">await
-            </span>.map(|<span class="kw">_</span>| <span class="self">self</span>.offset = <span class="prelude-val">Some</span>(offset + size <span class="kw">as </span>u64))<span class="question-mark">?</span>;
+                                (w, offset)
+                            }));
+                        }
+                    }
+                }
+                State::Offset(fut) =&gt; {
+                    <span class="kw">let </span>(w, offset) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="self">self</span>.offset = <span class="prelude-val">Some</span>(offset<span class="question-mark">?</span>);
+                }
+                State::Append(fut) =&gt; {
+                    <span class="kw">let </span>(w, size) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
 
-        <span class="prelude-val">Ok</span>(size)
+                    <span class="kw">let </span>size = size<span class="question-mark">?</span>;
+                    <span class="comment">// Update offset after succeed.
+                    </span><span class="self">self</span>.offset = <span class="self">self</span>.offset.map(|offset| offset + size <span class="kw">as </span>u64);
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(size));
+                }
+            }
+        }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html b/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
index b88e805a5..70db5e515 100644
--- a/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/compose_write.rs.html
@@ -117,6 +117,9 @@
 <a href="#117" id="117">117</a>
 <a href="#118" id="118">118</a>
 <a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -157,7 +160,10 @@
 //! This module is used to provide some enums for the above code. We should remove this module once
 //! type_alias_impl_trait has been stabilized.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -174,24 +180,24 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;ONE: oio::Write, TWO: oio::Write&gt; oio::Write <span class="kw">for </span>TwoWaysWriter&lt;ONE, TWO&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.write(bs).<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.write(bs).<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_write(cx, bs),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_write(cx, bs),
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.abort().<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.abort().<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_close(cx),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_close(cx),
         }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.close().<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.close().<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_abort(cx),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_abort(cx),
         }
     }
 }
@@ -212,27 +218,27 @@
 </span><span class="kw">impl</span>&lt;ONE: oio::Write, TWO: oio::Write, THREE: oio::Write&gt; oio::Write
     <span class="kw">for </span>ThreeWaysWriter&lt;ONE, TWO, THREE&gt;
 {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.write(bs).<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.write(bs).<span class="kw">await</span>,
-            <span class="self">Self</span>::Three(three) =&gt; three.write(bs).<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_write(cx, bs),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_write(cx, bs),
+            <span class="self">Self</span>::Three(three) =&gt; three.poll_write(cx, bs),
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.abort().<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.abort().<span class="kw">await</span>,
-            <span class="self">Self</span>::Three(three) =&gt; three.abort().<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_close(cx),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_close(cx),
+            <span class="self">Self</span>::Three(three) =&gt; three.poll_close(cx),
         }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">match </span><span class="self">self </span>{
-            <span class="self">Self</span>::One(one) =&gt; one.close().<span class="kw">await</span>,
-            <span class="self">Self</span>::Two(two) =&gt; two.close().<span class="kw">await</span>,
-            <span class="self">Self</span>::Three(three) =&gt; three.close().<span class="kw">await</span>,
+            <span class="self">Self</span>::One(one) =&gt; one.poll_abort(cx),
+            <span class="self">Self</span>::Two(two) =&gt; two.poll_abort(cx),
+            <span class="self">Self</span>::Three(three) =&gt; three.poll_abort(cx),
         }
     }
 }
diff --git a/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html b/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
index 3de9a7ddc..ad1ffa58b 100644
--- a/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/exact_buf_write.rs.html
@@ -239,6 +239,11 @@
 <a href="#239" id="239">239</a>
 <a href="#240" id="240">240</a>
 <a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -257,9 +262,13 @@
 // under the License.
 
 </span><span class="kw">use </span>std::cmp::min;
+<span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
-<span class="kw">use </span>bytes::{Bytes, BytesMut};
+<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>bytes::BytesMut;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::oio::WriteBuf;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -303,20 +312,20 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;W: oio::Write&gt; oio::Write <span class="kw">for </span>ExactBufWriter&lt;W&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
         <span class="kw">loop </span>{
             <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer {
                 Buffer::Empty =&gt; {
                     <span class="kw">if </span>bs.remaining() &gt;= <span class="self">self</span>.buffer_size {
                         <span class="self">self</span>.buffer = Buffer::Consuming(bs.copy_to_bytes(<span class="self">self</span>.buffer_size));
-                        <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="self">self</span>.buffer_size);
+                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(<span class="self">self</span>.buffer_size));
                     }
 
                     <span class="kw">let </span>chunk = bs.chunk();
                     <span class="kw">let </span><span class="kw-2">mut </span>fill = BytesMut::with_capacity(chunk.len());
                     fill.extend_from_slice(chunk);
                     <span class="self">self</span>.buffer = Buffer::Filling(fill);
-                    <span class="kw">return </span><span class="prelude-val">Ok</span>(chunk.len());
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(chunk.len()));
                 }
                 Buffer::Filling(fill) =&gt; {
                     <span class="kw">if </span>fill.len() &gt;= <span class="self">self</span>.buffer_size {
@@ -326,14 +335,14 @@
 
                     <span class="kw">let </span>size = min(<span class="self">self</span>.buffer_size - fill.len(), bs.chunk().len());
                     fill.extend_from_slice(<span class="kw-2">&amp;</span>bs.chunk()[..size]);
-                    <span class="kw">return </span><span class="prelude-val">Ok</span>(size);
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(size));
                 }
                 Buffer::Consuming(consume) =&gt; {
                     <span class="comment">// Make sure filled buffer has been flushed.
                     //
                     // TODO: maybe we can re-fill it after a successful write.
                     </span><span class="kw">while </span>!consume.is_empty() {
-                        <span class="kw">let </span>n = <span class="self">self</span>.inner.write(consume).<span class="kw">await</span><span class="question-mark">?</span>;
+                        <span class="kw">let </span>n = <span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_write(cx, consume)<span class="question-mark">?</span>);
                         consume.advance(n);
                     }
                     <span class="self">self</span>.buffer = Buffer::Empty;
@@ -342,12 +351,12 @@
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="self">self</span>.buffer = Buffer::Empty;
-        <span class="self">self</span>.inner.abort().<span class="kw">await
-    </span>}
+        <span class="self">self</span>.inner.poll_abort(cx)
+    }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
         <span class="kw">loop </span>{
             <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer {
                 Buffer::Empty =&gt; <span class="kw">break</span>,
@@ -360,7 +369,7 @@
                     //
                     // TODO: maybe we can re-fill it after a successful write.
                     </span><span class="kw">while </span>!consume.is_empty() {
-                        <span class="kw">let </span>n = <span class="self">self</span>.inner.write(<span class="kw-2">&amp;</span>consume).<span class="kw">await</span><span class="question-mark">?</span>;
+                        <span class="kw">let </span>n = <span class="macro">ready!</span>(<span class="self">self</span>.inner.poll_write(cx, <span class="kw-2">&amp;</span>consume))<span class="question-mark">?</span>;
                         consume.advance(n);
                     }
                     <span class="self">self</span>.buffer = Buffer::Empty;
@@ -369,8 +378,8 @@
             }
         }
 
-        <span class="self">self</span>.inner.close().<span class="kw">await
-    </span>}
+        <span class="self">self</span>.inner.poll_close(cx)
+    }
 }
 
 <span class="attr">#[cfg(test)]
@@ -385,6 +394,7 @@
 
     <span class="kw">use super</span>::<span class="kw-2">*</span>;
     <span class="kw">use </span><span class="kw">crate</span>::raw::oio::Write;
+    <span class="kw">use </span><span class="kw">crate</span>::raw::oio::WriteExt;
 
     <span class="kw">struct </span>MockWriter {
         buf: Vec&lt;u8&gt;,
@@ -392,22 +402,22 @@
 
     <span class="attr">#[async_trait]
     </span><span class="kw">impl </span>Write <span class="kw">for </span>MockWriter {
-        <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+        <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
             <span class="macro">debug!</span>(
                 <span class="string">&quot;test_fuzz_exact_buf_writer: flush size: {}&quot;</span>,
                 bs.chunk().len()
             );
 
             <span class="self">self</span>.buf.extend_from_slice(bs.chunk());
-            <span class="prelude-val">Ok</span>(bs.chunk().len())
+            Poll::Ready(<span class="prelude-val">Ok</span>(bs.chunk().len()))
         }
 
-        <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-            <span class="prelude-val">Ok</span>(())
+        <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+            Poll::Ready(<span class="prelude-val">Ok</span>(()))
         }
 
-        <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-            <span class="prelude-val">Ok</span>(())
+        <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+            Poll::Ready(<span class="prelude-val">Ok</span>(()))
         }
     }
 
diff --git a/docs/rust/src/opendal/raw/oio/write/mod.rs.html b/docs/rust/src/opendal/raw/oio/write/mod.rs.html
index 432452420..68ec31dd8 100644
--- a/docs/rust/src/opendal/raw/oio/write/mod.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/mod.rs.html
@@ -41,6 +41,11 @@
 <a href="#41" id="41">41</a>
 <a href="#42" id="42">42</a>
 <a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -62,6 +67,7 @@
 <span class="kw">pub use </span>api::BlockingWrite;
 <span class="kw">pub use </span>api::BlockingWriter;
 <span class="kw">pub use </span>api::Write;
+<span class="kw">pub use </span>api::WriteExt;
 <span class="kw">pub use </span>api::WriteOperation;
 <span class="kw">pub use </span>api::Writer;
 
@@ -84,4 +90,8 @@
 
 <span class="kw">mod </span>exact_buf_write;
 <span class="kw">pub use </span>exact_buf_write::ExactBufWriter;
+
+<span class="kw">mod </span>range_write;
+<span class="kw">pub use </span>range_write::RangeWrite;
+<span class="kw">pub use </span>range_write::RangeWriter;
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html b/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
index ea831e214..180ab2460 100644
--- a/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/multipart_upload_write.rs.html
@@ -157,6 +157,99 @@
 <a href="#157" id="157">157</a>
 <a href="#158" id="158">158</a>
 <a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -174,22 +267,30 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::sync::Arc;
+<span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="doccomment">/// MultipartUploadWrite is used to implement [`Write`] based on multipart
 /// uploads. By implementing MultipartUploadWrite, services don&#39;t need to
-/// care about the details of buffering and uploading parts.
+/// care about the details of uploading parts.
+///
+/// # Architecture
 ///
-/// The layout after adopting [`MultipartUploadWrite`]:
+/// The architecture after adopting [`MultipartUploadWrite`]:
 ///
 /// - Services impl `MultipartUploadWrite`
 /// - `MultipartUploadWriter` impl `Write`
 /// - Expose `MultipartUploadWriter` as `Accessor::Writer`
 </span><span class="attr">#[async_trait]
-</span><span class="kw">pub trait </span>MultipartUploadWrite: Send + Sync + Unpin {
+</span><span class="kw">pub trait </span>MultipartUploadWrite: Send + Sync + Unpin + <span class="lifetime">&#39;static </span>{
     <span class="doccomment">/// initiate_part will call start a multipart upload and return the upload id.
     ///
     /// MultipartUploadWriter will call this when:
@@ -228,6 +329,7 @@
 ///
 /// - `part_number` is the index of the part, starting from 0.
 /// - `etag` is the `ETag` of the part.
+</span><span class="attr">#[derive(Clone)]
 </span><span class="kw">pub struct </span>MultipartUploadPart {
     <span class="doccomment">/// The number of the part, starting from 0.
     </span><span class="kw">pub </span>part_number: usize,
@@ -237,40 +339,36 @@
 
 <span class="doccomment">/// MultipartUploadWriter will implements [`Write`] based on multipart
 /// uploads.
-///
-/// ## TODO
-///
-/// - Add threshold for `write_once` to avoid unnecessary multipart uploads.
-/// - Allow users to switch to un-buffered mode if users write 16MiB every time.
 </span><span class="kw">pub struct </span>MultipartUploadWriter&lt;W: MultipartUploadWrite&gt; {
-    inner: W,
+    state: State&lt;W&gt;,
 
-    upload_id: <span class="prelude-ty">Option</span>&lt;String&gt;,
+    upload_id: <span class="prelude-ty">Option</span>&lt;Arc&lt;String&gt;&gt;,
     parts: Vec&lt;MultipartUploadPart&gt;,
 }
 
+<span class="kw">enum </span>State&lt;W&gt; {
+    Idle(<span class="prelude-ty">Option</span>&lt;W&gt;),
+    Init(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;String&gt;)&gt;),
+    Write(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, usize, <span class="prelude-ty">Result</span>&lt;MultipartUploadPart&gt;)&gt;),
+    Close(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+    Abort(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+}
+
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for State.
+</span><span class="kw">unsafe impl</span>&lt;S: MultipartUploadWrite&gt; Sync <span class="kw">for </span>State&lt;S&gt; {}
+
 <span class="kw">impl</span>&lt;W: MultipartUploadWrite&gt; MultipartUploadWriter&lt;W&gt; {
     <span class="doccomment">/// Create a new MultipartUploadWriter.
     </span><span class="kw">pub fn </span>new(inner: W) -&gt; <span class="self">Self </span>{
         <span class="self">Self </span>{
-            inner,
+            state: State::Idle(<span class="prelude-val">Some</span>(inner)),
 
             upload_id: <span class="prelude-val">None</span>,
             parts: Vec::new(),
         }
     }
-
-    <span class="doccomment">/// Get the upload id. Initiate a new multipart upload if the upload id is empty.
-    </span><span class="kw">pub async fn </span>upload_id(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;String&gt; {
-        <span class="kw">match </span><span class="kw-2">&amp;</span><span class="self">self</span>.upload_id {
-            <span class="prelude-val">Some</span>(upload_id) =&gt; <span class="prelude-val">Ok</span>(upload_id.to_string()),
-            <span class="prelude-val">None </span>=&gt; {
-                <span class="kw">let </span>upload_id = <span class="self">self</span>.inner.initiate_part().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="self">self</span>.upload_id = <span class="prelude-val">Some</span>(upload_id.clone());
-                <span class="prelude-val">Ok</span>(upload_id)
-            }
-        }
-    }
 }
 
 <span class="attr">#[async_trait]
@@ -278,42 +376,130 @@
 <span class="kw">where
     </span>W: MultipartUploadWrite,
 {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>upload_id = <span class="self">self</span>.upload_id().<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().expect(<span class="string">&quot;writer must be valid&quot;</span>);
+                    <span class="kw">match </span><span class="self">self</span>.upload_id.as_ref() {
+                        <span class="prelude-val">Some</span>(upload_id) =&gt; {
+                            <span class="kw">let </span>size = bs.remaining();
+                            <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+                            <span class="kw">let </span>upload_id = upload_id.clone();
+                            <span class="kw">let </span>part_number = <span class="self">self</span>.parts.len();
 
-        <span class="kw">let </span>size = bs.remaining();
+                            <span class="self">self</span>.state = State::Write(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>part = w
+                                    .write_part(
+                                        <span class="kw-2">&amp;</span>upload_id,
+                                        part_number,
+                                        size <span class="kw">as </span>u64,
+                                        AsyncBody::Bytes(bs),
+                                    )
+                                    .<span class="kw">await</span>;
 
-        <span class="self">self</span>.inner
-            .write_part(
-                <span class="kw-2">&amp;</span>upload_id,
-                <span class="self">self</span>.parts.len(),
-                size <span class="kw">as </span>u64,
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
-            )
-            .<span class="kw">await
-            </span>.map(|v| <span class="self">self</span>.parts.push(v))<span class="question-mark">?</span>;
+                                (w, size, part)
+                            }));
+                        }
+                        <span class="prelude-val">None </span>=&gt; {
+                            <span class="self">self</span>.state = State::Init(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>upload_id = w.initiate_part().<span class="kw">await</span>;
+                                (w, upload_id)
+                            }));
+                        }
+                    }
+                }
+                State::Init(fut) =&gt; {
+                    <span class="kw">let </span>(w, upload_id) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="self">self</span>.upload_id = <span class="prelude-val">Some</span>(Arc::new(upload_id<span class="question-mark">?</span>));
+                }
+                State::Write(fut) =&gt; {
+                    <span class="kw">let </span>(w, size, part) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
 
-        <span class="prelude-val">Ok</span>(size)
+                    <span class="self">self</span>.parts.push(part<span class="question-mark">?</span>);
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(size));
+                }
+                State::Close(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(
+                        <span class="string">&quot;MultipartUploadWriter must not go into State::Close during poll_write&quot;
+                    </span>)
+                }
+                State::Abort(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(
+                        <span class="string">&quot;MultipartUploadWriter must not go into State::Abort during poll_write&quot;
+                    </span>)
+                }
+            }
+        }
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>upload_id = <span class="kw">if let </span><span class="prelude-val">Some</span>(upload_id) = <span class="kw-2">&amp;</span><span class="self">self</span>.upload_id {
-            upload_id
-        } <span class="kw">else </span>{
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(());
-        };
-
-        <span class="self">self</span>.inner.complete_part(upload_id, <span class="kw-2">&amp;</span><span class="self">self</span>.parts).<span class="kw">await
-    </span>}
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>upload_id = <span class="kw">if let </span><span class="prelude-val">Some</span>(upload_id) = <span class="kw-2">&amp;</span><span class="self">self</span>.upload_id {
-            upload_id
-        } <span class="kw">else </span>{
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(());
-        };
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().expect(<span class="string">&quot;writer must be valid&quot;</span>);
+                    <span class="kw">match </span><span class="self">self</span>.upload_id.clone() {
+                        <span class="prelude-val">Some</span>(upload_id) =&gt; {
+                            <span class="kw">let </span>parts = <span class="self">self</span>.parts.clone();
+                            <span class="self">self</span>.state = State::Close(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>res = w.complete_part(<span class="kw-2">&amp;</span>upload_id, <span class="kw-2">&amp;</span>parts).<span class="kw">await</span>;
+                                (w, res)
+                            }));
+                        }
+                        <span class="prelude-val">None </span>=&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(())),
+                    }
+                }
+                State::Close(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">futures::ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="kw">return </span>Poll::Ready(res);
+                }
+                State::Init(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Init during poll_close&quot;
+                </span>),
+                State::Write(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Write during poll_close&quot;
+                </span>),
+                State::Abort(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Abort during poll_close&quot;
+                </span>),
+            }
+        }
+    }
 
-        <span class="self">self</span>.inner.abort_part(upload_id).<span class="kw">await
-    </span>}
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().expect(<span class="string">&quot;writer must be valid&quot;</span>);
+                    <span class="kw">match </span><span class="self">self</span>.upload_id.clone() {
+                        <span class="prelude-val">Some</span>(upload_id) =&gt; {
+                            <span class="self">self</span>.state = State::Abort(Box::pin(<span class="kw">async move </span>{
+                                <span class="kw">let </span>res = w.abort_part(<span class="kw-2">&amp;</span>upload_id).<span class="kw">await</span>;
+                                (w, res)
+                            }));
+                        }
+                        <span class="prelude-val">None </span>=&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(())),
+                    }
+                }
+                State::Abort(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">futures::ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="kw">return </span>Poll::Ready(res);
+                }
+                State::Init(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Init during poll_abort&quot;
+                </span>),
+                State::Write(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Write during poll_abort&quot;
+                </span>),
+                State::Close(<span class="kw">_</span>) =&gt; <span class="macro">unreachable!</span>(
+                    <span class="string">&quot;MultipartUploadWriter must not go into State::Close during poll_abort&quot;
+                </span>),
+            }
+        }
+    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html b/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
index 73c662b24..e3a96439d 100644
--- a/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
+++ b/docs/rust/src/opendal/raw/oio/write/one_shot_write.rs.html
@@ -62,6 +62,46 @@
 <a href="#62" id="62">62</a>
 <a href="#63" id="63">63</a>
 <a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -79,7 +119,13 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
+<span class="kw">use </span>futures::future::BoxFuture;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
@@ -91,39 +137,73 @@
 ///
 /// The layout after adopting [`OneShotWrite`]:
 </span><span class="attr">#[async_trait]
-</span><span class="kw">pub trait </span>OneShotWrite: Send + Sync + Unpin {
+</span><span class="kw">pub trait </span>OneShotWrite: Send + Sync + Unpin + <span class="lifetime">&#39;static </span>{
     <span class="doccomment">/// write_once write all data at once.
     ///
     /// Implementations should make sure that the data is written correctly at once.
-    </span><span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, body: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+    </span><span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
 }
 
 <span class="doccomment">/// OneShotWrite is used to implement [`Write`] based on one shot.
 </span><span class="kw">pub struct </span>OneShotWriter&lt;W: OneShotWrite&gt; {
-    inner: W,
+    state: State&lt;W&gt;,
+}
+
+<span class="kw">enum </span>State&lt;W&gt; {
+    Idle(<span class="prelude-ty">Option</span>&lt;W&gt;),
+    Write(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;usize&gt;)&gt;),
 }
 
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for State.
+</span><span class="kw">unsafe impl</span>&lt;S: OneShotWrite&gt; Sync <span class="kw">for </span>State&lt;S&gt; {}
+
 <span class="kw">impl</span>&lt;W: OneShotWrite&gt; OneShotWriter&lt;W&gt; {
     <span class="doccomment">/// Create a new one shot writer.
     </span><span class="kw">pub fn </span>new(inner: W) -&gt; <span class="self">Self </span>{
-        <span class="self">Self </span>{ inner }
+        <span class="self">Self </span>{
+            state: State::Idle(<span class="prelude-val">Some</span>(inner)),
+        }
     }
 }
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl</span>&lt;W: OneShotWrite&gt; oio::Write <span class="kw">for </span>OneShotWriter&lt;W&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-        <span class="self">self</span>.inner.write_once(bs).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="prelude-val">Ok</span>(size)
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().expect(<span class="string">&quot;writer must be valid&quot;</span>);
+
+                    <span class="kw">let </span>size = bs.remaining();
+                    <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+                    <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                        <span class="kw">let </span>res = w.write_once(bs).<span class="kw">await</span>;
+
+                        (w, res.map(|<span class="kw">_</span>| size))
+                    };
+
+                    <span class="self">self</span>.state = State::Write(Box::pin(fut));
+                }
+                State::Write(fut) =&gt; {
+                    <span class="kw">let </span>(w, size) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="kw">return </span>Poll::Ready(size);
+                }
+            }
+        }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
+            ErrorKind::Unsupported,
+            <span class="string">&quot;OneShotWriter doesn&#39;t support abort since all content has been flushed&quot;</span>,
+        )))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/raw/oio/write/range_write.rs.html b/docs/rust/src/opendal/raw/oio/write/range_write.rs.html
new file mode 100644
index 000000000..94c244b4a
--- /dev/null
+++ b/docs/rust/src/opendal/raw/oio/write/range_write.rs.html
@@ -0,0 +1,585 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `core/src/raw/oio/write/range_write.rs`."><title>range_write.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/ [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+</pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// &quot;License&quot;); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
+<span class="kw">use </span>futures::FutureExt;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::oio::WriteBuf;
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="doccomment">/// RangeWrite is used to implement [`Write`] based on range write.
+///
+/// # Services
+///
+/// Services like gcs support range write via [GCS Resumable Upload](https://cloud.google.com/storage/docs/resumable-uploads).
+///
+/// GCS will support upload content by specifying the range of the file in `CONTENT-RANGE`.
+///
+/// Most range based services will have the following limitations:
+///
+/// - The size of chunk per upload must be aligned to a certain size. For example, GCS requires
+///   to align with 256KiB.
+/// - Some services requires to complete the write at the last chunk with the total size.
+///
+/// # Architecture
+///
+/// The architecture after adopting [`RangeWrite`]:
+///
+/// - Services impl `RangeWrite`
+/// - `RangeWriter` impl `Write`
+/// - Expose `RangeWriter` as `Accessor::Writer`
+</span><span class="attr">#[async_trait]
+</span><span class="kw">pub trait </span>RangeWrite: Send + Sync + Unpin + <span class="lifetime">&#39;static </span>{
+    <span class="doccomment">/// Initiate range the range write, the returning value is the location.
+    </span><span class="kw">async fn </span>initiate_range(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;String&gt;;
+
+    <span class="doccomment">/// write_range will write a range of data.
+    </span><span class="kw">async fn </span>write_range(
+        <span class="kw-2">&amp;</span><span class="self">self</span>,
+        location: <span class="kw-2">&amp;</span>str,
+        written: u64,
+        size: u64,
+        body: AsyncBody,
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+
+    <span class="doccomment">/// complete_range will complete the range write by uploading the last chunk.
+    </span><span class="kw">async fn </span>complete_range(
+        <span class="kw-2">&amp;</span><span class="self">self</span>,
+        location: <span class="kw-2">&amp;</span>str,
+        written: u64,
+        size: u64,
+        body: AsyncBody,
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+
+    <span class="doccomment">/// abort_range will abort the range write by abort all already uploaded data.
+    </span><span class="kw">async fn </span>abort_range(<span class="kw-2">&amp;</span><span class="self">self</span>, location: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt;;
+}
+
+<span class="doccomment">/// RangeWriter will implements [`Write`] based on range write.
+</span><span class="kw">pub struct </span>RangeWriter&lt;W: RangeWrite&gt; {
+    location: <span class="prelude-ty">Option</span>&lt;String&gt;,
+    written: u64,
+    align_size: usize,
+    align_buffer: oio::ChunkedCursor,
+
+    state: State&lt;W&gt;,
+}
+
+<span class="kw">enum </span>State&lt;W&gt; {
+    Idle(<span class="prelude-ty">Option</span>&lt;W&gt;),
+    Init(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;String&gt;)&gt;),
+    <span class="doccomment">/// The returning value is (consume size, written size).
+    </span>Write(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;(usize, u64)&gt;)&gt;),
+    Complete(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+    Abort(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (W, <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+}
+
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for State.
+</span><span class="kw">unsafe impl</span>&lt;W: RangeWrite&gt; Sync <span class="kw">for </span>State&lt;W&gt; {}
+
+<span class="kw">impl</span>&lt;W: RangeWrite&gt; RangeWriter&lt;W&gt; {
+    <span class="doccomment">/// Create a new MultipartUploadWriter.
+    </span><span class="kw">pub fn </span>new(inner: W) -&gt; <span class="self">Self </span>{
+        <span class="self">Self </span>{
+            state: State::Idle(<span class="prelude-val">Some</span>(inner)),
+
+            location: <span class="prelude-val">None</span>,
+            written: <span class="number">0</span>,
+            align_size: <span class="number">256 </span>* <span class="number">1024</span>,
+            align_buffer: oio::ChunkedCursor::default(),
+        }
+    }
+
+    <span class="doccomment">/// Set the align size.
+    ///
+    /// The size is default to 256 KiB.
+    ///
+    /// # Note
+    ///
+    /// Please don&#39;t mix this with the buffer size. Align size is usually the hard
+    /// limit for the service to accept the chunk.
+    </span><span class="kw">pub fn </span>with_align_size(<span class="kw-2">mut </span><span class="self">self</span>, size: usize) -&gt; <span class="self">Self </span>{
+        <span class="self">self</span>.align_size = size;
+        <span class="self">self
+    </span>}
+}
+
+<span class="kw">impl</span>&lt;W: RangeWrite&gt; oio::Write <span class="kw">for </span>RangeWriter&lt;W&gt; {
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">match </span><span class="self">self</span>.location.clone() {
+                        <span class="prelude-val">Some</span>(location) =&gt; {
+                            <span class="kw">let </span>remaining = bs.remaining();
+                            <span class="kw">let </span>current_size = <span class="self">self</span>.align_buffer.len();
+                            <span class="kw">let </span><span class="kw-2">mut </span>total_size = current_size + remaining;
+
+                            <span class="kw">if </span>total_size &lt;= <span class="self">self</span>.align_size {
+                                <span class="kw">let </span>bs = bs.copy_to_bytes(remaining);
+                                <span class="self">self</span>.align_buffer.push(bs);
+                                <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(remaining));
+                            }
+                            <span class="comment">// If total_size is aligned, we need to write one less chunk to make sure
+                            // that the file has at least one chunk during complete stage.
+                            </span><span class="kw">if </span>total_size % <span class="self">self</span>.align_size == <span class="number">0 </span>{
+                                total_size -= <span class="self">self</span>.align_size;
+                            }
+
+                            <span class="kw">let </span>consume = total_size - total_size % <span class="self">self</span>.align_size - current_size;
+                            <span class="kw">let </span><span class="kw-2">mut </span>align_buffer = <span class="self">self</span>.align_buffer.clone();
+                            <span class="kw">let </span>bs = bs.copy_to_bytes(consume);
+                            align_buffer.push(bs);
+
+                            <span class="kw">let </span>written = <span class="self">self</span>.written;
+                            <span class="kw">let </span>w = w.take().unwrap();
+                            <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                                <span class="kw">let </span>size = align_buffer.len() <span class="kw">as </span>u64;
+                                <span class="kw">let </span>res = w
+                                    .write_range(
+                                        <span class="kw-2">&amp;</span>location,
+                                        written,
+                                        size,
+                                        AsyncBody::Stream(Box::new(align_buffer)),
+                                    )
+                                    .<span class="kw">await</span>;
+
+                                (w, res.map(|<span class="kw">_</span>| (consume, size)))
+                            };
+                            <span class="self">self</span>.state = State::Write(Box::pin(fut));
+                        }
+                        <span class="prelude-val">None </span>=&gt; {
+                            <span class="kw">let </span>w = w.take().unwrap();
+                            <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                                <span class="kw">let </span>res = w.initiate_range().<span class="kw">await</span>;
+
+                                (w, res)
+                            };
+                            <span class="self">self</span>.state = State::Init(Box::pin(fut));
+                        }
+                    }
+                }
+                State::Init(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="self">self</span>.location = <span class="prelude-val">Some</span>(res<span class="question-mark">?</span>);
+                }
+                State::Write(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="kw">let </span>(consume, written) = res<span class="question-mark">?</span>;
+                    <span class="self">self</span>.written += written;
+                    <span class="self">self</span>.align_buffer.clear();
+                    <span class="comment">// It&#39;s possible that the buffer is already aligned, no bytes has been consumed.
+                    </span><span class="kw">if </span>consume != <span class="number">0 </span>{
+                        <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(consume));
+                    }
+                }
+                State::Complete(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Complete during poll_write&quot;</span>)
+                }
+                State::Abort(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Abort during poll_write&quot;</span>)
+                }
+            }
+        }
+    }
+
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().unwrap();
+                    <span class="kw">match </span><span class="self">self</span>.location.clone() {
+                        <span class="prelude-val">Some</span>(location) =&gt; {
+                            <span class="kw">let </span>align_buffer = <span class="self">self</span>.align_buffer.clone();
+
+                            <span class="kw">let </span>written = <span class="self">self</span>.written;
+                            <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                                <span class="kw">let </span>size = align_buffer.len() <span class="kw">as </span>u64;
+                                <span class="kw">let </span>res = w
+                                    .complete_range(
+                                        <span class="kw-2">&amp;</span>location,
+                                        written,
+                                        size,
+                                        AsyncBody::Stream(Box::new(align_buffer)),
+                                    )
+                                    .<span class="kw">await</span>;
+
+                                (w, res)
+                            };
+                            <span class="self">self</span>.state = State::Complete(Box::pin(fut));
+                        }
+                        <span class="prelude-val">None </span>=&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(())),
+                    }
+                }
+                State::Init(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Init during poll_close&quot;</span>)
+                }
+                State::Write(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Write during poll_close&quot;</span>)
+                }
+                State::Complete(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="self">self</span>.align_buffer.clear();
+                    <span class="kw">return </span>Poll::Ready(res);
+                }
+                State::Abort(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Abort during poll_close&quot;</span>)
+                }
+            }
+        }
+    }
+
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(w) =&gt; {
+                    <span class="kw">let </span>w = w.take().unwrap();
+                    <span class="kw">match </span><span class="self">self</span>.location.clone() {
+                        <span class="prelude-val">Some</span>(location) =&gt; {
+                            <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                                <span class="kw">let </span>res = w.abort_range(<span class="kw-2">&amp;</span>location).<span class="kw">await</span>;
+
+                                (w, res)
+                            };
+                            <span class="self">self</span>.state = State::Abort(Box::pin(fut));
+                        }
+                        <span class="prelude-val">None </span>=&gt; <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(())),
+                    }
+                }
+                State::Init(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Init during poll_close&quot;</span>)
+                }
+                State::Write(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Write during poll_close&quot;</span>)
+                }
+                State::Complete(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;RangeWriter must not go into State::Complete during poll_close&quot;</span>)
+                }
+                State::Abort(fut) =&gt; {
+                    <span class="kw">let </span>(w, res) = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(w));
+                    <span class="self">self</span>.align_buffer.clear();
+                    <span class="kw">return </span>Poll::Ready(res);
+                }
+            }
+        }
+    }
+}
+</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/azblob/backend.rs.html b/docs/rust/src/opendal/services/azblob/backend.rs.html
index d76f96573..dddb0a9c1 100644
--- a/docs/rust/src/opendal/services/azblob/backend.rs.html
+++ b/docs/rust/src/opendal/services/azblob/backend.rs.html
@@ -920,6 +920,11 @@
 <a href="#920" id="920">920</a>
 <a href="#921" id="921">921</a>
 <a href="#922" id="922">922</a>
+<a href="#923" id="923">923</a>
+<a href="#924" id="924">924</a>
+<a href="#925" id="925">925</a>
+<a href="#926" id="926">926</a>
+<a href="#927" id="927">927</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -960,6 +965,7 @@
 <span class="kw">use </span><span class="kw">super</span>::writer::AzblobWriter;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use </span><span class="kw">crate</span>::services::azblob::core::AzblobCore;
+<span class="kw">use </span><span class="kw">crate</span>::services::azblob::writer::AzblobWriters;
 <span class="kw">use </span><span class="kw">crate</span>::types::Metadata;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
@@ -1428,7 +1434,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>AzblobBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = AzblobWriter;
+    <span class="kw">type </span>Writer = AzblobWriters;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = AzblobPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -1523,10 +1529,14 @@
     }
 
     <span class="kw">async fn </span>write(<span class="kw-2">&amp;</span><span class="self">self</span>, path: <span class="kw-2">&amp;</span>str, args: OpWrite) -&gt; <span class="prelude-ty">Result</span>&lt;(RpWrite, <span class="self">Self</span>::Writer)&gt; {
-        <span class="prelude-val">Ok</span>((
-            RpWrite::default(),
-            AzblobWriter::new(<span class="self">self</span>.core.clone(), args, path.to_string()),
-        ))
+        <span class="kw">let </span>w = AzblobWriter::new(<span class="self">self</span>.core.clone(), args.clone(), path.to_string());
+        <span class="kw">let </span>w = <span class="kw">if </span>args.append() {
+            AzblobWriters::Two(oio::AppendObjectWriter::new(w))
+        } <span class="kw">else </span>{
+            AzblobWriters::One(oio::OneShotWriter::new(w))
+        };
+
+        <span class="prelude-val">Ok</span>((RpWrite::default(), w))
     }
 
     <span class="kw">async fn </span>copy(<span class="kw-2">&amp;</span><span class="self">self</span>, from: <span class="kw-2">&amp;</span>str, to: <span class="kw-2">&amp;</span>str, _args: OpCopy) -&gt; <span class="prelude-ty">Result</span>&lt;RpCopy&gt; {
diff --git a/docs/rust/src/opendal/services/azblob/core.rs.html b/docs/rust/src/opendal/services/azblob/core.rs.html
index 828d95d4e..786e7f3a7 100644
--- a/docs/rust/src/opendal/services/azblob/core.rs.html
+++ b/docs/rust/src/opendal/services/azblob/core.rs.html
@@ -550,17 +550,6 @@
 <a href="#550" id="550">550</a>
 <a href="#551" id="551">551</a>
 <a href="#552" id="552">552</a>
-<a href="#553" id="553">553</a>
-<a href="#554" id="554">554</a>
-<a href="#555" id="555">555</a>
-<a href="#556" id="556">556</a>
-<a href="#557" id="557">557</a>
-<a href="#558" id="558">558</a>
-<a href="#559" id="559">559</a>
-<a href="#560" id="560">560</a>
-<a href="#561" id="561">561</a>
-<a href="#562" id="562">562</a>
-<a href="#563" id="563">563</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -915,12 +904,6 @@
     ///
     /// - The maximum size of the content could be appended is 4MB.
     /// - `Append Block` succeeds only if the blob already exists.
-    /// - It does not need to provide append position.
-    /// - But it could use append position to verify the content is appended to the right position.
-    ///
-    /// Since the `appendpos` only returned by the append operation response,
-    /// we could not use it when we want to append content to the blob first time.
-    /// (The first time of the appender, not the blob)
     ///
     /// # Reference
     ///
@@ -928,8 +911,8 @@
     </span><span class="kw">pub fn </span>azblob_append_blob_request(
         <span class="kw-2">&amp;</span><span class="self">self</span>,
         path: <span class="kw-2">&amp;</span>str,
+        position: u64,
         size: u64,
-        position: <span class="prelude-ty">Option</span>&lt;u64&gt;,
         body: AsyncBody,
     ) -&gt; <span class="prelude-ty">Result</span>&lt;Request&lt;AsyncBody&gt;&gt; {
         <span class="kw">let </span>p = build_abs_path(<span class="kw-2">&amp;</span><span class="self">self</span>.root, path);
@@ -948,12 +931,7 @@
 
         req = req.header(CONTENT_LENGTH, size);
 
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(pos) = position {
-            req = req.header(
-                HeaderName::from_static(constants::X_MS_BLOB_CONDITION_APPENDPOS),
-                pos.to_string(),
-            );
-        }
+        req = req.header(constants::X_MS_BLOB_CONDITION_APPENDPOS, position);
 
         <span class="kw">let </span>req = req.body(body).map_err(new_request_build_error)<span class="question-mark">?</span>;
 
diff --git a/docs/rust/src/opendal/services/azblob/writer.rs.html b/docs/rust/src/opendal/services/azblob/writer.rs.html
index a61c18ac1..e50497456 100644
--- a/docs/rust/src/opendal/services/azblob/writer.rs.html
+++ b/docs/rust/src/opendal/services/azblob/writer.rs.html
@@ -139,56 +139,6 @@
 <a href="#139" id="139">139</a>
 <a href="#140" id="140">140</a>
 <a href="#141" id="141">141</a>
-<a href="#142" id="142">142</a>
-<a href="#143" id="143">143</a>
-<a href="#144" id="144">144</a>
-<a href="#145" id="145">145</a>
-<a href="#146" id="146">146</a>
-<a href="#147" id="147">147</a>
-<a href="#148" id="148">148</a>
-<a href="#149" id="149">149</a>
-<a href="#150" id="150">150</a>
-<a href="#151" id="151">151</a>
-<a href="#152" id="152">152</a>
-<a href="#153" id="153">153</a>
-<a href="#154" id="154">154</a>
-<a href="#155" id="155">155</a>
-<a href="#156" id="156">156</a>
-<a href="#157" id="157">157</a>
-<a href="#158" id="158">158</a>
-<a href="#159" id="159">159</a>
-<a href="#160" id="160">160</a>
-<a href="#161" id="161">161</a>
-<a href="#162" id="162">162</a>
-<a href="#163" id="163">163</a>
-<a href="#164" id="164">164</a>
-<a href="#165" id="165">165</a>
-<a href="#166" id="166">166</a>
-<a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
-<a href="#170" id="170">170</a>
-<a href="#171" id="171">171</a>
-<a href="#172" id="172">172</a>
-<a href="#173" id="173">173</a>
-<a href="#174" id="174">174</a>
-<a href="#175" id="175">175</a>
-<a href="#176" id="176">176</a>
-<a href="#177" id="177">177</a>
-<a href="#178" id="178">178</a>
-<a href="#179" id="179">179</a>
-<a href="#180" id="180">180</a>
-<a href="#181" id="181">181</a>
-<a href="#182" id="182">182</a>
-<a href="#183" id="183">183</a>
-<a href="#184" id="184">184</a>
-<a href="#185" id="185">185</a>
-<a href="#186" id="186">186</a>
-<a href="#187" id="187">187</a>
-<a href="#188" id="188">188</a>
-<a href="#189" id="189">189</a>
-<a href="#190" id="190">190</a>
-<a href="#191" id="191">191</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -209,6 +159,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::AzblobCore;
@@ -217,34 +168,32 @@
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="kw">const </span>X_MS_BLOB_TYPE: <span class="kw-2">&amp;</span>str = <span class="string">&quot;x-ms-blob-type&quot;</span>;
-<span class="kw">const </span>X_MS_BLOB_APPEND_OFFSET: <span class="kw-2">&amp;</span>str = <span class="string">&quot;x-ms-blob-append-offset&quot;</span>;
+
+<span class="kw">pub type </span>AzblobWriters =
+    oio::TwoWaysWriter&lt;oio::OneShotWriter&lt;AzblobWriter&gt;, oio::AppendObjectWriter&lt;AzblobWriter&gt;&gt;;
 
 <span class="kw">pub struct </span>AzblobWriter {
     core: Arc&lt;AzblobCore&gt;,
 
     op: OpWrite,
     path: String,
-
-    position: <span class="prelude-ty">Option</span>&lt;u64&gt;,
 }
 
 <span class="kw">impl </span>AzblobWriter {
     <span class="kw">pub fn </span>new(core: Arc&lt;AzblobCore&gt;, op: OpWrite, path: String) -&gt; <span class="self">Self </span>{
-        AzblobWriter {
-            core,
-            op,
-            path,
-            position: <span class="prelude-val">None</span>,
-        }
+        AzblobWriter { core, op, path }
     }
+}
 
-    <span class="kw">async fn </span>write_oneshot(<span class="kw-2">&amp;</span><span class="self">self</span>, size: u64, body: AsyncBody) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+<span class="attr">#[async_trait]
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>AzblobWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.azblob_put_blob_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
-            <span class="prelude-val">Some</span>(size),
+            <span class="prelude-val">Some</span>(bs.len() <span class="kw">as </span>u64),
             <span class="self">self</span>.op.content_type(),
             <span class="self">self</span>.op.cache_control(),
-            body,
+            AsyncBody::Bytes(bs),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
@@ -261,14 +210,12 @@
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
+}
 
-    <span class="kw">async fn </span>current_position(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="prelude-ty">Option</span>&lt;u64&gt;&gt; {
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = <span class="self">self</span>.position {
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(v));
-        }
-
-        <span class="comment">// TODO: we should check with current etag to make sure file not changed.
-        </span><span class="kw">let </span>resp = <span class="self">self
+<span class="attr">#[async_trait]
+</span><span class="kw">impl </span>oio::AppendObjectWrite <span class="kw">for </span>AzblobWriter {
+    <span class="kw">async fn </span>offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;u64&gt; {
+        <span class="kw">let </span>resp = <span class="self">self
             </span>.core
             .azblob_get_blob_properties(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>)
             .<span class="kw">await</span><span class="question-mark">?</span>;
@@ -276,10 +223,7 @@
         <span class="kw">let </span>status = resp.status();
 
         <span class="kw">match </span>status {
-            <span class="comment">// Just check the blob type.
-            // If it is not an appendable blob, return an error.
-            // We can not get the append position of the blob here.
-            </span>StatusCode::OK =&gt; {
+            StatusCode::OK =&gt; {
                 <span class="kw">let </span>headers = resp.headers();
                 <span class="kw">let </span>blob_type = headers.get(X_MS_BLOB_TYPE).and_then(|v| v.to_str().ok());
                 <span class="kw">if </span>blob_type != <span class="prelude-val">Some</span>(<span class="string">&quot;AppendBlob&quot;</span>) {
@@ -288,10 +232,10 @@
                         <span class="string">&quot;the blob is not an appendable blob.&quot;</span>,
                     ));
                 }
-                <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
+
+                <span class="prelude-val">Ok</span>(parse_content_length(headers)<span class="question-mark">?</span>.unwrap_or_default())
             }
-            <span class="comment">// If the blob is not existing, we need to create one.
-            </span>StatusCode::NOT_FOUND =&gt; {
+            StatusCode::NOT_FOUND =&gt; {
                 <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.azblob_init_appendable_blob_request(
                     <span class="kw-2">&amp;</span><span class="self">self</span>.path,
                     <span class="self">self</span>.op.content_type(),
@@ -311,20 +255,16 @@
                         <span class="kw">return </span><span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>);
                     }
                 }
-
-                <span class="self">self</span>.position = <span class="prelude-val">Some</span>(<span class="number">0</span>);
-                <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(<span class="number">0</span>))
+                <span class="prelude-val">Ok</span>(<span class="number">0</span>)
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
 
-    <span class="kw">async fn </span>append_oneshot(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, body: AsyncBody) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let _ </span>= <span class="self">self</span>.current_position().<span class="kw">await</span><span class="question-mark">?</span>;
-
-        <span class="kw">let </span><span class="kw-2">mut </span>req =
-            <span class="self">self</span>.core
-                .azblob_append_blob_request(<span class="kw-2">&amp;</span><span class="self">self</span>.path, size, <span class="self">self</span>.position, body)<span class="question-mark">?</span>;
+    <span class="kw">async fn </span>append(<span class="kw-2">&amp;</span><span class="self">self</span>, offset: u64, size: u64, body: AsyncBody) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self
+            </span>.core
+            .azblob_append_blob_request(<span class="kw-2">&amp;</span><span class="self">self</span>.path, offset, size, body)<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
 
@@ -333,51 +273,11 @@
         <span class="kw">let </span>status = resp.status();
         <span class="kw">match </span>status {
             StatusCode::CREATED =&gt; {
-                <span class="kw">let </span>headers = resp.headers();
-                <span class="kw">let </span>position = headers
-                    .get(X_MS_BLOB_APPEND_OFFSET)
-                    .and_then(|v| v.to_str().ok())
-                    .and_then(|v| v.parse::&lt;u64&gt;().ok());
-                <span class="self">self</span>.position = position.map(|v| v + size);
-            }
-            <span class="kw">_ </span>=&gt; {
-                <span class="kw">return </span><span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>);
-            }
-        }
-
-        <span class="prelude-val">Ok</span>(())
-    }
-}
-
-<span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>AzblobWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-
-        <span class="kw">if </span><span class="self">self</span>.op.append() {
-            <span class="self">self</span>.append_oneshot(size <span class="kw">as </span>u64, AsyncBody::Bytes(bs.copy_to_bytes(size)))
-                .<span class="kw">await</span><span class="question-mark">?</span>;
-        } <span class="kw">else </span>{
-            <span class="kw">if </span><span class="self">self</span>.op.content_length().is_none() {
-                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-                    ErrorKind::Unsupported,
-                    <span class="string">&quot;write without content length is not supported&quot;</span>,
-                ));
+                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
+                <span class="prelude-val">Ok</span>(())
             }
-
-            <span class="self">self</span>.write_oneshot(size <span class="kw">as </span>u64, AsyncBody::Bytes(bs.copy_to_bytes(size)))
-                .<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
-
-        <span class="prelude-val">Ok</span>(size)
-    }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/azdfs/backend.rs.html b/docs/rust/src/opendal/services/azdfs/backend.rs.html
index 560bc0ac0..90af3c45e 100644
--- a/docs/rust/src/opendal/services/azdfs/backend.rs.html
+++ b/docs/rust/src/opendal/services/azdfs/backend.rs.html
@@ -688,7 +688,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>AzdfsBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = AzdfsWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;AzdfsWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = AzdfsPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -763,7 +763,7 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            AzdfsWriter::new(<span class="self">self</span>.core.clone(), args, path.to_string()),
+            oio::OneShotWriter::new(AzdfsWriter::new(<span class="self">self</span>.core.clone(), args, path.to_string())),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/azdfs/writer.rs.html b/docs/rust/src/opendal/services/azdfs/writer.rs.html
index 4d52daaf7..18150332f 100644
--- a/docs/rust/src/opendal/services/azdfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/azdfs/writer.rs.html
@@ -88,15 +88,6 @@
 <a href="#88" id="88">88</a>
 <a href="#89" id="89">89</a>
 <a href="#90" id="90">90</a>
-<a href="#91" id="91">91</a>
-<a href="#92" id="92">92</a>
-<a href="#93" id="93">93</a>
-<a href="#94" id="94">94</a>
-<a href="#95" id="95">95</a>
-<a href="#96" id="96">96</a>
-<a href="#97" id="97">97</a>
-<a href="#98" id="98">98</a>
-<a href="#99" id="99">99</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -117,6 +108,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::AzdfsCore;
@@ -138,8 +130,8 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>AzdfsWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>AzdfsWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.azdfs_create_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
             <span class="string">&quot;file&quot;</span>,
@@ -164,13 +156,11 @@
             }
         }
 
-        <span class="kw">let </span>size = bs.remaining();
+        <span class="kw">let </span>size = bs.len();
 
-        <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.azdfs_update_request(
-            <span class="kw-2">&amp;</span><span class="self">self</span>.path,
-            <span class="prelude-val">Some</span>(size),
-            AsyncBody::Bytes(bs.copy_to_bytes(size)),
-        )<span class="question-mark">?</span>;
+        <span class="kw">let </span><span class="kw-2">mut </span>req =
+            <span class="self">self</span>.core
+                .azdfs_update_request(<span class="kw-2">&amp;</span><span class="self">self</span>.path, <span class="prelude-val">Some</span>(size), AsyncBody::Bytes(bs))<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
 
@@ -180,20 +170,12 @@
         <span class="kw">match </span>status {
             StatusCode::OK | StatusCode::ACCEPTED =&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="prelude-val">Ok</span>(size)
+                <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp)
                 .<span class="kw">await</span><span class="question-mark">?
                 </span>.with_operation(<span class="string">&quot;Backend::azdfs_update_request&quot;</span>)),
         }
     }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/cos/writer.rs.html b/docs/rust/src/opendal/services/cos/writer.rs.html
index 2a056c560..39cab0aea 100644
--- a/docs/rust/src/opendal/services/cos/writer.rs.html
+++ b/docs/rust/src/opendal/services/cos/writer.rs.html
@@ -227,6 +227,7 @@
 <a href="#227" id="227">227</a>
 <a href="#228" id="228">228</a>
 <a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -247,6 +248,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
@@ -279,15 +281,15 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>CosWriter {
-    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>size = buf.remaining();
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, buf: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = buf.len();
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.cos_put_object_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
             <span class="prelude-val">Some</span>(size <span class="kw">as </span>u64),
             <span class="self">self</span>.op.content_type(),
             <span class="self">self</span>.op.content_disposition(),
             <span class="self">self</span>.op.cache_control(),
-            AsyncBody::Bytes(buf.copy_to_bytes(size)),
+            AsyncBody::Bytes(buf),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
diff --git a/docs/rust/src/opendal/services/dropbox/backend.rs.html b/docs/rust/src/opendal/services/dropbox/backend.rs.html
index 3fee077d0..e2d0ada3b 100644
--- a/docs/rust/src/opendal/services/dropbox/backend.rs.html
+++ b/docs/rust/src/opendal/services/dropbox/backend.rs.html
@@ -303,6 +303,10 @@
 <a href="#303" id="303">303</a>
 <a href="#304" id="304">304</a>
 <a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -354,7 +358,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>DropboxBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = DropboxWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;DropboxWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = ();
     <span class="kw">type </span>BlockingPager = ();
@@ -419,7 +423,11 @@
         }
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            DropboxWriter::new(<span class="self">self</span>.core.clone(), args, String::from(path)),
+            oio::OneShotWriter::new(DropboxWriter::new(
+                <span class="self">self</span>.core.clone(),
+                args,
+                String::from(path),
+            )),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/dropbox/writer.rs.html b/docs/rust/src/opendal/services/dropbox/writer.rs.html
index 885a0da55..b88ded0be 100644
--- a/docs/rust/src/opendal/services/dropbox/writer.rs.html
+++ b/docs/rust/src/opendal/services/dropbox/writer.rs.html
@@ -62,13 +62,6 @@
 <a href="#62" id="62">62</a>
 <a href="#63" id="63">63</a>
 <a href="#64" id="64">64</a>
-<a href="#65" id="65">65</a>
-<a href="#66" id="66">66</a>
-<a href="#67" id="67">67</a>
-<a href="#68" id="68">68</a>
-<a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -89,6 +82,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::DropboxCore;
@@ -109,9 +103,9 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>DropboxWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>DropboxWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
 
         <span class="kw">let </span>resp = <span class="self">self
             </span>.core
@@ -119,25 +113,17 @@
                 <span class="kw-2">&amp;</span><span class="self">self</span>.path,
                 <span class="prelude-val">Some</span>(size),
                 <span class="self">self</span>.op.content_type(),
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
+                AsyncBody::Bytes(bs),
             )
             .<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="kw">let </span>status = resp.status();
         <span class="kw">match </span>status {
             StatusCode::OK =&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="prelude-val">Ok</span>(size)
+                <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/fs/writer.rs.html b/docs/rust/src/opendal/services/fs/writer.rs.html
index 0756de938..2ac95809c 100644
--- a/docs/rust/src/opendal/services/fs/writer.rs.html
+++ b/docs/rust/src/opendal/services/fs/writer.rs.html
@@ -82,6 +82,59 @@
 <a href="#82" id="82">82</a>
 <a href="#83" id="83">83</a>
 <a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -101,9 +154,15 @@
 
 </span><span class="kw">use </span>std::io::Write;
 <span class="kw">use </span>std::path::PathBuf;
+<span class="kw">use </span>std::pin::Pin;
+<span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
-<span class="kw">use </span>tokio::io::AsyncWriteExt;
+<span class="kw">use </span>futures::future::BoxFuture;
+<span class="kw">use </span>futures::FutureExt;
+<span class="kw">use </span>tokio::io::AsyncWrite;
 
 <span class="kw">use </span><span class="kw">super</span>::error::parse_io_error;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -112,7 +171,9 @@
 <span class="kw">pub struct </span>FsWriter&lt;F&gt; {
     target_path: PathBuf,
     tmp_path: <span class="prelude-ty">Option</span>&lt;PathBuf&gt;,
-    f: F,
+
+    f: <span class="prelude-ty">Option</span>&lt;F&gt;,
+    fut: <span class="prelude-ty">Option</span>&lt;BoxFuture&lt;<span class="lifetime">&#39;static</span>, <span class="prelude-ty">Result</span>&lt;()&gt;&gt;&gt;,
 }
 
 <span class="kw">impl</span>&lt;F&gt; FsWriter&lt;F&gt; {
@@ -120,47 +181,92 @@
         <span class="self">Self </span>{
             target_path,
             tmp_path,
-            f,
+            f: <span class="prelude-val">Some</span>(f),
+            fut: <span class="prelude-val">None</span>,
         }
     }
 }
 
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for FsWriter.
+</span><span class="kw">unsafe impl</span>&lt;F&gt; Sync <span class="kw">for </span>FsWriter&lt;F&gt; {}
+
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>FsWriter&lt;tokio::fs::File&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.f.write(bs.chunk()).<span class="kw">await</span>.map_err(parse_io_error)
-    }
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">let </span>f = <span class="self">self</span>.f.as_mut().expect(<span class="string">&quot;FsWriter must be initialized&quot;</span>);
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">&quot;output writer doesn&#39;t support abort&quot;</span>,
-        ))
+        Pin::new(f)
+            .poll_write(cx, bs.chunk())
+            .map_err(parse_io_error)
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.f.sync_all().<span class="kw">await</span>.map_err(parse_io_error)<span class="question-mark">?</span>;
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">if let </span><span class="prelude-val">Some</span>(fut) = <span class="self">self</span>.fut.as_mut() {
+                <span class="kw">let </span>res = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                <span class="self">self</span>.fut = <span class="prelude-val">None</span>;
+                <span class="kw">return </span>Poll::Ready(res);
+            }
+
+            <span class="kw">let </span>f = <span class="self">self</span>.f.take().expect(<span class="string">&quot;FsWriter must be initialized&quot;</span>);
+            <span class="kw">let </span>tmp_path = <span class="self">self</span>.tmp_path.clone();
+            <span class="kw">let </span>target_path = <span class="self">self</span>.target_path.clone();
+            <span class="self">self</span>.fut = <span class="prelude-val">Some</span>(Box::pin(<span class="kw">async move </span>{
+                f.sync_all().<span class="kw">await</span>.map_err(parse_io_error)<span class="question-mark">?</span>;
+
+                <span class="kw">if let </span><span class="prelude-val">Some</span>(tmp_path) = <span class="kw-2">&amp;</span>tmp_path {
+                    tokio::fs::rename(tmp_path, <span class="kw-2">&amp;</span>target_path)
+                        .<span class="kw">await
+                        </span>.map_err(parse_io_error)<span class="question-mark">?</span>;
+                }
 
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(tmp_path) = <span class="kw-2">&amp;</span><span class="self">self</span>.tmp_path {
-            tokio::fs::rename(tmp_path, <span class="kw-2">&amp;</span><span class="self">self</span>.target_path)
-                .<span class="kw">await
-                </span>.map_err(parse_io_error)<span class="question-mark">?</span>;
+                <span class="prelude-val">Ok</span>(())
+            }));
         }
+    }
 
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">if let </span><span class="prelude-val">Some</span>(fut) = <span class="self">self</span>.fut.as_mut() {
+                <span class="kw">let </span>res = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                <span class="self">self</span>.fut = <span class="prelude-val">None</span>;
+                <span class="kw">return </span>Poll::Ready(res);
+            }
+
+            <span class="kw">let _ </span>= <span class="self">self</span>.f.take().expect(<span class="string">&quot;FsWriter must be initialized&quot;</span>);
+            <span class="kw">let </span>tmp_path = <span class="self">self</span>.tmp_path.clone();
+            <span class="self">self</span>.fut = <span class="prelude-val">Some</span>(Box::pin(<span class="kw">async move </span>{
+                <span class="kw">if let </span><span class="prelude-val">Some</span>(tmp_path) = <span class="kw-2">&amp;</span>tmp_path {
+                    tokio::fs::remove_file(tmp_path)
+                        .<span class="kw">await
+                        </span>.map_err(parse_io_error)
+                } <span class="kw">else </span>{
+                    <span class="prelude-val">Err</span>(Error::new(
+                        ErrorKind::Unsupported,
+                        <span class="string">&quot;Fs doesn&#39;t support abort if atomic_write_dir is not set&quot;</span>,
+                    ))
+                }
+            }));
+        }
     }
 }
 
 <span class="kw">impl </span>oio::BlockingWrite <span class="kw">for </span>FsWriter&lt;std::fs::File&gt; {
     <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.f.write(bs.chunk()).map_err(parse_io_error)
+        <span class="kw">let </span>f = <span class="self">self</span>.f.as_mut().expect(<span class="string">&quot;FsWriter must be initialized&quot;</span>);
+
+        f.write(bs.chunk()).map_err(parse_io_error)
     }
 
     <span class="kw">fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.f.sync_all().map_err(parse_io_error)<span class="question-mark">?</span>;
+        <span class="kw">if let </span><span class="prelude-val">Some</span>(f) = <span class="self">self</span>.f.take() {
+            f.sync_all().map_err(parse_io_error)<span class="question-mark">?</span>;
 
-        <span class="kw">if let </span><span class="prelude-val">Some</span>(tmp_path) = <span class="kw-2">&amp;</span><span class="self">self</span>.tmp_path {
-            std::fs::rename(tmp_path, <span class="kw-2">&amp;</span><span class="self">self</span>.target_path).map_err(parse_io_error)<span class="question-mark">?</span>;
+            <span class="kw">if let </span><span class="prelude-val">Some</span>(tmp_path) = <span class="kw-2">&amp;</span><span class="self">self</span>.tmp_path {
+                std::fs::rename(tmp_path, <span class="kw-2">&amp;</span><span class="self">self</span>.target_path).map_err(parse_io_error)<span class="question-mark">?</span>;
+            }
         }
 
         <span class="prelude-val">Ok</span>(())
diff --git a/docs/rust/src/opendal/services/ftp/writer.rs.html b/docs/rust/src/opendal/services/ftp/writer.rs.html
index 07ed86a1a..8d451eef8 100644
--- a/docs/rust/src/opendal/services/ftp/writer.rs.html
+++ b/docs/rust/src/opendal/services/ftp/writer.rs.html
@@ -63,6 +63,35 @@
 <a href="#63" id="63">63</a>
 <a href="#64" id="64">64</a>
 <a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -80,8 +109,14 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
 <span class="kw">use </span>futures::AsyncWriteExt;
+<span class="kw">use </span>futures::FutureExt;
 
 <span class="kw">use </span><span class="kw">super</span>::backend::FtpBackend;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -90,42 +125,65 @@
 <span class="kw">pub struct </span>FtpWriter {
     backend: FtpBackend,
     path: String,
+
+    fut: <span class="prelude-ty">Option</span>&lt;BoxFuture&lt;<span class="lifetime">&#39;static</span>, <span class="prelude-ty">Result</span>&lt;usize&gt;&gt;&gt;,
 }
 
 <span class="doccomment">/// # TODO
 ///
 /// Writer is not implemented correctly.
 ///
-/// After we can use datastream, we should return it directly.
+/// After we can use data stream, we should return it directly.
 </span><span class="kw">impl </span>FtpWriter {
     <span class="kw">pub fn </span>new(backend: FtpBackend, path: String) -&gt; <span class="self">Self </span>{
-        FtpWriter { backend, path }
+        FtpWriter {
+            backend,
+            path,
+            fut: <span class="prelude-val">None</span>,
+        }
     }
 }
 
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for FtpWriter.
+</span><span class="kw">unsafe impl </span>Sync <span class="kw">for </span>FtpWriter {}
+
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>FtpWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-        <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">if let </span><span class="prelude-val">Some</span>(fut) = <span class="self">self</span>.fut.as_mut() {
+                <span class="kw">let </span>res = <span class="macro">ready!</span>(fut.poll_unpin(cx));
+                <span class="self">self</span>.fut = <span class="prelude-val">None</span>;
+                <span class="kw">return </span>Poll::Ready(res);
+            }
 
-        <span class="kw">let </span><span class="kw-2">mut </span>ftp_stream = <span class="self">self</span>.backend.ftp_connect(Operation::Write).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="kw">let </span><span class="kw-2">mut </span>data_stream = ftp_stream.append_with_stream(<span class="kw-2">&amp;</span><span class="self">self</span>.path).<span class="kw">await</span><span class="question-mark">?</span>;
-        data_stream.write_all(<span class="kw-2">&amp;</span>bs).<span class="kw">await</span>.map_err(|err| {
-            Error::new(ErrorKind::Unexpected, <span class="string">&quot;copy from ftp stream&quot;</span>).set_source(err)
-        })<span class="question-mark">?</span>;
+            <span class="kw">let </span>size = bs.remaining();
+            <span class="kw">let </span>bs = bs.copy_to_bytes(size);
 
-        ftp_stream.finalize_put_stream(data_stream).<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="kw">let </span>path = <span class="self">self</span>.path.clone();
+            <span class="kw">let </span>backend = <span class="self">self</span>.backend.clone();
+            <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                <span class="kw">let </span><span class="kw-2">mut </span>ftp_stream = backend.ftp_connect(Operation::Write).<span class="kw">await</span><span class="question-mark">?</span>;
+                <span class="kw">let </span><span class="kw-2">mut </span>data_stream = ftp_stream.append_with_stream(<span class="kw-2">&amp;</span>path).<span class="kw">await</span><span class="question-mark">?</span>;
+                data_stream.write_all(<span class="kw-2">&amp;</span>bs).<span class="kw">await</span>.map_err(|err| {
+                    Error::new(ErrorKind::Unexpected, <span class="string">&quot;copy from ftp stream&quot;</span>).set_source(err)
+                })<span class="question-mark">?</span>;
 
-        <span class="prelude-val">Ok</span>(size)
+                ftp_stream.finalize_put_stream(data_stream).<span class="kw">await</span><span class="question-mark">?</span>;
+                <span class="prelude-val">Ok</span>(size)
+            };
+            <span class="self">self</span>.fut = <span class="prelude-val">Some</span>(Box::pin(fut));
+        }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/gcs/backend.rs.html b/docs/rust/src/opendal/services/gcs/backend.rs.html
index 1f2ba460c..eaf874269 100644
--- a/docs/rust/src/opendal/services/gcs/backend.rs.html
+++ b/docs/rust/src/opendal/services/gcs/backend.rs.html
@@ -659,6 +659,11 @@
 <a href="#659" id="659">659</a>
 <a href="#660" id="660">660</a>
 <a href="#661" id="661">661</a>
+<a href="#662" id="662">662</a>
+<a href="#663" id="663">663</a>
+<a href="#664" id="664">664</a>
+<a href="#665" id="665">665</a>
+<a href="#666" id="666">666</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -696,6 +701,7 @@
 <span class="kw">use </span><span class="kw">super</span>::pager::GcsPager;
 <span class="kw">use </span><span class="kw">super</span>::writer::GcsWriter;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use </span><span class="kw">crate</span>::services::gcs::writer::GcsWriters;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="kw">const </span>DEFAULT_GCS_ENDPOINT: <span class="kw-2">&amp;</span>str = <span class="string">&quot;https://storage.googleapis.com&quot;</span>;
@@ -997,7 +1003,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>GcsBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = GcsWriter;
+    <span class="kw">type </span>Writer = GcsWriters;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = GcsPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -1079,10 +1085,14 @@
     }
 
     <span class="kw">async fn </span>write(<span class="kw-2">&amp;</span><span class="self">self</span>, path: <span class="kw-2">&amp;</span>str, args: OpWrite) -&gt; <span class="prelude-ty">Result</span>&lt;(RpWrite, <span class="self">Self</span>::Writer)&gt; {
-        <span class="prelude-val">Ok</span>((
-            RpWrite::default(),
-            GcsWriter::new(<span class="self">self</span>.core.clone(), path, args),
-        ))
+        <span class="kw">let </span>w = GcsWriter::new(<span class="self">self</span>.core.clone(), path, args.clone());
+        <span class="kw">let </span>w = <span class="kw">if </span>args.content_length().is_some() {
+            GcsWriters::One(oio::OneShotWriter::new(w))
+        } <span class="kw">else </span>{
+            GcsWriters::Two(oio::RangeWriter::new(w))
+        };
+
+        <span class="prelude-val">Ok</span>((RpWrite::default(), w))
     }
 
     <span class="kw">async fn </span>copy(<span class="kw-2">&amp;</span><span class="self">self</span>, from: <span class="kw-2">&amp;</span>str, to: <span class="kw-2">&amp;</span>str, <span class="kw">_</span>: OpCopy) -&gt; <span class="prelude-ty">Result</span>&lt;RpCopy&gt; {
diff --git a/docs/rust/src/opendal/services/gcs/core.rs.html b/docs/rust/src/opendal/services/gcs/core.rs.html
index ee0a8dd4d..ed4edbce1 100644
--- a/docs/rust/src/opendal/services/gcs/core.rs.html
+++ b/docs/rust/src/opendal/services/gcs/core.rs.html
@@ -613,17 +613,6 @@
 <a href="#613" id="613">613</a>
 <a href="#614" id="614">614</a>
 <a href="#615" id="615">615</a>
-<a href="#616" id="616">616</a>
-<a href="#617" id="617">617</a>
-<a href="#618" id="618">618</a>
-<a href="#619" id="619">619</a>
-<a href="#620" id="620">620</a>
-<a href="#621" id="621">621</a>
-<a href="#622" id="622">622</a>
-<a href="#623" id="623">623</a>
-<a href="#624" id="624">624</a>
-<a href="#625" id="625">625</a>
-<a href="#626" id="626">626</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -649,7 +638,6 @@
 
 <span class="kw">use </span>backon::ExponentialBuilder;
 <span class="kw">use </span>backon::Retryable;
-<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::header::CONTENT_LENGTH;
 <span class="kw">use </span>http::header::CONTENT_RANGE;
 <span class="kw">use </span>http::header::CONTENT_TYPE;
@@ -1184,21 +1172,11 @@
         location: <span class="kw-2">&amp;</span>str,
         size: u64,
         written: u64,
-        is_last_part: bool,
         body: AsyncBody,
     ) -&gt; <span class="prelude-ty">Result</span>&lt;Request&lt;AsyncBody&gt;&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>req = Request::put(location);
 
-        <span class="kw">let </span>range_header = <span class="kw">if </span>is_last_part {
-            <span class="macro">format!</span>(
-                <span class="string">&quot;bytes {}-{}/{}&quot;</span>,
-                written,
-                written + size - <span class="number">1</span>,
-                written + size
-            )
-        } <span class="kw">else </span>{
-            <span class="macro">format!</span>(<span class="string">&quot;bytes {}-{}/*&quot;</span>, written, written + size - <span class="number">1</span>)
-        };
+        <span class="kw">let </span>range_header = <span class="macro">format!</span>(<span class="string">&quot;bytes {}-{}/*&quot;</span>, written, written + size - <span class="number">1</span>);
 
         req = req
             .header(CONTENT_LENGTH, size)
@@ -1213,22 +1191,22 @@
     <span class="kw">pub async fn </span>gcs_complete_resumable_upload(
         <span class="kw-2">&amp;</span><span class="self">self</span>,
         location: <span class="kw-2">&amp;</span>str,
-        written_bytes: u64,
-        bs: Bytes,
+        written: u64,
+        size: u64,
+        body: AsyncBody,
     ) -&gt; <span class="prelude-ty">Result</span>&lt;Response&lt;IncomingAsyncBody&gt;&gt; {
-        <span class="kw">let </span>size = bs.len() <span class="kw">as </span>u64;
         <span class="kw">let </span><span class="kw-2">mut </span>req = Request::post(location)
             .header(CONTENT_LENGTH, size)
             .header(
                 CONTENT_RANGE,
                 <span class="macro">format!</span>(
                     <span class="string">&quot;bytes {}-{}/{}&quot;</span>,
-                    written_bytes,
-                    written_bytes + size - <span class="number">1</span>,
-                    written_bytes + size
+                    written,
+                    written + size - <span class="number">1</span>,
+                    written + size
                 ),
             )
-            .body(AsyncBody::Bytes(bs))
+            .body(body)
             .map_err(new_request_build_error)<span class="question-mark">?</span>;
 
         <span class="self">self</span>.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
diff --git a/docs/rust/src/opendal/services/gcs/writer.rs.html b/docs/rust/src/opendal/services/gcs/writer.rs.html
index 1eb6ace2d..7d97762e9 100644
--- a/docs/rust/src/opendal/services/gcs/writer.rs.html
+++ b/docs/rust/src/opendal/services/gcs/writer.rs.html
@@ -151,65 +151,6 @@
 <a href="#151" id="151">151</a>
 <a href="#152" id="152">152</a>
 <a href="#153" id="153">153</a>
-<a href="#154" id="154">154</a>
-<a href="#155" id="155">155</a>
-<a href="#156" id="156">156</a>
-<a href="#157" id="157">157</a>
-<a href="#158" id="158">158</a>
-<a href="#159" id="159">159</a>
-<a href="#160" id="160">160</a>
-<a href="#161" id="161">161</a>
-<a href="#162" id="162">162</a>
-<a href="#163" id="163">163</a>
-<a href="#164" id="164">164</a>
-<a href="#165" id="165">165</a>
-<a href="#166" id="166">166</a>
-<a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
-<a href="#170" id="170">170</a>
-<a href="#171" id="171">171</a>
-<a href="#172" id="172">172</a>
-<a href="#173" id="173">173</a>
-<a href="#174" id="174">174</a>
-<a href="#175" id="175">175</a>
-<a href="#176" id="176">176</a>
-<a href="#177" id="177">177</a>
-<a href="#178" id="178">178</a>
-<a href="#179" id="179">179</a>
-<a href="#180" id="180">180</a>
-<a href="#181" id="181">181</a>
-<a href="#182" id="182">182</a>
-<a href="#183" id="183">183</a>
-<a href="#184" id="184">184</a>
-<a href="#185" id="185">185</a>
-<a href="#186" id="186">186</a>
-<a href="#187" id="187">187</a>
-<a href="#188" id="188">188</a>
-<a href="#189" id="189">189</a>
-<a href="#190" id="190">190</a>
-<a href="#191" id="191">191</a>
-<a href="#192" id="192">192</a>
-<a href="#193" id="193">193</a>
-<a href="#194" id="194">194</a>
-<a href="#195" id="195">195</a>
-<a href="#196" id="196">196</a>
-<a href="#197" id="197">197</a>
-<a href="#198" id="198">198</a>
-<a href="#199" id="199">199</a>
-<a href="#200" id="200">200</a>
-<a href="#201" id="201">201</a>
-<a href="#202" id="202">202</a>
-<a href="#203" id="203">203</a>
-<a href="#204" id="204">204</a>
-<a href="#205" id="205">205</a>
-<a href="#206" id="206">206</a>
-<a href="#207" id="207">207</a>
-<a href="#208" id="208">208</a>
-<a href="#209" id="209">209</a>
-<a href="#210" id="210">210</a>
-<a href="#211" id="211">211</a>
-<a href="#212" id="212">212</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -238,38 +179,33 @@
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
+<span class="kw">pub type </span>GcsWriters =
+    oio::TwoWaysWriter&lt;oio::OneShotWriter&lt;GcsWriter&gt;, oio::RangeWriter&lt;GcsWriter&gt;&gt;;
+
 <span class="kw">pub struct </span>GcsWriter {
     core: Arc&lt;GcsCore&gt;,
     path: String,
     op: OpWrite,
-
-    location: <span class="prelude-ty">Option</span>&lt;String&gt;,
-    written: u64,
-    buffer: oio::VectorCursor,
-    write_fixed_size: usize,
 }
 
 <span class="kw">impl </span>GcsWriter {
     <span class="kw">pub fn </span>new(core: Arc&lt;GcsCore&gt;, path: <span class="kw-2">&amp;</span>str, op: OpWrite) -&gt; <span class="self">Self </span>{
-        <span class="kw">let </span>write_fixed_size = core.write_fixed_size;
         GcsWriter {
             core,
             path: path.to_string(),
             op,
-
-            location: <span class="prelude-val">None</span>,
-            written: <span class="number">0</span>,
-            buffer: oio::VectorCursor::new(),
-            write_fixed_size,
         }
     }
+}
 
-    <span class="kw">async fn </span>write_oneshot(<span class="kw-2">&amp;</span><span class="self">self</span>, size: u64, body: AsyncBody) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+<span class="attr">#[async_trait]
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>GcsWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.gcs_insert_object_request(
             <span class="kw-2">&amp;</span>percent_encode_path(<span class="kw-2">&amp;</span><span class="self">self</span>.path),
-            <span class="prelude-val">Some</span>(size),
+            <span class="prelude-val">Some</span>(bs.len() <span class="kw">as </span>u64),
             <span class="kw-2">&amp;</span><span class="self">self</span>.op,
-            body,
+            AsyncBody::Bytes(bs),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
@@ -286,8 +222,11 @@
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
+}
 
-    <span class="kw">async fn </span>initiate_upload(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;String&gt; {
+<span class="attr">#[async_trait]
+</span><span class="kw">impl </span>oio::RangeWrite <span class="kw">for </span>GcsWriter {
+    <span class="kw">async fn </span>initiate_range(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;String&gt; {
         <span class="kw">let </span>resp = <span class="self">self</span>.core.gcs_initiate_resumable_upload(<span class="kw-2">&amp;</span><span class="self">self</span>.path).<span class="kw">await</span><span class="question-mark">?</span>;
         <span class="kw">let </span>status = resp.status();
 
@@ -307,14 +246,16 @@
         }
     }
 
-    <span class="kw">async fn </span>write_part(<span class="kw-2">&amp;</span><span class="self">self</span>, location: <span class="kw-2">&amp;</span>str, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.gcs_upload_in_resumable_upload(
-            location,
-            bs.len() <span class="kw">as </span>u64,
-            <span class="self">self</span>.written,
-            <span class="bool-val">false</span>,
-            AsyncBody::Bytes(bs),
-        )<span class="question-mark">?</span>;
+    <span class="kw">async fn </span>write_range(
+        <span class="kw-2">&amp;</span><span class="self">self</span>,
+        location: <span class="kw-2">&amp;</span>str,
+        written: u64,
+        size: u64,
+        body: AsyncBody,
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self
+            </span>.core
+            .gcs_upload_in_resumable_upload(location, size, written, body)<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
 
@@ -326,60 +267,30 @@
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
-}
 
-<span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>GcsWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-
-        <span class="kw">let </span>location = <span class="kw">match </span><span class="kw-2">&amp;</span><span class="self">self</span>.location {
-            <span class="prelude-val">Some</span>(location) =&gt; location,
-            <span class="prelude-val">None </span>=&gt; {
-                <span class="kw">if </span><span class="self">self</span>.op.content_length().unwrap_or_default() == size <span class="kw">as </span>u64 &amp;&amp; <span class="self">self</span>.written == <span class="number">0
-                </span>{
-                    <span class="self">self</span>.write_oneshot(size <span class="kw">as </span>u64, AsyncBody::Bytes(bs.copy_to_bytes(size)))
-                        .<span class="kw">await</span><span class="question-mark">?</span>;
-
-                    <span class="kw">return </span><span class="prelude-val">Ok</span>(size);
-                } <span class="kw">else </span>{
-                    <span class="kw">let </span>location = <span class="self">self</span>.initiate_upload().<span class="kw">await</span><span class="question-mark">?</span>;
-                    <span class="self">self</span>.location = <span class="prelude-val">Some</span>(location);
-                    <span class="self">self</span>.location.as_deref().unwrap()
-                }
-            }
-        };
-
-        <span class="self">self</span>.buffer.push(bs.copy_to_bytes(size));
-        <span class="comment">// Return directly if the buffer is not full
-        </span><span class="kw">if </span><span class="self">self</span>.buffer.len() &lt;= <span class="self">self</span>.write_fixed_size {
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(size);
-        }
-
-        <span class="kw">let </span>bs = <span class="self">self</span>.buffer.peak_exact(<span class="self">self</span>.write_fixed_size);
+    <span class="kw">async fn </span>complete_range(
+        <span class="kw-2">&amp;</span><span class="self">self</span>,
+        location: <span class="kw-2">&amp;</span>str,
+        written: u64,
+        size: u64,
+        body: AsyncBody,
+    ) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>resp = <span class="self">self
+            </span>.core
+            .gcs_complete_resumable_upload(location, written, size, body)
+            .<span class="kw">await</span><span class="question-mark">?</span>;
 
-        <span class="kw">match </span><span class="self">self</span>.write_part(location, bs).<span class="kw">await </span>{
-            <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
-                <span class="self">self</span>.buffer.take(<span class="self">self</span>.write_fixed_size);
-                <span class="self">self</span>.written += <span class="self">self</span>.write_fixed_size <span class="kw">as </span>u64;
-                <span class="prelude-val">Ok</span>(size)
-            }
-            <span class="prelude-val">Err</span>(e) =&gt; {
-                <span class="comment">// If the upload fails, we should pop the given bs to make sure
-                // write is re-enter safe.
-                </span><span class="self">self</span>.buffer.pop();
-                <span class="prelude-val">Err</span>(e)
+        <span class="kw">let </span>status = resp.status();
+        <span class="kw">match </span>status {
+            StatusCode::OK =&gt; {
+                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
+                <span class="prelude-val">Ok</span>(())
             }
+            <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>location = <span class="kw">if let </span><span class="prelude-val">Some</span>(location) = <span class="kw-2">&amp;</span><span class="self">self</span>.location {
-            location
-        } <span class="kw">else </span>{
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(());
-        };
-
+    <span class="kw">async fn </span>abort_range(<span class="kw-2">&amp;</span><span class="self">self</span>, location: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span>resp = <span class="self">self</span>.core.gcs_abort_resumable_upload(location).<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="kw">match </span>resp.status().as_u16() {
@@ -387,35 +298,6 @@
             // reference: https://cloud.google.com/storage/docs/performing-resumable-uploads#cancel-upload-json
             </span><span class="number">499 </span>=&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="self">self</span>.location = <span class="prelude-val">None</span>;
-                <span class="self">self</span>.buffer.clear();
-                <span class="prelude-val">Ok</span>(())
-            }
-            <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
-        }
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>location = <span class="kw">if let </span><span class="prelude-val">Some</span>(location) = <span class="kw-2">&amp;</span><span class="self">self</span>.location {
-            location
-        } <span class="kw">else </span>{
-            <span class="kw">return </span><span class="prelude-val">Ok</span>(());
-        };
-
-        <span class="kw">let </span>bs = <span class="self">self</span>.buffer.peak_exact(<span class="self">self</span>.buffer.len());
-
-        <span class="kw">let </span>resp = <span class="self">self
-            </span>.core
-            .gcs_complete_resumable_upload(location, <span class="self">self</span>.written, bs)
-            .<span class="kw">await</span><span class="question-mark">?</span>;
-
-        <span class="kw">let </span>status = resp.status();
-        <span class="kw">match </span>status {
-            StatusCode::OK =&gt; {
-                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-
-                <span class="self">self</span>.location = <span class="prelude-val">None</span>;
-                <span class="self">self</span>.buffer.clear();
                 <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
diff --git a/docs/rust/src/opendal/services/gdrive/backend.rs.html b/docs/rust/src/opendal/services/gdrive/backend.rs.html
index ddf6b4e3c..ba6657621 100644
--- a/docs/rust/src/opendal/services/gdrive/backend.rs.html
+++ b/docs/rust/src/opendal/services/gdrive/backend.rs.html
@@ -281,6 +281,10 @@
 <a href="#281" id="281">281</a>
 <a href="#282" id="282">282</a>
 <a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -323,7 +327,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>GdriveBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = GdriveWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;GdriveWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = ();
     <span class="kw">type </span>BlockingPager = ();
@@ -477,7 +481,11 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            GdriveWriter::new(<span class="self">self</span>.core.clone(), String::from(path), file_id),
+            oio::OneShotWriter::new(GdriveWriter::new(
+                <span class="self">self</span>.core.clone(),
+                String::from(path),
+                file_id,
+            )),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/gdrive/writer.rs.html b/docs/rust/src/opendal/services/gdrive/writer.rs.html
index 02427c238..b2617c5d7 100644
--- a/docs/rust/src/opendal/services/gdrive/writer.rs.html
+++ b/docs/rust/src/opendal/services/gdrive/writer.rs.html
@@ -99,23 +99,6 @@
 <a href="#99" id="99">99</a>
 <a href="#100" id="100">100</a>
 <a href="#101" id="101">101</a>
-<a href="#102" id="102">102</a>
-<a href="#103" id="103">103</a>
-<a href="#104" id="104">104</a>
-<a href="#105" id="105">105</a>
-<a href="#106" id="106">106</a>
-<a href="#107" id="107">107</a>
-<a href="#108" id="108">108</a>
-<a href="#109" id="109">109</a>
-<a href="#110" id="110">110</a>
-<a href="#111" id="111">111</a>
-<a href="#112" id="112">112</a>
-<a href="#113" id="113">113</a>
-<a href="#114" id="114">114</a>
-<a href="#115" id="115">115</a>
-<a href="#116" id="116">116</a>
-<a href="#117" id="117">117</a>
-<a href="#118" id="118">118</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -142,7 +125,6 @@
 <span class="kw">use </span><span class="kw">super</span>::core::GdriveCore;
 <span class="kw">use </span><span class="kw">super</span>::error::parse_error;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
-<span class="kw">use </span><span class="kw">crate</span>::services::gdrive::core::GdriveFile;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="kw">pub struct </span>GdriveWriter {
@@ -167,7 +149,7 @@
     ///
     /// This is used for small objects.
     /// And should overwrite the object if it already exists.
-    </span><span class="kw">pub async fn </span>write_create(<span class="kw-2">&amp;mut </span><span class="self">self</span>, size: u64, body: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    </span><span class="kw">pub async fn </span>write_create(<span class="kw-2">&amp;</span><span class="self">self</span>, size: u64, body: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span>resp = <span class="self">self
             </span>.core
             .gdrive_upload_simple_request(<span class="kw-2">&amp;</span><span class="self">self</span>.path, size, body)
@@ -177,13 +159,7 @@
 
         <span class="kw">match </span>status {
             StatusCode::OK | StatusCode::CREATED =&gt; {
-                <span class="kw">let </span>bs = resp.into_body().bytes().<span class="kw">await</span><span class="question-mark">?</span>;
-
-                <span class="kw">let </span>file = serde_json::from_slice::&lt;GdriveFile&gt;(<span class="kw-2">&amp;</span>bs)
-                    .map_err(new_json_deserialize_error)<span class="question-mark">?</span>;
-
-                <span class="self">self</span>.file_id = <span class="prelude-val">Some</span>(file.id);
-
+                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
                 <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
@@ -212,25 +188,15 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>GdriveWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>GdriveWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
         <span class="kw">if </span><span class="self">self</span>.file_id.is_none() {
-            <span class="self">self</span>.write_create(size <span class="kw">as </span>u64, bs.copy_to_bytes(size))
-                .<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.write_create(size <span class="kw">as </span>u64, bs).<span class="kw">await</span><span class="question-mark">?</span>;
         } <span class="kw">else </span>{
-            <span class="self">self</span>.write_overwrite(size <span class="kw">as </span>u64, bs.copy_to_bytes(size))
-                .<span class="kw">await</span><span class="question-mark">?</span>;
+            <span class="self">self</span>.write_overwrite(size <span class="kw">as </span>u64, bs).<span class="kw">await</span><span class="question-mark">?</span>;
         }
 
-        <span class="prelude-val">Ok</span>(size)
-    }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="prelude-val">Ok</span>(())
     }
 }
diff --git a/docs/rust/src/opendal/services/ghac/writer.rs.html b/docs/rust/src/opendal/services/ghac/writer.rs.html
index cb7c6d4ec..7539c28b8 100644
--- a/docs/rust/src/opendal/services/ghac/writer.rs.html
+++ b/docs/rust/src/opendal/services/ghac/writer.rs.html
@@ -84,6 +84,75 @@
 <a href="#84" id="84">84</a>
 <a href="#85" id="85">85</a>
 <a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -101,7 +170,12 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::task::ready;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>futures::future::BoxFuture;
 
 <span class="kw">use </span><span class="kw">super</span>::backend::GhacBackend;
 <span class="kw">use </span><span class="kw">super</span>::error::parse_error;
@@ -109,7 +183,7 @@
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="kw">pub struct </span>GhacWriter {
-    backend: GhacBackend,
+    state: State,
 
     cache_id: i64,
     size: u64,
@@ -118,55 +192,119 @@
 <span class="kw">impl </span>GhacWriter {
     <span class="kw">pub fn </span>new(backend: GhacBackend, cache_id: i64) -&gt; <span class="self">Self </span>{
         GhacWriter {
-            backend,
+            state: State::Idle(<span class="prelude-val">Some</span>(backend)),
             cache_id,
             size: <span class="number">0</span>,
         }
     }
 }
 
+<span class="kw">enum </span>State {
+    Idle(<span class="prelude-ty">Option</span>&lt;GhacBackend&gt;),
+    Upload(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (GhacBackend, <span class="prelude-ty">Result</span>&lt;usize&gt;)&gt;),
+    Commit(BoxFuture&lt;<span class="lifetime">&#39;static</span>, (GhacBackend, <span class="prelude-ty">Result</span>&lt;()&gt;)&gt;),
+}
+
+<span class="doccomment">/// # Safety
+///
+/// We will only take `&amp;mut Self` reference for State.
+</span><span class="kw">unsafe impl </span>Sync <span class="kw">for </span>State {}
+
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>GhacWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-
-        <span class="kw">let </span>req = <span class="self">self
-            </span>.backend
-            .ghac_upload(
-                <span class="self">self</span>.cache_id,
-                size <span class="kw">as </span>u64,
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
-            )
-            .<span class="kw">await</span><span class="question-mark">?</span>;
-
-        <span class="kw">let </span>resp = <span class="self">self</span>.backend.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
-
-        <span class="kw">if </span>resp.status().is_success() {
-            resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="self">self</span>.size += size <span class="kw">as </span>u64;
-            <span class="prelude-val">Ok</span>(size)
-        } <span class="kw">else </span>{
-            <span class="prelude-val">Err</span>(parse_error(resp)
-                .<span class="kw">await
-                </span>.map(|err| err.with_operation(<span class="string">&quot;Backend::ghac_upload&quot;</span>))<span class="question-mark">?</span>)
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(backend) =&gt; {
+                    <span class="kw">let </span>backend = backend.take().expect(<span class="string">&quot;GhacWriter must be initialized&quot;</span>);
+
+                    <span class="kw">let </span>cache_id = <span class="self">self</span>.cache_id;
+                    <span class="kw">let </span>size = bs.remaining();
+                    <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+
+                    <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                        <span class="kw">let </span>res = <span class="kw">async </span>{
+                            <span class="kw">let </span>req = backend
+                                .ghac_upload(cache_id, size <span class="kw">as </span>u64, AsyncBody::Bytes(bs))
+                                .<span class="kw">await</span><span class="question-mark">?</span>;
+
+                            <span class="kw">let </span>resp = backend.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
+
+                            <span class="kw">if </span>resp.status().is_success() {
+                                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
+                                <span class="prelude-val">Ok</span>(size)
+                            } <span class="kw">else </span>{
+                                <span class="prelude-val">Err</span>(parse_error(resp)
+                                    .<span class="kw">await
+                                    </span>.map(|err| err.with_operation(<span class="string">&quot;Backend::ghac_upload&quot;</span>))<span class="question-mark">?</span>)
+                            }
+                        }
+                        .<span class="kw">await</span>;
+
+                        (backend, res)
+                    };
+                    <span class="self">self</span>.state = State::Upload(Box::pin(fut));
+                }
+                State::Upload(fut) =&gt; {
+                    <span class="kw">let </span>(backend, res) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(backend));
+
+                    <span class="kw">let </span>size = res<span class="question-mark">?</span>;
+                    <span class="self">self</span>.size += size <span class="kw">as </span>u64;
+                    <span class="kw">return </span>Poll::Ready(<span class="prelude-val">Ok</span>(size));
+                }
+                State::Commit(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;GhacWriter must not go into State:Commit during poll_write&quot;</span>)
+                }
+            }
         }
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.state = State::Idle(<span class="prelude-val">None</span>);
+
+        Poll::Ready(<span class="prelude-val">Ok</span>(()))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>req = <span class="self">self</span>.backend.ghac_commit(<span class="self">self</span>.cache_id, <span class="self">self</span>.size).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="kw">let </span>resp = <span class="self">self</span>.backend.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
-
-        <span class="kw">if </span>resp.status().is_success() {
-            resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-            <span class="prelude-val">Ok</span>(())
-        } <span class="kw">else </span>{
-            <span class="prelude-val">Err</span>(parse_error(resp)
-                .<span class="kw">await
-                </span>.map(|err| err.with_operation(<span class="string">&quot;Backend::ghac_commit&quot;</span>))<span class="question-mark">?</span>)
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="kw">loop </span>{
+            <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.state {
+                State::Idle(backend) =&gt; {
+                    <span class="kw">let </span>backend = backend.take().expect(<span class="string">&quot;GhacWriter must be initialized&quot;</span>);
+
+                    <span class="kw">let </span>cache_id = <span class="self">self</span>.cache_id;
+                    <span class="kw">let </span>size = <span class="self">self</span>.size;
+
+                    <span class="kw">let </span>fut = <span class="kw">async move </span>{
+                        <span class="kw">let </span>res = <span class="kw">async </span>{
+                            <span class="kw">let </span>req = backend.ghac_commit(cache_id, size).<span class="kw">await</span><span class="question-mark">?</span>;
+                            <span class="kw">let </span>resp = backend.client.send(req).<span class="kw">await</span><span class="question-mark">?</span>;
+
+                            <span class="kw">if </span>resp.status().is_success() {
+                                resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
+                                <span class="prelude-val">Ok</span>(())
+                            } <span class="kw">else </span>{
+                                <span class="prelude-val">Err</span>(parse_error(resp)
+                                    .<span class="kw">await
+                                    </span>.map(|err| err.with_operation(<span class="string">&quot;Backend::ghac_commit&quot;</span>))<span class="question-mark">?</span>)
+                            }
+                        }
+                        .<span class="kw">await</span>;
+
+                        (backend, res)
+                    };
+                    <span class="self">self</span>.state = State::Commit(Box::pin(fut));
+                }
+                State::Upload(<span class="kw">_</span>) =&gt; {
+                    <span class="macro">unreachable!</span>(<span class="string">&quot;GhacWriter must not go into State:Upload during poll_close&quot;</span>)
+                }
+                State::Commit(fut) =&gt; {
+                    <span class="kw">let </span>(backend, res) = <span class="macro">ready!</span>(fut.as_mut().poll(cx));
+                    <span class="self">self</span>.state = State::Idle(<span class="prelude-val">Some</span>(backend));
+
+                    <span class="kw">return </span>Poll::Ready(res);
+                }
+            }
         }
     }
 }
diff --git a/docs/rust/src/opendal/services/hdfs/writer.rs.html b/docs/rust/src/opendal/services/hdfs/writer.rs.html
index 0bba6ac97..6348c50b5 100644
--- a/docs/rust/src/opendal/services/hdfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/hdfs/writer.rs.html
@@ -65,6 +65,9 @@
 <a href="#65" id="65">65</a>
 <a href="#66" id="66">66</a>
 <a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -83,9 +86,12 @@
 // under the License.
 
 </span><span class="kw">use </span>std::io::Write;
+<span class="kw">use </span>std::pin::Pin;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
 
 <span class="kw">use </span>async_trait::async_trait;
-<span class="kw">use </span>futures::AsyncWriteExt;
+<span class="kw">use </span>futures::AsyncWrite;
 
 <span class="kw">use </span><span class="kw">super</span>::error::parse_io_error;
 <span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
@@ -103,21 +109,21 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>HdfsWriter&lt;hdrs::AsyncFile&gt; {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="self">self</span>.f.write(bs.chunk()).<span class="kw">await</span>.map_err(parse_io_error)
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        Pin::new(<span class="kw-2">&amp;mut </span><span class="self">self</span>.f)
+            .poll_write(cx, bs.chunk())
+            .map_err(parse_io_error)
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
-            <span class="string">&quot;output writer doesn&#39;t support abort&quot;</span>,
-        ))
+            <span class="string">&quot;HdfsWriter doesn&#39;t support abort&quot;</span>,
+        )))
     }
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="self">self</span>.f.close().<span class="kw">await</span>.map_err(parse_io_error)<span class="question-mark">?</span>;
-
-        <span class="prelude-val">Ok</span>(())
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Pin::new(<span class="kw-2">&amp;mut </span><span class="self">self</span>.f).poll_close(cx).map_err(parse_io_error)
     }
 }
 
diff --git a/docs/rust/src/opendal/services/ipmfs/backend.rs.html b/docs/rust/src/opendal/services/ipmfs/backend.rs.html
index 86cf83b35..381740fb1 100644
--- a/docs/rust/src/opendal/services/ipmfs/backend.rs.html
+++ b/docs/rust/src/opendal/services/ipmfs/backend.rs.html
@@ -384,7 +384,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>IpmfsBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = IpmfsWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;IpmfsWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = IpmfsPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -450,7 +450,7 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            IpmfsWriter::new(<span class="self">self</span>.clone(), path.to_string()),
+            oio::OneShotWriter::new(IpmfsWriter::new(<span class="self">self</span>.clone(), path.to_string())),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/ipmfs/writer.rs.html b/docs/rust/src/opendal/services/ipmfs/writer.rs.html
index 1cfb49a73..4c50cadaf 100644
--- a/docs/rust/src/opendal/services/ipmfs/writer.rs.html
+++ b/docs/rust/src/opendal/services/ipmfs/writer.rs.html
@@ -52,17 +52,6 @@
 <a href="#52" id="52">52</a>
 <a href="#53" id="53">53</a>
 <a href="#54" id="54">54</a>
-<a href="#55" id="55">55</a>
-<a href="#56" id="56">56</a>
-<a href="#57" id="57">57</a>
-<a href="#58" id="58">58</a>
-<a href="#59" id="59">59</a>
-<a href="#60" id="60">60</a>
-<a href="#61" id="61">61</a>
-<a href="#62" id="62">62</a>
-<a href="#63" id="63">63</a>
-<a href="#64" id="64">64</a>
-<a href="#65" id="65">65</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -81,6 +70,7 @@
 // under the License.
 
 </span><span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::backend::IpmfsBackend;
@@ -101,31 +91,19 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>IpmfsWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-        <span class="kw">let </span>resp = <span class="self">self
-            </span>.backend
-            .ipmfs_write(<span class="kw-2">&amp;</span><span class="self">self</span>.path, bs.copy_to_bytes(size))
-            .<span class="kw">await</span><span class="question-mark">?</span>;
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>IpmfsWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>resp = <span class="self">self</span>.backend.ipmfs_write(<span class="kw-2">&amp;</span><span class="self">self</span>.path, bs).<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="kw">let </span>status = resp.status();
 
         <span class="kw">match </span>status {
             StatusCode::CREATED | StatusCode::OK =&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="prelude-val">Ok</span>(size)
+                <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/obs/writer.rs.html b/docs/rust/src/opendal/services/obs/writer.rs.html
index bdd2165e8..1cd5f2ec6 100644
--- a/docs/rust/src/opendal/services/obs/writer.rs.html
+++ b/docs/rust/src/opendal/services/obs/writer.rs.html
@@ -218,6 +218,7 @@
 <a href="#218" id="218">218</a>
 <a href="#219" id="219">219</a>
 <a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -238,6 +239,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
@@ -271,14 +273,14 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>ObsWriter {
-    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.obs_put_object_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
             <span class="prelude-val">Some</span>(size <span class="kw">as </span>u64),
             <span class="self">self</span>.op.content_type(),
             <span class="self">self</span>.op.cache_control(),
-            AsyncBody::Bytes(bs.copy_to_bytes(size)),
+            AsyncBody::Bytes(bs),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
diff --git a/docs/rust/src/opendal/services/onedrive/backend.rs.html b/docs/rust/src/opendal/services/onedrive/backend.rs.html
index f42d443ea..8fdcd385d 100644
--- a/docs/rust/src/opendal/services/onedrive/backend.rs.html
+++ b/docs/rust/src/opendal/services/onedrive/backend.rs.html
@@ -441,7 +441,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>OnedriveBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = OneDriveWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;OneDriveWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = OnedrivePager;
     <span class="kw">type </span>BlockingPager = ();
@@ -491,7 +491,7 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            OneDriveWriter::new(<span class="self">self</span>.clone(), args, path),
+            oio::OneShotWriter::new(OneDriveWriter::new(<span class="self">self</span>.clone(), args, path)),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/onedrive/writer.rs.html b/docs/rust/src/opendal/services/onedrive/writer.rs.html
index 3d25b60e0..a9aa454d7 100644
--- a/docs/rust/src/opendal/services/onedrive/writer.rs.html
+++ b/docs/rust/src/opendal/services/onedrive/writer.rs.html
@@ -165,15 +165,6 @@
 <a href="#165" id="165">165</a>
 <a href="#166" id="166">166</a>
 <a href="#167" id="167">167</a>
-<a href="#168" id="168">168</a>
-<a href="#169" id="169">169</a>
-<a href="#170" id="170">170</a>
-<a href="#171" id="171">171</a>
-<a href="#172" id="172">172</a>
-<a href="#173" id="173">173</a>
-<a href="#174" id="174">174</a>
-<a href="#175" id="175">175</a>
-<a href="#176" id="176">176</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -220,10 +211,9 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>OneDriveWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-        <span class="kw">let </span>bs = bs.copy_to_bytes(size);
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>OneDriveWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
 
         <span class="kw">if </span>size &lt;= <span class="self">Self</span>::MAX_SIMPLE_SIZE {
             <span class="self">self</span>.write_simple(bs).<span class="kw">await</span><span class="question-mark">?</span>;
@@ -231,20 +221,12 @@
             <span class="self">self</span>.write_chunked(bs).<span class="kw">await</span><span class="question-mark">?</span>;
         }
 
-        <span class="prelude-val">Ok</span>(size)
-    }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="prelude-val">Ok</span>(())
     }
 }
 
 <span class="kw">impl </span>OneDriveWriter {
-    <span class="kw">async fn </span>write_simple(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+    <span class="kw">async fn </span>write_simple(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
         <span class="kw">let </span>resp = <span class="self">self
             </span>.backend
             .onedrive_upload_simple(
diff --git a/docs/rust/src/opendal/services/oss/writer.rs.html b/docs/rust/src/opendal/services/oss/writer.rs.html
index 87990356e..6cc3c501c 100644
--- a/docs/rust/src/opendal/services/oss/writer.rs.html
+++ b/docs/rust/src/opendal/services/oss/writer.rs.html
@@ -228,6 +228,7 @@
 <a href="#228" id="228">228</a>
 <a href="#229" id="229">229</a>
 <a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -248,6 +249,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
@@ -280,15 +282,15 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>OssWriter {
-    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.oss_put_object_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
             <span class="prelude-val">Some</span>(size <span class="kw">as </span>u64),
             <span class="self">self</span>.op.content_type(),
             <span class="self">self</span>.op.content_disposition(),
             <span class="self">self</span>.op.cache_control(),
-            AsyncBody::Bytes(bs.copy_to_bytes(size)),
+            AsyncBody::Bytes(bs),
             <span class="bool-val">false</span>,
         )<span class="question-mark">?</span>;
 
diff --git a/docs/rust/src/opendal/services/s3/writer.rs.html b/docs/rust/src/opendal/services/s3/writer.rs.html
index 6a7ef88be..8e6559a25 100644
--- a/docs/rust/src/opendal/services/s3/writer.rs.html
+++ b/docs/rust/src/opendal/services/s3/writer.rs.html
@@ -188,6 +188,7 @@
 <a href="#188" id="188">188</a>
 <a href="#189" id="189">189</a>
 <a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -208,6 +209,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
@@ -237,8 +239,8 @@
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>S3Writer {
-    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
 
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.s3_put_object_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
@@ -246,7 +248,7 @@
             <span class="self">self</span>.op.content_type(),
             <span class="self">self</span>.op.content_disposition(),
             <span class="self">self</span>.op.cache_control(),
-            AsyncBody::Bytes(bs.copy_to_bytes(size)),
+            AsyncBody::Bytes(bs),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req).<span class="kw">await</span><span class="question-mark">?</span>;
diff --git a/docs/rust/src/opendal/services/sftp/writer.rs.html b/docs/rust/src/opendal/services/sftp/writer.rs.html
index b5dad7cee..02545bf94 100644
--- a/docs/rust/src/opendal/services/sftp/writer.rs.html
+++ b/docs/rust/src/opendal/services/sftp/writer.rs.html
@@ -50,6 +50,19 @@
 <a href="#50" id="50">50</a>
 <a href="#51" id="51">51</a>
 <a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -67,39 +80,52 @@
 // specific language governing permissions and limitations
 // under the License.
 
-</span><span class="kw">use </span>async_trait::async_trait;
+</span><span class="kw">use </span>std::pin::Pin;
+<span class="kw">use </span>std::task::Context;
+<span class="kw">use </span>std::task::Poll;
+
+<span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>openssh_sftp_client::file::File;
+<span class="kw">use </span>openssh_sftp_client::file::TokioCompatFile;
+<span class="kw">use </span>tokio::io::AsyncWrite;
 
 <span class="kw">use </span><span class="kw">crate</span>::raw::oio;
 <span class="kw">use crate</span>::<span class="kw-2">*</span>;
 
 <span class="kw">pub struct </span>SftpWriter {
-    file: File,
+    file: Pin&lt;Box&lt;TokioCompatFile&gt;&gt;,
 }
 
 <span class="kw">impl </span>SftpWriter {
     <span class="kw">pub fn </span>new(file: File) -&gt; <span class="self">Self </span>{
-        SftpWriter { file }
+        SftpWriter {
+            file: Box::pin(TokioCompatFile::new(file)),
+        }
     }
 }
 
 <span class="attr">#[async_trait]
 </span><span class="kw">impl </span>oio::Write <span class="kw">for </span>SftpWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = <span class="self">self</span>.file.write(bs.chunk()).<span class="kw">await</span><span class="question-mark">?</span>;
+    <span class="kw">fn </span>poll_write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;usize&gt;&gt; {
+        <span class="self">self</span>.file
+            .as_mut()
+            .poll_write(cx, bs.chunk())
+            .map_err(parse_io_error)
+    }
 
-        <span class="prelude-val">Ok</span>(size)
+    <span class="kw">fn </span>poll_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cx: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        <span class="self">self</span>.file.as_mut().poll_shutdown(cx).map_err(parse_io_error)
     }
 
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
+    <span class="kw">fn </span>poll_abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;mut </span>Context&lt;<span class="lifetime">&#39;_</span>&gt;) -&gt; Poll&lt;<span class="prelude-ty">Result</span>&lt;()&gt;&gt; {
+        Poll::Ready(<span class="prelude-val">Err</span>(Error::new(
             ErrorKind::Unsupported,
-            <span class="string">&quot;SFTP does not support aborting writes&quot;</span>,
-        ))
+            <span class="string">&quot;HdfsWriter doesn&#39;t support abort&quot;</span>,
+        )))
     }
+}
 
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
+<span class="kw">fn </span>parse_io_error(err: std::io::Error) -&gt; Error {
+    Error::new(ErrorKind::Unexpected, <span class="string">&quot;read from sftp&quot;</span>).set_source(err)
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/supabase/backend.rs.html b/docs/rust/src/opendal/services/supabase/backend.rs.html
index d9c6e9f5a..0bc60fbf9 100644
--- a/docs/rust/src/opendal/services/supabase/backend.rs.html
+++ b/docs/rust/src/opendal/services/supabase/backend.rs.html
@@ -438,7 +438,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>SupabaseBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = SupabaseWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;SupabaseWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="comment">// todo: implement Pager to support list and scan
     </span><span class="kw">type </span>Pager = ();
@@ -513,7 +513,7 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            SupabaseWriter::new(<span class="self">self</span>.core.clone(), path, args),
+            oio::OneShotWriter::new(SupabaseWriter::new(<span class="self">self</span>.core.clone(), path, args)),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/supabase/writer.rs.html b/docs/rust/src/opendal/services/supabase/writer.rs.html
index 4815c6676..3a7114483 100644
--- a/docs/rust/src/opendal/services/supabase/writer.rs.html
+++ b/docs/rust/src/opendal/services/supabase/writer.rs.html
@@ -67,23 +67,6 @@
 <a href="#67" id="67">67</a>
 <a href="#68" id="68">68</a>
 <a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
-<a href="#72" id="72">72</a>
-<a href="#73" id="73">73</a>
-<a href="#74" id="74">74</a>
-<a href="#75" id="75">75</a>
-<a href="#76" id="76">76</a>
-<a href="#77" id="77">77</a>
-<a href="#78" id="78">78</a>
-<a href="#79" id="79">79</a>
-<a href="#80" id="80">80</a>
-<a href="#81" id="81">81</a>
-<a href="#82" id="82">82</a>
-<a href="#83" id="83">83</a>
-<a href="#84" id="84">84</a>
-<a href="#85" id="85">85</a>
-<a href="#86" id="86">86</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -127,14 +110,17 @@
             path: path.to_string(),
         }
     }
+}
 
-    <span class="kw">pub async fn </span>upload(<span class="kw-2">&amp;</span><span class="self">self</span>, bytes: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="kw">let </span>size = bytes.len();
+<span class="attr">#[async_trait]
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>SupabaseWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
         <span class="kw">let </span><span class="kw-2">mut </span>req = <span class="self">self</span>.core.supabase_upload_object_request(
             <span class="kw-2">&amp;</span><span class="self">self</span>.path,
             <span class="prelude-val">Some</span>(size),
             <span class="self">self</span>.op.content_type(),
-            AsyncBody::Bytes(bytes),
+            AsyncBody::Bytes(bs),
         )<span class="question-mark">?</span>;
 
         <span class="self">self</span>.core.sign(<span class="kw-2">&amp;mut </span>req)<span class="question-mark">?</span>;
@@ -150,24 +136,4 @@
         }
     }
 }
-
-<span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>SupabaseWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
-        <span class="self">self</span>.upload(bs.copy_to_bytes(size)).<span class="kw">await</span><span class="question-mark">?</span>;
-        <span class="prelude-val">Ok</span>(size)
-    }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Err</span>(Error::new(
-            ErrorKind::Unsupported,
-            <span class="string">&quot;The abort operation is not yet supported for Supabase backend&quot;</span>,
-        ))
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-}
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/vercel_artifacts/backend.rs.html b/docs/rust/src/opendal/services/vercel_artifacts/backend.rs.html
index 0d84ac5da..7379d80e6 100644
--- a/docs/rust/src/opendal/services/vercel_artifacts/backend.rs.html
+++ b/docs/rust/src/opendal/services/vercel_artifacts/backend.rs.html
@@ -186,6 +186,10 @@
 <a href="#186" id="186">186</a>
 <a href="#187" id="187">187</a>
 <a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -234,7 +238,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>VercelArtifactsBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = VercelArtifactsWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;VercelArtifactsWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = ();
     <span class="kw">type </span>BlockingPager = ();
@@ -281,7 +285,11 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            VercelArtifactsWriter::new(<span class="self">self</span>.clone(), args, path.to_string()),
+            oio::OneShotWriter::new(VercelArtifactsWriter::new(
+                <span class="self">self</span>.clone(),
+                args,
+                path.to_string(),
+            )),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html b/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
index 17dd5dd93..6f2081521 100644
--- a/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
+++ b/docs/rust/src/opendal/services/vercel_artifacts/writer.rs.html
@@ -62,13 +62,6 @@
 <a href="#62" id="62">62</a>
 <a href="#63" id="63">63</a>
 <a href="#64" id="64">64</a>
-<a href="#65" id="65">65</a>
-<a href="#66" id="66">66</a>
-<a href="#67" id="67">67</a>
-<a href="#68" id="68">68</a>
-<a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -87,6 +80,7 @@
 // under the License.
 
 </span><span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::backend::VercelArtifactsBackend;
@@ -96,29 +90,29 @@
 
 <span class="kw">pub struct </span>VercelArtifactsWriter {
     backend: VercelArtifactsBackend,
-    op: OpWrite,
+    _op: OpWrite,
 
     path: String,
 }
 
 <span class="kw">impl </span>VercelArtifactsWriter {
     <span class="kw">pub fn </span>new(backend: VercelArtifactsBackend, op: OpWrite, path: String) -&gt; <span class="self">Self </span>{
-        VercelArtifactsWriter { backend, op, path }
+        VercelArtifactsWriter {
+            backend,
+            _op: op,
+            path,
+        }
     }
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>VercelArtifactsWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>VercelArtifactsWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
 
         <span class="kw">let </span>resp = <span class="self">self
             </span>.backend
-            .vercel_artifacts_put(
-                <span class="self">self</span>.path.as_str(),
-                <span class="self">self</span>.op.content_length().unwrap(),
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
-            )
+            .vercel_artifacts_put(<span class="self">self</span>.path.as_str(), size <span class="kw">as </span>u64, AsyncBody::Bytes(bs))
             .<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="kw">let </span>status = resp.status();
@@ -126,18 +120,10 @@
         <span class="kw">match </span>status {
             StatusCode::OK | StatusCode::ACCEPTED =&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="prelude-val">Ok</span>(size)
+                <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/wasabi/backend.rs.html b/docs/rust/src/opendal/services/wasabi/backend.rs.html
index d55a1fa97..e00695445 100644
--- a/docs/rust/src/opendal/services/wasabi/backend.rs.html
+++ b/docs/rust/src/opendal/services/wasabi/backend.rs.html
@@ -1640,7 +1640,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>WasabiBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = WasabiWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;WasabiWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = WasabiPager;
     <span class="kw">type </span>BlockingPager = ();
@@ -1729,7 +1729,7 @@
 
         <span class="prelude-val">Ok</span>((
             RpWrite::default(),
-            WasabiWriter::new(<span class="self">self</span>.core.clone(), args, path.to_string()),
+            oio::OneShotWriter::new(WasabiWriter::new(<span class="self">self</span>.core.clone(), args, path.to_string())),
         ))
     }
 
diff --git a/docs/rust/src/opendal/services/wasabi/writer.rs.html b/docs/rust/src/opendal/services/wasabi/writer.rs.html
index da410cdfa..65207c275 100644
--- a/docs/rust/src/opendal/services/wasabi/writer.rs.html
+++ b/docs/rust/src/opendal/services/wasabi/writer.rs.html
@@ -65,13 +65,6 @@
 <a href="#65" id="65">65</a>
 <a href="#66" id="66">66</a>
 <a href="#67" id="67">67</a>
-<a href="#68" id="68">68</a>
-<a href="#69" id="69">69</a>
-<a href="#70" id="70">70</a>
-<a href="#71" id="71">71</a>
-<a href="#72" id="72">72</a>
-<a href="#73" id="73">73</a>
-<a href="#74" id="74">74</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -92,6 +85,7 @@
 </span><span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
+<span class="kw">use </span>bytes::Bytes;
 <span class="kw">use </span>http::StatusCode;
 
 <span class="kw">use </span><span class="kw">super</span>::core::<span class="kw-2">*</span>;
@@ -113,9 +107,9 @@
 }
 
 <span class="attr">#[async_trait]
-</span><span class="kw">impl </span>oio::Write <span class="kw">for </span>WasabiWriter {
-    <span class="kw">async fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, bs: <span class="kw-2">&amp;</span><span class="kw">dyn </span>oio::WriteBuf) -&gt; <span class="prelude-ty">Result</span>&lt;usize&gt; {
-        <span class="kw">let </span>size = bs.remaining();
+</span><span class="kw">impl </span>oio::OneShotWrite <span class="kw">for </span>WasabiWriter {
+    <span class="kw">async fn </span>write_once(<span class="kw-2">&amp;</span><span class="self">self</span>, bs: Bytes) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>size = bs.len();
 
         <span class="kw">let </span>resp = <span class="self">self
             </span>.core
@@ -125,25 +119,17 @@
                 <span class="self">self</span>.op.content_type(),
                 <span class="self">self</span>.op.content_disposition(),
                 <span class="self">self</span>.op.cache_control(),
-                AsyncBody::Bytes(bs.copy_to_bytes(size)),
+                AsyncBody::Bytes(bs),
             )
             .<span class="kw">await</span><span class="question-mark">?</span>;
 
         <span class="kw">match </span>resp.status() {
             StatusCode::CREATED | StatusCode::OK =&gt; {
                 resp.into_body().consume().<span class="kw">await</span><span class="question-mark">?</span>;
-                <span class="prelude-val">Ok</span>(size)
+                <span class="prelude-val">Ok</span>(())
             }
             <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>),
         }
     }
-
-    <span class="kw">async fn </span>abort(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
-
-    <span class="kw">async fn </span>close(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-        <span class="prelude-val">Ok</span>(())
-    }
 }
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/webdav/backend.rs.html b/docs/rust/src/opendal/services/webdav/backend.rs.html
index 39ab89bfc..8e7f54993 100644
--- a/docs/rust/src/opendal/services/webdav/backend.rs.html
+++ b/docs/rust/src/opendal/services/webdav/backend.rs.html
@@ -643,6 +643,9 @@
 <a href="#643" id="643">643</a>
 <a href="#644" id="644">644</a>
 <a href="#645" id="645">645</a>
+<a href="#646" id="646">646</a>
+<a href="#647" id="647">647</a>
+<a href="#648" id="648">648</a>
 </pre></div><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -866,7 +869,7 @@
 </span><span class="kw">impl </span>Accessor <span class="kw">for </span>WebdavBackend {
     <span class="kw">type </span>Reader = IncomingAsyncBody;
     <span class="kw">type </span>BlockingReader = ();
-    <span class="kw">type </span>Writer = WebdavWriter;
+    <span class="kw">type </span>Writer = oio::OneShotWriter&lt;WebdavWriter&gt;;
     <span class="kw">type </span>BlockingWriter = ();
     <span class="kw">type </span>Pager = <span class="prelude-ty">Option</span>&lt;WebdavPager&gt;;
... 1422 lines suppressed ...