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

xuanwo pushed a commit to branch refactor-write
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git

commit b8a61c31949f6d7ace92eced7c57f4dc46adcef3
Author: Xuanwo <[email protected]>
AuthorDate: Thu Sep 7 16:44:46 2023 +0800

    Save work
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/src/raw/adapters/kv/backend.rs       |  5 ++---
 core/src/raw/adapters/typed_kv/backend.rs | 17 +++++++++++------
 core/src/types/buf.rs                     |  2 +-
 core/src/types/reader.rs                  |  4 +++-
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/core/src/raw/adapters/kv/backend.rs 
b/core/src/raw/adapters/kv/backend.rs
index 9b8740f10..7af41dced 100644
--- a/core/src/raw/adapters/kv/backend.rs
+++ b/core/src/raw/adapters/kv/backend.rs
@@ -393,9 +393,8 @@ impl<S: Adapter> oio::Write for KvWriter<S> {
     async fn write(&mut self, bs: &dyn Buf) -> Result<usize> {
         let size = bs.chunk().len();
 
-        let mut buf = self.buf.unwrap_or_else(|| Vec::with_capacity(size));
+        let mut buf = self.buf.take().unwrap_or_else(|| 
Vec::with_capacity(size));
         buf.extend_from_slice(bs.chunk());
-
         self.buf = Some(buf);
 
         Ok(size)
@@ -421,7 +420,7 @@ impl<S: Adapter> oio::BlockingWrite for KvWriter<S> {
     fn write(&mut self, bs: &dyn Buf) -> Result<usize> {
         let size = bs.chunk().len();
 
-        let mut buf = self.buf.unwrap_or_else(|| Vec::with_capacity(size));
+        let mut buf = self.buf.take().unwrap_or_else(|| 
Vec::with_capacity(size));
         buf.extend_from_slice(bs.chunk());
 
         self.buf = Some(buf);
diff --git a/core/src/raw/adapters/typed_kv/backend.rs 
b/core/src/raw/adapters/typed_kv/backend.rs
index 336b04a50..6ed086ba8 100644
--- a/core/src/raw/adapters/typed_kv/backend.rs
+++ b/core/src/raw/adapters/typed_kv/backend.rs
@@ -376,8 +376,8 @@ impl<S> KvWriter<S> {
         }
     }
 
-    fn build(&self) -> Value {
-        let value = self.buf.map(Bytes::from).unwrap_or_default();
+    fn build(&mut self) -> Value {
+        let value = self.buf.take().map(Bytes::from).unwrap_or_default();
 
         let mut metadata = Metadata::new(EntryMode::FILE);
         if let Some(v) = self.op.cache_control() {
@@ -405,7 +405,7 @@ impl<S: Adapter> oio::Write for KvWriter<S> {
     async fn write(&mut self, bs: &dyn Buf) -> Result<usize> {
         let size = bs.chunk().len();
 
-        let mut buf = self.buf.unwrap_or_else(|| Vec::with_capacity(size));
+        let mut buf = self.buf.take().unwrap_or_else(|| 
Vec::with_capacity(size));
         buf.extend_from_slice(bs.chunk());
 
         self.buf = Some(buf);
@@ -419,7 +419,10 @@ impl<S: Adapter> oio::Write for KvWriter<S> {
     }
 
     async fn close(&mut self) -> Result<()> {
-        self.kv.set(&self.path, self.build()).await?;
+        let kv = self.kv.clone();
+        let value = self.build();
+
+        kv.set(&self.path, value).await?;
         Ok(())
     }
 }
@@ -428,7 +431,7 @@ impl<S: Adapter> oio::BlockingWrite for KvWriter<S> {
     fn write(&mut self, bs: &dyn Buf) -> Result<usize> {
         let size = bs.chunk().len();
 
-        let mut buf = self.buf.unwrap_or_else(|| Vec::with_capacity(size));
+        let mut buf = self.buf.take().unwrap_or_else(|| 
Vec::with_capacity(size));
         buf.extend_from_slice(bs.chunk());
 
         self.buf = Some(buf);
@@ -437,8 +440,10 @@ impl<S: Adapter> oio::BlockingWrite for KvWriter<S> {
     }
 
     fn close(&mut self) -> Result<()> {
-        self.kv.blocking_set(&self.path, self.build())?;
+        let kv = self.kv.clone();
+        let value = self.build();
 
+        kv.blocking_set(&self.path, value)?;
         Ok(())
     }
 }
diff --git a/core/src/types/buf.rs b/core/src/types/buf.rs
index 18024641a..2d3076117 100644
--- a/core/src/types/buf.rs
+++ b/core/src/types/buf.rs
@@ -215,6 +215,6 @@ impl Buf for BytesMut {
     #[inline]
     fn copy_to_bytes(&self, len: usize) -> Bytes {
         let size = cmp::min(self.len(), len);
-        Bytes::from(&self[..size])
+        Bytes::copy_from_slice(&self[..size])
     }
 }
diff --git a/core/src/types/reader.rs b/core/src/types/reader.rs
index 1688700d5..6efc8cdad 100644
--- a/core/src/types/reader.rs
+++ b/core/src/types/reader.rs
@@ -266,7 +266,9 @@ mod tests {
         let path = "test_file";
 
         let content = gen_random_bytes();
-        op.write(path, content).await.expect("write must succeed");
+        op.write(path, content.clone())
+            .await
+            .expect("write must succeed");
 
         let mut reader = op.reader(path).await.unwrap();
         let mut buf = Vec::new();

Reply via email to