diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 17718ba86df..3dfdc6a0c4a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -714,6 +714,8 @@ Release 2.6.0 - UNRELEASED HDFS-7147. Update archival storage user documentation. (Tsz Wo Nicholas Sze via wheat9) + HDFS-7340. Make rollingUpgrade start/finalize idempotent. (jing9) + BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS HDFS-6387. HDFS CLI admin tool for creating & deleting an diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 95d25f24b03..0b6973d118b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -8282,6 +8282,9 @@ public class FSNamesystem implements Namesystem, FSClusterStats, writeLock(); try { checkOperation(OperationCategory.WRITE); + if (isRollingUpgrade()) { + return rollingUpgradeInfo; + } long startTime = now(); if (!haEnabled) { // for non-HA, we require NN to be in safemode startRollingUpgradeInternalForNonHA(startTime); @@ -8390,13 +8393,16 @@ public class FSNamesystem implements Namesystem, FSClusterStats, } } - RollingUpgradeInfo finalizeRollingUpgrade() throws IOException { + void finalizeRollingUpgrade() throws IOException { checkSuperuserPrivilege(); checkOperation(OperationCategory.WRITE); writeLock(); final RollingUpgradeInfo returnInfo; try { checkOperation(OperationCategory.WRITE); + if (!isRollingUpgrade()) { + return; + } checkNameNodeSafeMode("Failed to finalize rolling upgrade"); returnInfo = finalizeRollingUpgradeInternal(now()); @@ -8420,16 +8426,11 @@ public class FSNamesystem implements Namesystem, FSClusterStats, if (auditLog.isInfoEnabled() && isExternalInvocation()) { logAuditEvent(true, "finalizeRollingUpgrade", null, null, null); } - return returnInfo; + return; } RollingUpgradeInfo finalizeRollingUpgradeInternal(long finalizeTime) throws RollingUpgradeException { - if (!isRollingUpgrade()) { - throw new RollingUpgradeException( - "Failed to finalize rolling upgrade since there is no rolling upgrade in progress."); - } - final long startTime = rollingUpgradeInfo.getStartTime(); rollingUpgradeInfo = null; return new RollingUpgradeInfo(blockPoolId, false, startTime, finalizeTime); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java index 0b74e092325..4100ba72241 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java @@ -954,7 +954,8 @@ class NameNodeRpcServer implements NamenodeProtocols { case PREPARE: return namesystem.startRollingUpgrade(); case FINALIZE: - return namesystem.finalizeRollingUpgrade(); + namesystem.finalizeRollingUpgrade(); + return null; default: throw new UnsupportedActionException(action + " is not yet supported."); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java index 041bc3d26ed..0d040f3e14a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/DFSAdmin.java @@ -331,7 +331,8 @@ public class DFSAdmin extends FsShell { out.println(info); } } else { - out.println("There is no rolling upgrade in progress."); + out.println("There is no rolling upgrade in progress or rolling " + + "upgrade has already been finalized."); } } @@ -353,7 +354,7 @@ public class DFSAdmin extends FsShell { Preconditions.checkState(info.isStarted()); break; case FINALIZE: - Preconditions.checkState(info.isFinalized()); + Preconditions.checkState(info == null || info.isFinalized()); break; } printMessage(info, System.out); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestRollingUpgrade.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestRollingUpgrade.java index a22312f3980..aa3f362bb06 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestRollingUpgrade.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestRollingUpgrade.java @@ -239,9 +239,9 @@ public class TestRollingUpgrade { Assert.assertTrue(dfs2.exists(baz)); //finalize rolling upgrade - final RollingUpgradeInfo finalize = dfs2.rollingUpgrade(RollingUpgradeAction.FINALIZE); - LOG.info("FINALIZE: " + finalize); - Assert.assertEquals(info1.getStartTime(), finalize.getStartTime()); + final RollingUpgradeInfo finalize = dfs2.rollingUpgrade( + RollingUpgradeAction.FINALIZE); + Assert.assertNull(finalize); LOG.info("RESTART cluster 2 with regular startup option"); cluster2.getNameNodeInfos()[0].setStartOpt(StartupOption.REGULAR); @@ -385,7 +385,7 @@ public class TestRollingUpgrade { Assert.assertTrue(fsimage.hasRollbackFSImage()); info = dfs.rollingUpgrade(RollingUpgradeAction.FINALIZE); - Assert.assertTrue(info.isFinalized()); + Assert.assertNull(info); Assert.assertTrue(dfs.exists(foo)); // Once finalized, there should be no more fsimage for rollbacks.