diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index cd9b7b87d3365..08ab7e72542c7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -682,6 +682,9 @@ Release 2.7.1 - UNRELEASED HDFS-8091: ACLStatus and XAttributes should be presented to INodeAttributesProvider before returning to client (asuresh) + HDFS-8305: HDFS INotify: the destination field of RenameOp should always + end with the file name (cmccabe) + Release 2.7.0 - 2015-04-20 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java index c57cae2bf0e33..4a20a62d2e75e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java @@ -476,7 +476,7 @@ private static boolean renameTo(FSDirectory fsd, FSPermissionChecker pc, fsd.writeUnlock(); } if (stat) { - fsd.getEditLog().logRename(src, dst, mtime, logRetryCache); + fsd.getEditLog().logRename(src, actualDst, mtime, logRetryCache); return true; } return false; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java index bda827aee1677..28e150c169c71 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java @@ -815,7 +815,9 @@ public void logMkDir(String path, INode newNode) { } /** - * Add rename record to edit log + * Add rename record to edit log. + * + * The destination should be the file name, not the destination directory. * TODO: use String parameters until just before writing to disk */ void logRename(String src, String dst, long timestamp, boolean toLogRpcIds) { @@ -826,9 +828,11 @@ void logRename(String src, String dst, long timestamp, boolean toLogRpcIds) { logRpcIds(op, toLogRpcIds); logEdit(op); } - + /** - * Add rename record to edit log + * Add rename record to edit log. + * + * The destination should be the file name, not the destination directory. */ void logRename(String src, String dst, long timestamp, boolean toLogRpcIds, Options.Rename... options) { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSInotifyEventInputStream.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSInotifyEventInputStream.java index 6e91e06405eb8..ba33bd3ec4801 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSInotifyEventInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSInotifyEventInputStream.java @@ -135,6 +135,7 @@ public void testBasic() throws IOException, URISyntaxException, client.setAcl("/file5", AclEntry.parseAclSpec( "user::rwx,user:foo:rw-,group::r--,other::---", true)); client.removeAcl("/file5"); // SetAclOp -> MetadataUpdateEvent + client.rename("/file5", "/dir"); // RenameOldOp -> RenameEvent EventBatch batch = null; @@ -343,6 +344,16 @@ public void testBasic() throws IOException, URISyntaxException, Event.MetadataUpdateEvent.MetadataType.ACLS); Assert.assertTrue(mue8.getAcls() == null); + // RenameOp (2) + batch = waitForNextEvents(eis); + Assert.assertEquals(1, batch.getEvents().length); + txid = checkTxid(batch, txid); + Assert.assertTrue(batch.getEvents()[0].getEventType() == Event.EventType.RENAME); + Event.RenameEvent re3 = (Event.RenameEvent) batch.getEvents()[0]; + Assert.assertTrue(re3.getDstPath().equals("/dir/file5")); + Assert.assertTrue(re3.getSrcPath().equals("/file5")); + Assert.assertTrue(re.getTimestamp() > 0); + // Returns null when there are no further events Assert.assertTrue(eis.poll() == null);