[
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]