You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by ji...@apache.org on 2013/10/08 02:10:34 UTC
svn commit: r1530115 - in
/hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs: ./
src/main/java/org/apache/hadoop/hdfs/server/namenode/
src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/
Author: jing9
Date: Tue Oct 8 00:10:33 2013
New Revision: 1530115
URL: http://svn.apache.org/r1530115
Log:
HDFS-5291. Merge change r1530113 from branch-2.
Modified:
hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SafeModeException.java
hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java
Modified: hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1530115&r1=1530114&r2=1530115&view=diff
==============================================================================
--- hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Tue Oct 8 00:10:33 2013
@@ -64,6 +64,9 @@ Release 2.2.0 - 2013-10-13
HDFS-5259. Support client which combines appended data with old data
before sends it to NFS server. (brandonli)
+ HDFS-5291. Standby namenode after transition to active goes into safemode.
+ (jing9)
+
Release 2.1.1-beta - 2013-09-23
INCOMPATIBLE CHANGES
Modified: hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=1530115&r1=1530114&r2=1530115&view=diff
==============================================================================
--- hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Tue Oct 8 00:10:33 2013
@@ -208,6 +208,7 @@ import org.apache.hadoop.io.Text;
import org.apache.hadoop.ipc.RetryCache;
import org.apache.hadoop.ipc.RetryCache.CacheEntry;
import org.apache.hadoop.ipc.RetryCache.CacheEntryWithPayload;
+import org.apache.hadoop.ipc.RetriableException;
import org.apache.hadoop.ipc.Server;
import org.apache.hadoop.ipc.StandbyException;
import org.apache.hadoop.metrics2.annotation.Metric;
@@ -1031,6 +1032,26 @@ public class FSNamesystem implements Nam
}
}
+ /**
+ * @throws RetriableException
+ * If 1) The NameNode is in SafeMode, 2) HA is enabled, and 3)
+ * NameNode is in active state
+ * @throws SafeModeException
+ * Otherwise if NameNode is in SafeMode.
+ */
+ private void checkNameNodeSafeMode(String errorMsg)
+ throws RetriableException, SafeModeException {
+ if (isInSafeMode()) {
+ SafeModeException se = new SafeModeException(errorMsg, safeMode);
+ if (haEnabled && haContext != null
+ && haContext.getState().getServiceState() == HAServiceState.ACTIVE) {
+ throw new RetriableException(se);
+ } else {
+ throw se;
+ }
+ }
+ }
+
public static Collection<URI> getNamespaceDirs(Configuration conf) {
return getStorageDirs(conf, DFS_NAMENODE_NAME_DIR_KEY);
}
@@ -1331,9 +1352,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot set permission for " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot set permission for " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
checkOwner(pc, src);
dir.setPermission(src, permission);
@@ -1370,9 +1389,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot set owner for " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot set owner for " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
checkOwner(pc, src);
if (!pc.isSuperUser()) {
@@ -1452,8 +1469,14 @@ public class FSNamesystem implements Nam
for (LocatedBlock b : ret.getLocatedBlocks()) {
// if safemode & no block locations yet then throw safemodeException
if ((b.getLocations() == null) || (b.getLocations().length == 0)) {
- throw new SafeModeException("Zero blocklocations for " + src,
- safeMode);
+ SafeModeException se = new SafeModeException(
+ "Zero blocklocations for " + src, safeMode);
+ if (haEnabled && haContext != null &&
+ haContext.getState().getServiceState() == HAServiceState.ACTIVE) {
+ throw new RetriableException(se);
+ } else {
+ throw se;
+ }
}
}
}
@@ -1594,9 +1617,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot concat " + target, safeMode);
- }
+ checkNameNodeSafeMode("Cannot concat " + target);
concatInternal(pc, target, srcs, logRetryCache);
resultingStat = getAuditFileInfo(target, false);
} finally {
@@ -1744,9 +1765,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot set times " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot set times " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
// Write access is required to set access and modification times
@@ -1813,9 +1832,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot create symlink " + link, safeMode);
- }
+ checkNameNodeSafeMode("Cannot create symlink " + link);
link = FSDirectory.resolvePath(link, pathComponents, dir);
if (!createParent) {
verifyParentDir(link);
@@ -1873,9 +1890,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot set replication for " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot set replication for " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
if (isPermissionEnabled) {
checkPathAccess(pc, src, FsAction.WRITE);
@@ -2005,9 +2020,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot create file" + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot create file" + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
startFileInternal(pc, src, permissions, holder, clientMachine, create,
overwrite, createParent, replication, blockSize, logRetryCache);
@@ -2225,10 +2238,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException(
- "Cannot recover the lease of " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot recover the lease of " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
final INodeFile inode = INodeFile.valueOf(dir.getINode(src), src);
if (!inode.isUnderConstruction()) {
@@ -2379,9 +2389,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot append to file" + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot append to file" + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
lb = appendFileInternal(pc, src, holder, clientMachine, logRetryCache);
} catch (StandbyException se) {
@@ -2531,9 +2539,7 @@ public class FSNamesystem implements Nam
checkBlock(previous);
onRetryBlock[0] = null;
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot add block to " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot add block to " + src);
// have we exceeded the configured limit of fs objects.
checkFsObjectLimit();
@@ -2642,10 +2648,7 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.READ);
//check safe mode
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot add datanode; src=" + src
- + ", blk=" + blk, safeMode);
- }
+ checkNameNodeSafeMode("Cannot add datanode; src=" + src + ", blk=" + blk);
src = FSDirectory.resolvePath(src, pathComponents, dir);
//check lease
@@ -2690,10 +2693,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot abandon block " + b +
- " for fle" + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot abandon block " + b + " for fle" + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
//
@@ -2776,9 +2776,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot complete file " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot complete file " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
success = completeFileInternal(src, holder,
ExtendedBlock.getLocalBlock(last), fileId);
@@ -2954,9 +2952,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot rename " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot rename " + src);
src = FSDirectory.resolvePath(src, srcComponents, dir);
dst = FSDirectory.resolvePath(dst, dstComponents, dir);
checkOperation(OperationCategory.WRITE);
@@ -3022,9 +3018,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot rename " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot rename " + src);
src = FSDirectory.resolvePath(src, srcComponents, dir);
dst = FSDirectory.resolvePath(dst, dstComponents, dir);
renameToInternal(pc, src, dst, cacheEntry != null, options);
@@ -3126,9 +3120,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot delete " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot delete " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
if (!recursive && dir.isNonEmptyDirectory(src)) {
throw new IOException(src + " is non empty");
@@ -3351,9 +3343,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot create directory " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot create directory " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
status = mkdirsInternal(pc, src, permissions, createParent);
if (status) {
@@ -3434,9 +3424,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot set quota on " + path, safeMode);
- }
+ checkNameNodeSafeMode("Cannot set quota on " + path);
dir.setQuota(path, nsQuota, dsQuota);
} finally {
writeUnlock();
@@ -3459,9 +3447,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot fsync file " + src, safeMode);
- }
+ checkNameNodeSafeMode("Cannot fsync file " + src);
src = FSDirectory.resolvePath(src, pathComponents, dir);
INodeFileUnderConstruction pendingFile = checkLease(src, clientName);
if (lastBlockLength > 0) {
@@ -3686,11 +3672,8 @@ public class FSNamesystem implements Nam
// If a DN tries to commit to the standby, the recovery will
// fail, and the next retry will succeed on the new NN.
- if (isInSafeMode()) {
- throw new SafeModeException(
- "Cannot commitBlockSynchronization while in safe mode",
- safeMode);
- }
+ checkNameNodeSafeMode(
+ "Cannot commitBlockSynchronization while in safe mode");
final BlockInfo storedBlock = getStoredBlock(
ExtendedBlock.getLocalBlock(lastblock));
if (storedBlock == null) {
@@ -3836,9 +3819,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot renew lease for " + holder, safeMode);
- }
+ checkNameNodeSafeMode("Cannot renew lease for " + holder);
leaseManager.renewLease(holder);
} finally {
writeUnlock();
@@ -4212,8 +4193,8 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.UNCHECKED);
if (!isInSafeMode()) {
- throw new IOException("Safe mode should be turned ON " +
- "in order to create namespace image.");
+ throw new IOException("Safe mode should be turned ON "
+ + "in order to create namespace image.");
}
getFSImage().saveNamespace(this);
success = true;
@@ -4290,7 +4271,7 @@ public class FSNamesystem implements Nam
* replicas, and calculates the ratio of safe blocks to the total number
* of blocks in the system, which is the size of blocks in
* {@link FSNamesystem#blockManager}. When the ratio reaches the
- * {@link #threshold} it starts the {@link SafeModeMonitor} daemon in order
+ * {@link #threshold} it starts the SafeModeMonitor daemon in order
* to monitor whether the safe mode {@link #extension} is passed.
* Then it leaves safe mode and destroys itself.
* <p>
@@ -4298,10 +4279,9 @@ public class FSNamesystem implements Nam
* not tracked because the name node is not intended to leave safe mode
* automatically in the case.
*
- * @see ClientProtocol#setSafeMode(HdfsConstants.SafeModeAction)
- * @see SafeModeMonitor
+ * @see ClientProtocol#setSafeMode(HdfsConstants.SafeModeAction, boolean)
*/
- class SafeModeInfo {
+ public class SafeModeInfo {
// configuration fields
/** Safe mode threshold condition %.*/
private double threshold;
@@ -5043,9 +5023,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.JOURNAL);
- if (isInSafeMode()) {
- throw new SafeModeException("Log not rolled", safeMode);
- }
+ checkNameNodeSafeMode("Log not rolled");
LOG.info("Roll Edit Log from " + Server.getRemoteAddress());
return getFSImage().rollEditLog();
} finally {
@@ -5066,9 +5044,7 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.CHECKPOINT);
- if (isInSafeMode()) {
- throw new SafeModeException("Checkpoint not started", safeMode);
- }
+ checkNameNodeSafeMode("Checkpoint not started");
LOG.info("Start checkpoint for " + backupNode.getAddress());
cmd = getFSImage().startCheckpoint(backupNode, activeNamenode);
getEditLog().logSync();
@@ -5102,9 +5078,7 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.CHECKPOINT);
- if (isInSafeMode()) {
- throw new SafeModeException("Checkpoint not ended", safeMode);
- }
+ checkNameNodeSafeMode("Checkpoint not ended");
LOG.info("End checkpoint for " + registration.getAddress());
getFSImage().endCheckpoint(sig);
success = true;
@@ -5434,10 +5408,7 @@ public class FSNamesystem implements Nam
long nextGenerationStamp(boolean legacyBlock)
throws IOException, SafeModeException {
assert hasWriteLock();
- if (isInSafeMode()) {
- throw new SafeModeException(
- "Cannot get next generation stamp", safeMode);
- }
+ checkNameNodeSafeMode("Cannot get next generation stamp");
long gs;
if (legacyBlock) {
@@ -5490,12 +5461,9 @@ public class FSNamesystem implements Nam
/**
* Increments, logs and then returns the block ID
*/
- private long nextBlockId() throws SafeModeException {
+ private long nextBlockId() throws IOException {
assert hasWriteLock();
- if (isInSafeMode()) {
- throw new SafeModeException(
- "Cannot get next block ID", safeMode);
- }
+ checkNameNodeSafeMode("Cannot get next block ID");
final long blockId = blockIdGenerator.nextValue();
getEditLog().logAllocateBlockId(blockId);
// NB: callers sync the log
@@ -5505,10 +5473,8 @@ public class FSNamesystem implements Nam
private INodeFileUnderConstruction checkUCBlock(ExtendedBlock block,
String clientName) throws IOException {
assert hasWriteLock();
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot get a new generation stamp and an " +
- "access token for block " + block, safeMode);
- }
+ checkNameNodeSafeMode("Cannot get a new generation stamp and an "
+ + "access token for block " + block);
// check stored block state
BlockInfo storedBlock = getStoredBlock(ExtendedBlock.getLocalBlock(block));
@@ -5621,9 +5587,7 @@ public class FSNamesystem implements Nam
boolean success = false;
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Pipeline not updated", safeMode);
- }
+ checkNameNodeSafeMode("Pipeline not updated");
assert newBlock.getBlockId()==oldBlock.getBlockId() : newBlock + " and "
+ oldBlock + " has different block identifier";
updatePipelineInternal(clientName, oldBlock, newBlock, newNodes,
@@ -5883,9 +5847,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot issue delegation token", safeMode);
- }
+ checkNameNodeSafeMode("Cannot issue delegation token");
if (!isAllowedDelegationTokenOp()) {
throw new IOException(
"Delegation Token can be issued only with kerberos or web authentication");
@@ -5930,9 +5892,7 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot renew delegation token", safeMode);
- }
+ checkNameNodeSafeMode("Cannot renew delegation token");
if (!isAllowedDelegationTokenOp()) {
throw new IOException(
"Delegation Token can be renewed only with kerberos or web authentication");
@@ -5963,9 +5923,7 @@ public class FSNamesystem implements Nam
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot cancel delegation token", safeMode);
- }
+ checkNameNodeSafeMode("Cannot cancel delegation token");
String canceller = getRemoteUser().getUserName();
DelegationTokenIdentifier id = dtSecretManager
.cancelToken(token, canceller);
@@ -6383,10 +6341,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot allow snapshot for " + path,
- safeMode);
- }
+ checkNameNodeSafeMode("Cannot allow snapshot for " + path);
checkSuperuserPrivilege();
dir.writeLock();
@@ -6411,10 +6366,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot disallow snapshot for " + path,
- safeMode);
- }
+ checkNameNodeSafeMode("Cannot disallow snapshot for " + path);
checkSuperuserPrivilege();
dir.writeLock();
@@ -6452,10 +6404,7 @@ public class FSNamesystem implements Nam
String snapshotPath = null;
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot create snapshot for "
- + snapshotRoot, safeMode);
- }
+ checkNameNodeSafeMode("Cannot create snapshot for " + snapshotRoot);
if (isPermissionEnabled) {
checkOwner(pc, snapshotRoot);
}
@@ -6504,10 +6453,7 @@ public class FSNamesystem implements Nam
boolean success = false;
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException("Cannot rename snapshot for " + path,
- safeMode);
- }
+ checkNameNodeSafeMode("Cannot rename snapshot for " + path);
if (isPermissionEnabled) {
checkOwner(pc, path);
}
@@ -6622,10 +6568,7 @@ public class FSNamesystem implements Nam
writeLock();
try {
checkOperation(OperationCategory.WRITE);
- if (isInSafeMode()) {
- throw new SafeModeException(
- "Cannot delete snapshot for " + snapshotRoot, safeMode);
- }
+ checkNameNodeSafeMode("Cannot delete snapshot for " + snapshotRoot);
if (isPermissionEnabled) {
checkOwner(pc, snapshotRoot);
}
Modified: hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SafeModeException.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SafeModeException.java?rev=1530115&r1=1530114&r2=1530115&view=diff
==============================================================================
--- hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SafeModeException.java (original)
+++ hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SafeModeException.java Tue Oct 8 00:10:33 2013
@@ -33,10 +33,7 @@ import org.apache.hadoop.classification.
public class SafeModeException extends IOException {
private static final long serialVersionUID = 1L;
- public SafeModeException() {}
-
public SafeModeException(String text, FSNamesystem.SafeModeInfo mode ) {
super(text + ". Name node is in safe mode.\n" + mode.getTurnOffTip());
}
-
-}
+}
\ No newline at end of file
Modified: hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java?rev=1530115&r1=1530114&r2=1530115&view=diff
==============================================================================
--- hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java (original)
+++ hadoop/common/branches/branch-2.2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java Tue Oct 8 00:10:33 2013
@@ -17,12 +17,18 @@
*/
package org.apache.hadoop.hdfs.server.namenode.ha;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URI;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -101,6 +107,50 @@ public class TestHASafeMode {
}
}
+ /**
+ * Make sure the client retries when the active NN is in safemode
+ */
+ @Test (timeout=300000)
+ public void testClientRetrySafeMode() throws Exception {
+ final Map<Path, Boolean> results = Collections
+ .synchronizedMap(new HashMap<Path, Boolean>());
+ final Path test = new Path("/test");
+ // let nn0 enter safemode
+ NameNodeAdapter.enterSafeMode(nn0, false);
+ LOG.info("enter safemode");
+ new Thread() {
+ @Override
+ public void run() {
+ try {
+ boolean mkdir = fs.mkdirs(test);
+ LOG.info("mkdir finished, result is " + mkdir);
+ synchronized (TestHASafeMode.this) {
+ results.put(test, mkdir);
+ TestHASafeMode.this.notifyAll();
+ }
+ } catch (Exception e) {
+ LOG.info("Got Exception while calling mkdir", e);
+ }
+ }
+ }.start();
+
+ // make sure the client's call has actually been handled by the active NN
+ assertFalse("The directory should not be created while NN in safemode",
+ fs.exists(test));
+
+ Thread.sleep(1000);
+ // let nn0 leave safemode
+ NameNodeAdapter.leaveSafeMode(nn0);
+ LOG.info("leave safemode");
+
+ synchronized (this) {
+ while (!results.containsKey(test)) {
+ this.wait();
+ }
+ assertTrue(results.get(test));
+ }
+ }
+
private void restartStandby() throws IOException {
cluster.shutdownNameNode(1);
// Set the safemode extension to be lengthy, so that the tests