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 ki...@apache.org on 2013/06/07 03:18:27 UTC
svn commit: r1490487 - in
/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs: CHANGES.txt
src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java
Author: kihwal
Date: Fri Jun 7 01:18:27 2013
New Revision: 1490487
URL: http://svn.apache.org/r1490487
Log:
svn merge -c 1490486 Merging from trunk to branch-2 to fix HDFS-4862.
Modified:
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1490487&r1=1490486&r2=1490487&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Fri Jun 7 01:18:27 2013
@@ -2931,6 +2931,9 @@ Release 0.23.9 - UNRELEASED
HDFS-4867. metaSave NPEs when there are invalid blocks in repl queue.
(Plamen Jeliazkov and Ravi Prakash via shv)
+ HDFS-4862. SafeModeInfo.isManual() returns true when resources are low even
+ if it wasn't entered into manually (Ravi Prakash via kihwal)
+
Release 0.23.8 - 2013-06-05
INCOMPATIBLE CHANGES
Modified: hadoop/common/branches/branch-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/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=1490487&r1=1490486&r2=1490487&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Fri Jun 7 01:18:27 2013
@@ -4084,7 +4084,6 @@ public class FSNamesystem implements Nam
this.replQueueThreshold = 1.5f; // can never be reached
this.blockTotal = -1;
this.blockSafe = -1;
- this.reached = -1;
this.resourcesLow = resourcesLow;
enter();
reportStatus("STATE* Safe mode is ON.", true);
@@ -4271,17 +4270,17 @@ public class FSNamesystem implements Nam
private synchronized void decrementSafeBlockCount(short replication) {
if (replication == safeReplication-1) {
this.blockSafe--;
- assert blockSafe >= 0 || isManual();
+ //blockSafe is set to -1 in manual / low resources safemode
+ assert blockSafe >= 0 || isManual() || areResourcesLow();
checkMode();
}
}
/**
- * Check if safe mode was entered manually or automatically (at startup, or
- * when disk space is low).
+ * Check if safe mode was entered manually
*/
private boolean isManual() {
- return extension == Integer.MAX_VALUE && !resourcesLow;
+ return extension == Integer.MAX_VALUE;
}
/**
@@ -4320,7 +4319,7 @@ public class FSNamesystem implements Nam
} else {
leaveMsg = "Safe mode will be turned off automatically";
}
- if(isManual()) {
+ if(isManual() && !areResourcesLow()) {
leaveMsg = "Use \"hdfs dfsadmin -safemode leave\" to turn safe mode off";
}
@@ -4358,7 +4357,8 @@ public class FSNamesystem implements Nam
}
msg += " " + leaveMsg;
}
- if(reached == 0 || isManual()) { // threshold is not reached or manual
+ // threshold is not reached or manual or resources low
+ if(reached == 0 || (isManual() && !areResourcesLow())) {
return msg + ".";
}
// extension period is in progress
@@ -4502,7 +4502,12 @@ public class FSNamesystem implements Nam
SafeModeInfo safeMode = this.safeMode;
if (safeMode == null)
return false;
- return !safeMode.isManual() && safeMode.isOn();
+ // If the NN is in safemode, and not due to manual / low resources, we
+ // assume it must be because of startup. If the NN had low resources during
+ // startup, we assume it came out of startup safemode and it is now in low
+ // resources safemode
+ return !safeMode.isManual() && !safeMode.areResourcesLow()
+ && safeMode.isOn();
}
@Override
@@ -4615,7 +4620,7 @@ public class FSNamesystem implements Nam
}
/**
- * Enter safe mode manually.
+ * Enter safe mode. If resourcesLow is false, then we assume it is manual
* @throws IOException
*/
void enterSafeMode(boolean resourcesLow) throws IOException {
@@ -4640,8 +4645,9 @@ public class FSNamesystem implements Nam
}
if (resourcesLow) {
safeMode.setResourcesLow();
+ } else {
+ safeMode.setManual();
}
- safeMode.setManual();
if (isEditlogOpenForWrite) {
getEditLog().logSyncAll();
}
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java?rev=1490487&r1=1490486&r2=1490487&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java Fri Jun 7 01:18:27 2013
@@ -21,6 +21,7 @@ package org.apache.hadoop.hdfs.server.na
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY;
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_NAME_DIR_KEY;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
@@ -35,6 +36,7 @@ import org.apache.hadoop.hdfs.MiniDFSClu
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NamenodeRole;
import org.junit.After;
import org.junit.Test;
+import org.mockito.Mockito;
public class TestFSNamesystem {
@@ -77,4 +79,29 @@ public class TestFSNamesystem {
leaseMan = fsn.getLeaseManager();
assertEquals(0, leaseMan.countLease());
}
+
+ @Test
+ /**
+ * Test that isInStartupSafemode returns true only during startup safemode
+ * and not also during low-resource safemode
+ */
+ public void testStartupSafemode() throws IOException {
+ Configuration conf = new Configuration();
+ FSImage fsImage = Mockito.mock(FSImage.class);
+ FSEditLog fsEditLog = Mockito.mock(FSEditLog.class);
+ Mockito.when(fsImage.getEditLog()).thenReturn(fsEditLog);
+ FSNamesystem fsn = new FSNamesystem(conf, fsImage);
+
+ fsn.leaveSafeMode();
+ assertTrue("After leaving safemode FSNamesystem.isInStartupSafeMode still "
+ + "returned true", !fsn.isInStartupSafeMode());
+ assertTrue("After leaving safemode FSNamesystem.isInSafeMode still returned"
+ + " true", !fsn.isInSafeMode());
+
+ fsn.enterSafeMode(true);
+ assertTrue("After entering safemode due to low resources FSNamesystem."
+ + "isInStartupSafeMode still returned true", !fsn.isInStartupSafeMode());
+ assertTrue("After entering safemode due to low resources FSNamesystem."
+ + "isInSafeMode still returned false", fsn.isInSafeMode());
+ }
}