Skip to content

Commit 05db0d6

Browse files
committed
Make rename closer to correct.
GridFTP assumes the rename semantics are the same as POSIX: the operation is atomic and overwrites the destination file. This is not true for the version of rename exposed by libhdfs - it does not overwrite. So, on failures, we do a non-atomic delete plus rename. It's not the correct semantics, but the best we can do with this version of HDFS.
1 parent 483d40f commit 05db0d6

1 file changed

Lines changed: 12 additions & 5 deletions

File tree

src/gridftp_hdfs.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -451,11 +451,18 @@ hdfs_command(
451451
errno = 0;
452452
if (hdfsRename(hdfs_handle->fs, FromPathName, PathName)) {
453453
if (errno) {
454-
char * rename_msg = (char *)globus_malloc(1024);
455-
snprintf(rename_msg, 1024, "rename from %s", FromPathName);
456-
rename_msg[1023] = '\0';
457-
SystemError(hdfs_handle, rename_msg, result);
458-
globus_free(rename_msg);
454+
int failed = 1;
455+
if (errno == EIO) {
456+
hdfsDelete(hdfs_handle->fs, PathName, 0);
457+
failed = hdfsRename(hdfs_handle->fs, FromPathName, PathName);
458+
}
459+
if (failed) {
460+
char * rename_msg = (char *)globus_malloc(1024);
461+
snprintf(rename_msg, 1024, "rename from %s", FromPathName);
462+
rename_msg[1023] = '\0';
463+
SystemError(hdfs_handle, rename_msg, result);
464+
globus_free(rename_msg);
465+
}
459466
} else {
460467
GenericError(hdfs_handle, "Unable to rename file (reason unknown)", result);
461468
}

0 commit comments

Comments
 (0)