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();
