From 2d847e7d620f97ebe8e9297361e2541d7d0ecd50 Mon Sep 17 00:00:00 2001 From: Vinayakumar B Date: Tue, 2 Jun 2015 16:41:19 +0530 Subject: [PATCH] HDFS-8444. Erasure Coding: fix cannot rename a zone dir (Contributed by Walter Su) --- .../hadoop-hdfs/CHANGES-HDFS-EC-7285.txt | 3 +++ .../namenode/ErasureCodingZoneManager.java | 9 ++++++-- .../hadoop/hdfs/TestErasureCodingZones.java | 21 ++++++++++++------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt index e7335b2165..c3c55c731a 100755 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt @@ -268,3 +268,6 @@ HDFS-8336. Expose some administrative erasure coding operations to HdfsAdmin (Uma Maheswara Rao G via vinayakumarb) + + HDFS-8444. Erasure Coding: fix cannot rename a zone dir + (Walter Su via vinayakumarb) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ErasureCodingZoneManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ErasureCodingZoneManager.java index 4b3e747927..e853829be5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ErasureCodingZoneManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ErasureCodingZoneManager.java @@ -153,8 +153,13 @@ XAttr createErasureCodingZone(String src, ECSchema schema, int cellSize) void checkMoveValidity(INodesInPath srcIIP, INodesInPath dstIIP, String src) throws IOException { assert dir.hasReadLock(); - final ECSchema srcSchema = getECSchema(srcIIP); - final ECSchema dstSchema = getECSchema(dstIIP); + final ErasureCodingZone srcZone = getECZone(srcIIP); + final ErasureCodingZone dstZone = getECZone(dstIIP); + if (srcZone != null && srcZone.getDir().equals(src) && dstZone == null) { + return; + } + final ECSchema srcSchema = (srcZone != null) ? srcZone.getSchema() : null; + final ECSchema dstSchema = (dstZone != null) ? dstZone.getSchema() : null; if ((srcSchema != null && !srcSchema.equals(dstSchema)) || (dstSchema != null && !dstSchema.equals(srcSchema))) { throw new IOException( diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestErasureCodingZones.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestErasureCodingZones.java index d724b53d6f..1a10ebff9b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestErasureCodingZones.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestErasureCodingZones.java @@ -119,15 +119,20 @@ public void testMoveValidity() throws IOException, InterruptedException { final Path srcFile = new Path(srcECDir, "foo"); fs.create(srcFile); - /* Verify that a file can be moved between 2 EC zones */ - try { - fs.rename(srcFile, dstECDir); - } catch (IOException e) { - fail("A file should be able to move between 2 EC zones " + e); - } + // Test move dir + // Move EC dir under non-EC dir + final Path newDir = new Path("/srcEC_new"); + fs.rename(srcECDir, newDir); + fs.rename(newDir, srcECDir); // move back - // Move the file back - fs.rename(new Path(dstECDir, "foo"), srcECDir); + // Move EC dir under another EC dir + fs.rename(srcECDir, dstECDir); + fs.rename(new Path("/dstEC/srcEC"), srcECDir); // move back + + // Test move file + /* Verify that a file can be moved between 2 EC zones */ + fs.rename(srcFile, dstECDir); + fs.rename(new Path(dstECDir, "foo"), srcECDir); // move back /* Verify that a file cannot be moved from a non-EC dir to an EC zone */ final Path nonECDir = new Path("/nonEC");