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

xuanwo pushed a commit to branch hdfs-append
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/hdfs-append by this push:
     new 83add78e0 Create file instead of use write
83add78e0 is described below

commit 83add78e0bd61f6ab35843d621af90dea1f1ec64
Author: Xuanwo <[email protected]>
AuthorDate: Wed Jul 26 14:33:06 2023 +0800

    Create file instead of use write
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/src/services/hdfs/backend.rs | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/core/src/services/hdfs/backend.rs 
b/core/src/services/hdfs/backend.rs
index 69a92f8cb..c1e188a50 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -24,6 +24,7 @@ use std::path::PathBuf;
 use std::sync::Arc;
 
 use async_trait::async_trait;
+use futures::AsyncWriteExt;
 use log::debug;
 
 use super::appender::HdfsAppender;
@@ -258,26 +259,29 @@ impl Accessor for HdfsBackend {
             .create_dir(&parent.to_string_lossy())
             .map_err(parse_io_error)?;
 
-        let f = match self.client.metadata(&p) {
-            Ok(_) =>self
+        if let Err(err) = self.client.metadata(&p) {
+            // Early return if other error happened.
+            if err.kind() != io::ErrorKind::NotFound {
+                return Err(parse_io_error(err));
+            }
+
+            let mut f = self
                 .client
                 .open_file()
-                .append(true)
+                .create(true)
                 .async_open(&p)
                 .await
-                .map_err(parse_io_error)?,
-            Err(err) if err.kind() == io::ErrorKind::NotFound => {
-                self
-                    .client
-                    .open_file()
-                    .create(true)
-                    .write(true)
-                    .async_open(&p)
-                    .await
-                    .map_err(parse_io_error)?
-            },
-            Err(err) => return Err(parse_io_error(err))
-        };
+                .map_err(parse_io_error)?;
+            f.close().await.map_err(parse_io_error)?;
+        }
+
+        let f = self
+            .client
+            .open_file()
+            .append(true)
+            .async_open(&p)
+            .await
+            .map_err(parse_io_error)?;
 
         Ok((RpAppend::new(), HdfsAppender::new(f)))
     }

Reply via email to