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

suyanhanx pushed a commit to branch update-err-name
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git

commit a7064b5fad91c7966df4f10af46b14db44803ab8
Author: suyanhanx <[email protected]>
AuthorDate: Mon Apr 24 21:40:07 2023 +0800

    update PreconditionFailed to ConditionNotMatch
    
    Signed-off-by: suyanhanx <[email protected]>
---
 core/src/services/azblob/error.rs |  2 +-
 core/src/services/azdfs/error.rs  |  2 +-
 core/src/services/gcs/error.rs    |  2 +-
 core/src/services/http/error.rs   |  2 +-
 core/src/services/obs/error.rs    |  2 +-
 core/src/services/oss/error.rs    |  2 +-
 core/src/services/s3/error.rs     |  3 ++-
 core/src/services/wasabi/error.rs |  2 +-
 core/src/types/error.rs           | 16 +++++++++++-----
 core/tests/behavior/write.rs      |  8 ++++----
 10 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/core/src/services/azblob/error.rs 
b/core/src/services/azblob/error.rs
index 9b52cc4f..c73e956b 100644
--- a/core/src/services/azblob/error.rs
+++ b/core/src/services/azblob/error.rs
@@ -90,7 +90,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/azdfs/error.rs b/core/src/services/azdfs/error.rs
index 3b6d2701..9acc8163 100644
--- a/core/src/services/azdfs/error.rs
+++ b/core/src/services/azdfs/error.rs
@@ -68,7 +68,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/gcs/error.rs b/core/src/services/gcs/error.rs
index efe19868..0f8e262d 100644
--- a/core/src/services/gcs/error.rs
+++ b/core/src/services/gcs/error.rs
@@ -57,7 +57,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/http/error.rs b/core/src/services/http/error.rs
index 5794b8ae..e330e572 100644
--- a/core/src/services/http/error.rs
+++ b/core/src/services/http/error.rs
@@ -31,7 +31,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/obs/error.rs b/core/src/services/obs/error.rs
index 7573157a..3bf328a9 100644
--- a/core/src/services/obs/error.rs
+++ b/core/src/services/obs/error.rs
@@ -45,7 +45,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/oss/error.rs b/core/src/services/oss/error.rs
index a352af70..4e86245f 100644
--- a/core/src/services/oss/error.rs
+++ b/core/src/services/oss/error.rs
@@ -44,7 +44,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (kind, retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/s3/error.rs b/core/src/services/s3/error.rs
index 89f8c522..46a54ec2 100644
--- a/core/src/services/s3/error.rs
+++ b/core/src/services/s3/error.rs
@@ -44,7 +44,8 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (mut kind, mut retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED
+        | StatusCode::NOT_MODIFIED => (ErrorKind::ConditionNotMatch, false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/services/wasabi/error.rs 
b/core/src/services/wasabi/error.rs
index 1eb5407e..04574c9b 100644
--- a/core/src/services/wasabi/error.rs
+++ b/core/src/services/wasabi/error.rs
@@ -44,7 +44,7 @@ pub async fn parse_error(resp: Response<IncomingAsyncBody>) 
-> Result<Error> {
     let (mut kind, mut retryable) = match parts.status {
         StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
         StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
-        StatusCode::PRECONDITION_FAILED => (ErrorKind::PreconditionFailed, 
false),
+        StatusCode::PRECONDITION_FAILED => (ErrorKind::ConditionNotMatch, 
false),
         StatusCode::INTERNAL_SERVER_ERROR
         | StatusCode::BAD_GATEWAY
         | StatusCode::SERVICE_UNAVAILABLE
diff --git a/core/src/types/error.rs b/core/src/types/error.rs
index 6317b5d7..88453c77 100644
--- a/core/src/types/error.rs
+++ b/core/src/types/error.rs
@@ -70,11 +70,17 @@ pub enum ErrorKind {
     RateLimited,
     /// The given file paths are same.
     IsSameFile,
-    /// The preconfition of this operation is not met.
+    /// The condition of this operation is not match.
     ///
-    /// For example, reading a file with If-Match header but the file's ETag
-    /// is not match.
-    PreconditionFailed,
+    /// The `condition` itself is context based.
+    ///
+    /// For example, in S3, the `condition` can be:
+    /// 1. writing a file with If-Match header but the file's ETag is not 
match (will get a 412 Precondition Failed).
+    /// 2. reading a file with If-None-Match header but the file's ETag is 
match (will get a 304 Not Modified).
+    ///
+    /// As OpenDAL cannot handle the `condition not match` error, it will 
always return this error to users.
+    /// So users could to handle this error by themselves.
+    ConditionNotMatch,
     /// The content is truncated.
     ///
     /// This error kind means there are more content to come but been 
truncated.
@@ -121,7 +127,7 @@ impl From<ErrorKind> for &'static str {
             ErrorKind::AlreadyExists => "AlreadyExists",
             ErrorKind::RateLimited => "RateLimited",
             ErrorKind::IsSameFile => "IsSameFile",
-            ErrorKind::PreconditionFailed => "PreconditionFailed",
+            ErrorKind::ConditionNotMatch => "ConditionNotMatch",
             ErrorKind::ContentTruncated => "ContentTruncated",
             ErrorKind::ContentIncomplete => "ContentIncomplete",
         }
diff --git a/core/tests/behavior/write.rs b/core/tests/behavior/write.rs
index 39a6d98d..6a2b66dd 100644
--- a/core/tests/behavior/write.rs
+++ b/core/tests/behavior/write.rs
@@ -248,7 +248,7 @@ pub async fn test_stat_not_exist(op: Operator) -> 
Result<()> {
     Ok(())
 }
 
-/// Stat with if_match should succeed, else get a 412(PreconditionFailed) 
error.
+/// Stat with if_match should succeed, else get a ConditionNotMatch error.
 pub async fn test_stat_with_if_match(op: Operator) -> Result<()> {
     if !op.info().capability().stat_with_if_match {
         return Ok(());
@@ -271,7 +271,7 @@ pub async fn test_stat_with_if_match(op: Operator) -> 
Result<()> {
 
     let res = op.stat_with(&path, op_stat).await;
     assert!(res.is_err());
-    assert_eq!(res.unwrap_err().kind(), ErrorKind::PreconditionFailed);
+    assert_eq!(res.unwrap_err().kind(), ErrorKind::ConditionNotMatch);
 
     let mut op_stat = OpStat::default();
     op_stat = op_stat.with_if_match(meta.etag().expect("etag must exist"));
@@ -471,7 +471,7 @@ pub async fn test_read_not_exist(op: Operator) -> 
Result<()> {
     Ok(())
 }
 
-// Read with if_match should match, else get a 412(Precondition Failed) error.
+// Read with if_match should match, else get a ConditionNotMatch error.
 pub async fn test_read_with_if_match(op: Operator) -> Result<()> {
     if !op.info().capability().read_with_if_match {
         return Ok(());
@@ -492,7 +492,7 @@ pub async fn test_read_with_if_match(op: Operator) -> 
Result<()> {
 
     let res = op.read_with(&path, op_if_match).await;
     assert!(res.is_err());
-    assert_eq!(res.unwrap_err().kind(), ErrorKind::PreconditionFailed);
+    assert_eq!(res.unwrap_err().kind(), ErrorKind::ConditionNotMatch);
 
     let mut op_if_match = OpRead::default();
     op_if_match = op_if_match.with_if_match(meta.etag().expect("etag must 
exist"));

Reply via email to