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

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 5dbe6fe058 fix(services/s3): Mark xml deserialize error as temporary 
during list (#5178)
5dbe6fe058 is described below

commit 5dbe6fe0581e8b5074b4883764a6d02a15f323b7
Author: Xuanwo <[email protected]>
AuthorDate: Mon Oct 14 15:32:18 2024 +0800

    fix(services/s3): Mark xml deserialize error as temporary during list 
(#5178)
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/src/services/s3/lister.rs | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/core/src/services/s3/lister.rs b/core/src/services/s3/lister.rs
index 621d82c224..9063e61044 100644
--- a/core/src/services/s3/lister.rs
+++ b/core/src/services/s3/lister.rs
@@ -23,6 +23,7 @@ use super::error::parse_error;
 use crate::raw::oio::PageContext;
 use crate::raw::*;
 use crate::EntryMode;
+use crate::Error;
 use crate::Metadata;
 use crate::Result;
 use bytes::Buf;
@@ -84,8 +85,14 @@ impl oio::PageList for S3Lister {
         }
         let bs = resp.into_body();
 
-        let output: ListObjectsOutput =
-            de::from_reader(bs.reader()).map_err(new_xml_deserialize_error)?;
+        let output: ListObjectsOutput = de::from_reader(bs.reader())
+            .map_err(new_xml_deserialize_error)
+            // Allow S3 list to retry on XML deserialization errors.
+            //
+            // This is because the S3 list API may return incomplete XML data 
under high load.
+            // We are confident that our XML decoding logic is correct. When 
this error occurs,
+            // we allow retries to obtain the correct data.
+            .map_err(Error::set_temporary)?;
 
         // Try our best to check whether this list is done.
         //
@@ -196,8 +203,14 @@ impl oio::PageList for S3ObjectVersionsLister {
         }
 
         let body = resp.into_body();
-        let output: ListObjectVersionsOutput =
-            de::from_reader(body.reader()).map_err(new_xml_deserialize_error)?;
+        let output: ListObjectVersionsOutput = de::from_reader(body.reader())
+            .map_err(new_xml_deserialize_error)
+            // Allow S3 list to retry on XML deserialization errors.
+            //
+            // This is because the S3 list API may return incomplete XML data 
under high load.
+            // We are confident that our XML decoding logic is correct. When 
this error occurs,
+            // we allow retries to obtain the correct data.
+            .map_err(Error::set_temporary)?;
 
         ctx.done = if let Some(is_truncated) = output.is_truncated {
             !is_truncated

Reply via email to