You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2024/05/21 09:58:39 UTC
(opendal) 02/02: Add buffer size check
This is an automated email from the ASF dual-hosted git repository.
xuanwo pushed a commit to branch read_at_with_exact_size
in repository https://gitbox.apache.org/repos/asf/opendal.git
commit 11ec1726746ef00068138ef65e8b97a81c4b9307
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Tue May 21 17:57:55 2024 +0800
Add buffer size check
Signed-off-by: Xuanwo <gi...@xuanwo.io>
---
core/src/layers/complete.rs | 22 ++++++++++++++++++--
core/src/raw/enum_utils.rs | 48 ++++++++++++++++++++++----------------------
core/src/raw/oio/read/api.rs | 4 ++--
3 files changed, 46 insertions(+), 28 deletions(-)
diff --git a/core/src/layers/complete.rs b/core/src/layers/complete.rs
index 793f7fa722..0d38a4a450 100644
--- a/core/src/layers/complete.rs
+++ b/core/src/layers/complete.rs
@@ -592,7 +592,16 @@ impl<R: oio::Read> oio::Read for CompleteReader<R> {
return Ok(Buffer::new());
}
- self.0.read_at(offset, size).await
+ let buf = self.0.read_at(offset, size).await?;
+ if buf.len() != size {
+ return Err(Error::new(
+ ErrorKind::RangeNotSatisfied,
+ "service didn't return the expected size",
+ )
+ .with_context("expect", size.to_string())
+ .with_context("actual", buf.len().to_string()));
+ }
+ Ok(buf)
}
}
@@ -602,7 +611,16 @@ impl<R: oio::BlockingRead> oio::BlockingRead for CompleteReader<R> {
return Ok(Buffer::new());
}
- self.0.read_at(offset, size)
+ let buf = self.0.read_at(offset, size)?;
+ if buf.len() != size {
+ return Err(Error::new(
+ ErrorKind::RangeNotSatisfied,
+ "service didn't return the expected size",
+ )
+ .with_context("expect", size.to_string())
+ .with_context("actual", buf.len().to_string()));
+ }
+ Ok(buf)
}
}
diff --git a/core/src/raw/enum_utils.rs b/core/src/raw/enum_utils.rs
index 40c3b95902..6c614a7524 100644
--- a/core/src/raw/enum_utils.rs
+++ b/core/src/raw/enum_utils.rs
@@ -52,19 +52,19 @@ pub enum TwoWays<ONE, TWO> {
}
impl<ONE: oio::Read, TWO: oio::Read> oio::Read for TwoWays<ONE, TWO> {
- async fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ async fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- TwoWays::One(v) => v.read_at(offset, limit).await,
- TwoWays::Two(v) => v.read_at(offset, limit).await,
+ TwoWays::One(v) => v.read_at(offset, size).await,
+ TwoWays::Two(v) => v.read_at(offset, size).await,
}
}
}
impl<ONE: oio::BlockingRead, TWO: oio::BlockingRead> oio::BlockingRead for TwoWays<ONE, TWO> {
- fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- Self::One(v) => v.read_at(offset, limit),
- Self::Two(v) => v.read_at(offset, limit),
+ Self::One(v) => v.read_at(offset, size),
+ Self::Two(v) => v.read_at(offset, size),
}
}
}
@@ -105,11 +105,11 @@ pub enum ThreeWays<ONE, TWO, THREE> {
}
impl<ONE: oio::Read, TWO: oio::Read, THREE: oio::Read> oio::Read for ThreeWays<ONE, TWO, THREE> {
- async fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ async fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- ThreeWays::One(v) => v.read_at(offset, limit).await,
- ThreeWays::Two(v) => v.read_at(offset, limit).await,
- ThreeWays::Three(v) => v.read_at(offset, limit).await,
+ ThreeWays::One(v) => v.read_at(offset, size).await,
+ ThreeWays::Two(v) => v.read_at(offset, size).await,
+ ThreeWays::Three(v) => v.read_at(offset, size).await,
}
}
}
@@ -117,11 +117,11 @@ impl<ONE: oio::Read, TWO: oio::Read, THREE: oio::Read> oio::Read for ThreeWays<O
impl<ONE: oio::BlockingRead, TWO: oio::BlockingRead, THREE: oio::BlockingRead> oio::BlockingRead
for ThreeWays<ONE, TWO, THREE>
{
- fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- Self::One(v) => v.read_at(offset, limit),
- Self::Two(v) => v.read_at(offset, limit),
- Self::Three(v) => v.read_at(offset, limit),
+ Self::One(v) => v.read_at(offset, size),
+ Self::Two(v) => v.read_at(offset, size),
+ Self::Three(v) => v.read_at(offset, size),
}
}
}
@@ -175,12 +175,12 @@ where
THREE: oio::Read,
FOUR: oio::Read,
{
- async fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ async fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- FourWays::One(v) => v.read_at(offset, limit).await,
- FourWays::Two(v) => v.read_at(offset, limit).await,
- FourWays::Three(v) => v.read_at(offset, limit).await,
- FourWays::Four(v) => v.read_at(offset, limit).await,
+ FourWays::One(v) => v.read_at(offset, size).await,
+ FourWays::Two(v) => v.read_at(offset, size).await,
+ FourWays::Three(v) => v.read_at(offset, size).await,
+ FourWays::Four(v) => v.read_at(offset, size).await,
}
}
}
@@ -192,12 +192,12 @@ where
THREE: oio::BlockingRead,
FOUR: oio::BlockingRead,
{
- fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
+ fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
match self {
- Self::One(v) => v.read_at(offset, limit),
- Self::Two(v) => v.read_at(offset, limit),
- Self::Three(v) => v.read_at(offset, limit),
- Self::Four(v) => v.read_at(offset, limit),
+ Self::One(v) => v.read_at(offset, size),
+ Self::Two(v) => v.read_at(offset, size),
+ Self::Three(v) => v.read_at(offset, size),
+ Self::Four(v) => v.read_at(offset, size),
}
}
}
diff --git a/core/src/raw/oio/read/api.rs b/core/src/raw/oio/read/api.rs
index cb76986d6b..75c388a5de 100644
--- a/core/src/raw/oio/read/api.rs
+++ b/core/src/raw/oio/read/api.rs
@@ -234,7 +234,7 @@ impl BlockingRead for Buffer {
/// `Arc<dyn BlockingRead>` won't implement `BlockingRead` automatically.
/// To make BlockingReader work as expected, we must add this impl.
impl<T: BlockingRead + ?Sized> BlockingRead for Arc<T> {
- fn read_at(&self, offset: u64, limit: usize) -> Result<Buffer> {
- (**self).read_at(offset, limit)
+ fn read_at(&self, offset: u64, size: usize) -> Result<Buffer> {
+ (**self).read_at(offset, size)
}
}