[ 
https://issues.apache.org/jira/browse/HDFS-3592?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18073695#comment-18073695
 ] 

ASF GitHub Bot commented on HDFS-3592:
--------------------------------------

Hexiaoqiao commented on code in PR #8411:
URL: https://github.com/apache/hadoop/pull/8411#discussion_r3085314742


##########
hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/hdfs.c:
##########
@@ -2759,24 +2763,48 @@ int hdfsRename(hdfsFS fs, const char *oldPath, const 
char *newPath)
         goto done;
     }
 
-    // Rename the file
-    // TODO: use rename2 here?  (See HDFS-3592)
-    jthr = invokeMethod(env, &jVal, INSTANCE, jFS, JC_FILE_SYSTEM,
-            "rename", JMETHOD2(JPARAM(HADOOP_PATH), JPARAM
-            (HADOOP_PATH), "Z"), jOldPath, jNewPath);
+    jthr = fetchEnumInstance(env, "org/apache/hadoop/fs/Options$Rename", 
"NONE",
+            &jRenameOptionsNone);
     if (jthr) {
         errno = printExceptionAndFree(env, jthr, PRINT_EXC_ALL,
-            "hdfsRename(oldPath=%s, newPath=%s): FileSystem#rename",
-            oldPath, newPath);
+            "hdfsRename: Options.Rename.NONE");
         goto done;
     }
-    if (!jVal.z) {
-        errno = EIO;
+    enumClass = (*env)->GetObjectClass(env, jRenameOptionsNone);
+    if (!enumClass) {
+        errno = printPendingExceptionAndFree(env, PRINT_EXC_ALL,
+            "hdfsRename: GetObjectClass(Options.Rename)");
+        goto done;
+    }
+    jOptsArr = (*env)->NewObjectArray(env, 1, enumClass, NULL);
+    if (!jOptsArr) {
+        errno = printPendingExceptionAndFree(env, PRINT_EXC_ALL,
+            "hdfsRename: NewObjectArray");
+        goto done;
+    }
+    (*env)->SetObjectArrayElement(env, jOptsArr, 0, jRenameOptionsNone);
+    if ((*env)->ExceptionCheck(env)) {
+        errno = printPendingExceptionAndFree(env, PRINT_EXC_ALL,
+            "hdfsRename: SetObjectArrayElement");
+        goto done;
+    }
+
+    jthr = invokeMethod(env, NULL, INSTANCE, jFS, JC_FILE_SYSTEM,
+            "rename", JMETHOD3(JPARAM(HADOOP_PATH), JPARAM(HADOOP_PATH),
+            "[Lorg/apache/hadoop/fs/Options$Rename;", JAVA_VOID),
+            jOldPath, jNewPath, jOptsArr);
+    if (jthr) {
+        errno = printExceptionAndFree(env, jthr, PRINT_EXC_ALL,
+            "hdfsRename(oldPath=%s, newPath=%s): FileSystem#rename(rename2)",
+            oldPath, newPath);
         goto done;
     }
     ret = 0;
 
 done:
+    destroyLocalReference(env, jOldPath);
+    destroyLocalReference(env, jNewPath);

Review Comment:
   destroy the reference `jOldPath` and `jNewPath` twice here.



##########
hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/hdfs.c:
##########
@@ -2759,24 +2763,48 @@ int hdfsRename(hdfsFS fs, const char *oldPath, const 
char *newPath)
         goto done;
     }
 
-    // Rename the file
-    // TODO: use rename2 here?  (See HDFS-3592)
-    jthr = invokeMethod(env, &jVal, INSTANCE, jFS, JC_FILE_SYSTEM,
-            "rename", JMETHOD2(JPARAM(HADOOP_PATH), JPARAM
-            (HADOOP_PATH), "Z"), jOldPath, jNewPath);
+    jthr = fetchEnumInstance(env, "org/apache/hadoop/fs/Options$Rename", 
"NONE",
+            &jRenameOptionsNone);
     if (jthr) {
         errno = printExceptionAndFree(env, jthr, PRINT_EXC_ALL,
-            "hdfsRename(oldPath=%s, newPath=%s): FileSystem#rename",
-            oldPath, newPath);
+            "hdfsRename: Options.Rename.NONE");

Review Comment:
   Why did remove path in log message here?





> libhdfs should use ClientProtocol::rename2
> ------------------------------------------
>
>                 Key: HDFS-3592
>                 URL: https://issues.apache.org/jira/browse/HDFS-3592
>             Project: Hadoop HDFS
>          Issue Type: Improvement
>    Affects Versions: 2.0.0-alpha, 3.0.0-alpha1
>            Reporter: Colin McCabe
>            Assignee: Colin McCabe
>            Priority: Minor
>              Labels: BB2015-05-TBR, pull-request-available
>         Attachments: HDFS-3592.001.patch
>
>
> It would be nice if libhdfs exposed rename2.  This version of rename is much 
> more verbose about any errors that occur-- it throws AccessControlException, 
> FileAlreadyExists, FileNotFoundException, ParentNotDirectoryException, etc.
> The original rename returns false in many distinct cases, making it ambiguous 
> exactly what the problem was.
> For something like fuse_dfs, it is very important to return the correct errno 
> code when an error has occurred.  rename2 would allow us to do that.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to