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)
     }
 }