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 ha...@apache.org on 2009/08/19 23:44:43 UTC
svn commit: r805987 - in /hadoop/hdfs/branches/HDFS-265: ./ lib/
src/contrib/hdfsproxy/ src/java/ src/java/org/apache/hadoop/hdfs/protocol/
src/java/org/apache/hadoop/hdfs/server/datanode/
src/java/org/apache/hadoop/hdfs/server/namenode/ src/java/org/a...
Author: hairong
Date: Wed Aug 19 21:44:37 2009
New Revision: 805987
URL: http://svn.apache.org/viewvc?rev=805987&view=rev
Log:
Merge -r 804755:805652 from trunk to move all the changes to the append branch.
Added:
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/Pipeline.java
- copied unchanged from r805652, hadoop/hdfs/trunk/src/test/aop/org/apache/hadoop/fi/Pipeline.java
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/PipelineTest.java
- copied unchanged from r805652, hadoop/hdfs/trunk/src/test/aop/org/apache/hadoop/fi/PipelineTest.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java
- copied unchanged from r805652, hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java
Modified:
hadoop/hdfs/branches/HDFS-265/ (props changed)
hadoop/hdfs/branches/HDFS-265/CHANGES.txt
hadoop/hdfs/branches/HDFS-265/build.xml (props changed)
hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-0.21.0-dev.jar
hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-test-0.21.0-dev.jar
hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-0.21.0-dev.jar
hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-examples-0.21.0-dev.jar
hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-test-0.21.0-dev.jar
hadoop/hdfs/branches/HDFS-265/src/contrib/hdfsproxy/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/java/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java (props changed)
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/DatanodeProtocol.java
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/DataTransferTestUtil.java
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/protocol/ClientProtocolAspects.aj
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/BlockReceiverAspects.aj
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/DataTransferProtocolAspects.aj
hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/TestFiDataTransferProtocol.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/test/hdfs-with-mr/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFsck.java
hadoop/hdfs/branches/HDFS-265/src/webapps/datanode/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/webapps/hdfs/ (props changed)
hadoop/hdfs/branches/HDFS-265/src/webapps/secondary/ (props changed)
Propchange: hadoop/hdfs/branches/HDFS-265/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,2 +1,2 @@
/hadoop/core/branches/branch-0.19/hdfs:713112
-/hadoop/hdfs/trunk:796829-800617,800619-803337
+/hadoop/hdfs/trunk:796829-800617,800619-803337,804756-805652
Modified: hadoop/hdfs/branches/HDFS-265/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/CHANGES.txt?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/CHANGES.txt (original)
+++ hadoop/hdfs/branches/HDFS-265/CHANGES.txt Wed Aug 19 21:44:37 2009
@@ -49,7 +49,7 @@
via szetszwo)
HDFS-493. Change build.xml so that the fault-injected tests are executed
- only by the run-test-*-faul-inject targets. (Konstantin Boudnik via
+ only by the run-test-*-fault-inject targets. (Konstantin Boudnik via
szetszwo)
HDFS-446. Improvements to Offline Image Viewer. (Jakob Homan via shv)
@@ -83,20 +83,28 @@
HDFS-524. Further DataTransferProtocol code refactoring. (szetszwo)
- HDFS-527. Remove/deprecate unnecessary DFSClient constructors. (szetszwo)
-
HDFS-529. Use BlockInfo instead of Block to avoid redundant block searches
in BlockManager. (shv)
HDFS-530. Refactor TestFileAppend* to remove code duplication.
(Konstantin Boudnik via szetszwo)
- HDFS-451. Add fault injection tests, Pipeline_Fi_06,07,14,15, for
- DataTransferProtocol. (szetszwo)
+ HDFS-451. Add fault injection tests for DataTransferProtocol. (szetszwo)
HDFS-509. Redesign DataNode volumeMap to include all types of Replicas.
(hairong)
+ HDFS-457. Do not shutdown datanode if some, but not all, volumes fail.
+ (Boris Shkolnik via szetszwo)
+
+ HDFS-548. TestFsck takes nearly 10 minutes to run. (hairong)
+
+ HDFS-539. Refactor fault injeciton pipeline test util for future reuse.
+ (Konstantin Boudnik via szetszwo)
+
+ HDFS-552. Change TestFiDataTransferProtocol to junit 4 and add a few new
+ tests. (szetszwo)
+
BUG FIXES
HDFS-76. Better error message to users when commands fail because of
@@ -109,7 +117,7 @@
HADOOP-6096. Fix Eclipse project and classpath files following project
split. (tomwhite)
- HDFS-195. Handle expired tokens when write pipeline is restablished.
+ HDFS-195. Handle expired tokens when write pipeline is reestablished.
(Kan Zhang via rangadi)
HDFS-181. Validate src path in FSNamesystem.getFileInfo(..). (Todd
@@ -148,9 +156,6 @@
HDFS-119. Fix a bug in logSync(), which causes NameNode block forever.
(Suresh Srinivas via shv)
- HDFS-167. Fix a bug in DFSClient that caused infinite retries on write.
- (Bill Zeller via szetszwo)
-
HDFS-534. Include avro in ivy. (szetszwo)
Release 0.20.1 - Unreleased
@@ -163,3 +168,8 @@
HDFS-525. The SimpleDateFormat object in ListPathsServlet is not thread
safe. (Suresh Srinivas via szetszwo)
+
+ HDFS-167. Fix a bug in DFSClient that caused infinite retries on write.
+ (Bill Zeller via szetszwo)
+
+ HDFS-527. Remove/deprecate unnecessary DFSClient constructors. (szetszwo)
Propchange: hadoop/hdfs/branches/HDFS-265/build.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/build.xml:713112
/hadoop/core/trunk/build.xml:779102
-/hadoop/hdfs/trunk/build.xml:796829-800617,800619-803337
+/hadoop/hdfs/trunk/build.xml:796829-800617,800619-803337,804756-805652
Modified: hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-0.21.0-dev.jar
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-0.21.0-dev.jar?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
Binary files - no diff available.
Modified: hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-test-0.21.0-dev.jar
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/lib/hadoop-core-test-0.21.0-dev.jar?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
Binary files - no diff available.
Modified: hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-0.21.0-dev.jar
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-0.21.0-dev.jar?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
Binary files - no diff available.
Modified: hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-examples-0.21.0-dev.jar
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-examples-0.21.0-dev.jar?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
Binary files - no diff available.
Modified: hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-test-0.21.0-dev.jar
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/lib/hadoop-mapred-test-0.21.0-dev.jar?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
Binary files - no diff available.
Propchange: hadoop/hdfs/branches/HDFS-265/src/contrib/hdfsproxy/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/contrib/hdfsproxy:713112
/hadoop/core/trunk/src/contrib/hdfsproxy:776175-784663
-/hadoop/hdfs/trunk/src/contrib/hdfsproxy:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/contrib/hdfsproxy:796829-800617,800619-803337,804756-805652
Propchange: hadoop/hdfs/branches/HDFS-265/src/java/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/java:713112
/hadoop/core/trunk/src/hdfs:776175-785643,785929-786278
-/hadoop/hdfs/trunk/src/java:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/java:796829-800617,800619-803337,804756-805652
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/protocol/FSConstants.java Wed Aug 19 21:44:37 2009
@@ -56,6 +56,7 @@
public static final int DEFAULT_DATA_SOCKET_SIZE = 128 * 1024;
public static final int SIZE_OF_INTEGER = Integer.SIZE / Byte.SIZE;
+ public static final int MIN_NUM_OF_VALID_VOLUMES = 1;// for a DN to run
// SafeMode actions
public enum SafeModeAction{ SAFEMODE_LEAVE, SAFEMODE_ENTER, SAFEMODE_GET; }
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java Wed Aug 19 21:44:37 2009
@@ -119,6 +119,9 @@
// check if there is a disk error
IOException cause = FSDataset.getCauseIfDiskError(ioe);
+ DataNode.LOG.warn("IOException in BlockReceiver constructor. Cause is ",
+ cause);
+
if (cause != null) { // possible disk error
ioe = cause;
datanode.checkDiskError(ioe); // may throw an exception here
@@ -833,7 +836,14 @@
SUCCESS.write(replyOut);
replyOut.flush();
} catch (Exception e) {
+ LOG.warn("IOException in BlockReceiver.lastNodeRun: ", e);
if (running) {
+ try {
+ datanode.checkDiskError(e); // may throw an exception here
+ } catch (IOException ioe) {
+ LOG.warn("DataNode.chekDiskError failed in lastDataNodeRun with: ",
+ ioe);
+ }
LOG.info("PacketResponder " + block + " " + numTargets +
" Exception " + StringUtils.stringifyException(e));
running = false;
@@ -993,7 +1003,13 @@
running = false;
}
} catch (IOException e) {
+ LOG.warn("IOException in BlockReceiver.run(): ", e);
if (running) {
+ try {
+ datanode.checkDiskError(e); // may throw an exception here
+ } catch (IOException ioe) {
+ LOG.warn("DataNode.chekDiskError failed in run() with: ", ioe);
+ }
LOG.info("PacketResponder " + block + " " + numTargets +
" Exception " + StringUtils.stringifyException(e));
running = false;
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java Wed Aug 19 21:44:37 2009
@@ -694,11 +694,14 @@
}
- /* Check if there is no space in disk or the disk is read-only
- * when IOException occurs.
- * If so, handle the error */
- protected void checkDiskError( IOException e ) throws IOException {
- if (e.getMessage() != null &&
+ /** Check if there is no space in disk
+ * @param e that caused this checkDiskError call
+ **/
+ protected void checkDiskError(Exception e ) throws IOException {
+
+ LOG.warn("checkDiskError: exception: ", e);
+
+ if (e.getMessage() != null &&
e.getMessage().startsWith("No space left on device")) {
throw new DiskOutOfSpaceException("No space left on device");
} else {
@@ -706,8 +709,11 @@
}
}
- /* Check if there is no disk space and if so, handle the error*/
- protected void checkDiskError( ) throws IOException {
+ /**
+ * Check if there is a disk failure and if so, handle the error
+ *
+ **/
+ protected void checkDiskError( ) {
try {
data.checkDataDir();
} catch(DiskErrorException de) {
@@ -716,13 +722,31 @@
}
private void handleDiskError(String errMsgr) {
- LOG.warn("DataNode is shutting down.\n" + errMsgr);
- shouldRun = false;
+ boolean hasEnoughResource = data.hasEnoughResource();
+ LOG.warn("DataNode.handleDiskError: Keep Running: " + hasEnoughResource);
+
+ //if hasEnoughtResource = true - more volumes are available, so we don't want
+ // to shutdown DN completely and don't want NN to remove it.
+ int dp_error = DatanodeProtocol.DISK_ERROR;
+ if(hasEnoughResource == false) {
+ // DN will be shutdown and NN should remove it
+ dp_error = DatanodeProtocol.FATAL_DISK_ERROR;
+ }
+ //inform NameNode
try {
namenode.errorReport(
- dnRegistration, DatanodeProtocol.DISK_ERROR, errMsgr);
+ dnRegistration, dp_error, errMsgr);
} catch(IOException ignored) {
}
+
+
+ if(hasEnoughResource) {
+ scheduleBlockReport(0);
+ return; // do not shutdown
+ }
+
+ LOG.warn("DataNode is shutting down.\n" + errMsgr);
+ shouldRun = false;
}
/** Number of concurrent xceivers per node. */
@@ -1238,6 +1262,9 @@
} catch (IOException ie) {
LOG.warn(dnRegistration + ":Failed to transfer " + b + " to " + targets[0].getName()
+ " got " + StringUtils.stringifyException(ie));
+ // check if there are any disk problem
+ datanode.checkDiskError();
+
} finally {
xmitsInProgress.getAndDecrement();
IOUtils.closeStream(blockSender);
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java Wed Aug 19 21:44:37 2009
@@ -17,18 +17,35 @@
*/
package org.apache.hadoop.hdfs.server.datanode;
-import java.io.*;
-import java.util.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.StandardMBean;
-import org.apache.hadoop.fs.*;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.DF;
+import org.apache.hadoop.fs.DU;
+import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.hdfs.protocol.FSConstants;
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
+import org.apache.hadoop.hdfs.server.datanode.metrics.FSDatasetMBean;
+import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
import org.apache.hadoop.metrics.util.MBeanUtil;
import org.apache.hadoop.util.DataChecksum;
import org.apache.hadoop.util.DiskChecker;
@@ -40,6 +57,8 @@
import org.apache.hadoop.hdfs.server.datanode.metrics.FSDatasetMBean;
import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
+import org.mortbay.log.Log;
+
/**************************************************
* FSDataset manages a set of data blocks. Each block
* has a unique name and an extent on disk.
@@ -468,9 +487,25 @@
FSVolumeSet(FSVolume[] volumes) {
this.volumes = volumes;
}
+
+ private int numberOfVolumes() {
+ return volumes.length;
+ }
synchronized FSVolume getNextVolume(long blockSize) throws IOException {
+
+ if(volumes.length < 1) {
+ throw new DiskOutOfSpaceException("No more available volumes");
+ }
+
+ // since volumes could've been removed because of the failure
+ // make sure we are not out of bounds
+ if(curVolume >= volumes.length) {
+ curVolume = 0;
+ }
+
int startVolume = curVolume;
+
while (true) {
FSVolume volume = volumes[curVolume];
curVolume = (curVolume + 1) % volumes.length;
@@ -511,10 +546,46 @@
}
}
- synchronized void checkDirs() throws DiskErrorException {
+ /**
+ * goes over all the volumes and checkDir eachone of them
+ * if one throws DiskErrorException - removes from the list of active
+ * volumes.
+ * @return list of all the removed volumes
+ */
+ synchronized List<FSVolume> checkDirs() {
+
+ ArrayList<FSVolume> removed_vols = null;
+
for (int idx = 0; idx < volumes.length; idx++) {
- volumes[idx].checkDirs();
+ FSVolume fsv = volumes[idx];
+ try {
+ fsv.checkDirs();
+ } catch (DiskErrorException e) {
+ DataNode.LOG.warn("Removing failed volume " + fsv + ": ",e);
+ if(removed_vols == null) {
+ removed_vols = new ArrayList<FSVolume>(1);
+ }
+ removed_vols.add(volumes[idx]);
+ volumes[idx] = null; //remove the volume
+ }
+ }
+
+ // repair array - copy non null elements
+ int removed_size = (removed_vols==null)? 0 : removed_vols.size();
+ if(removed_size > 0) {
+ FSVolume fsvs[] = new FSVolume [volumes.length-removed_size];
+ for(int idx=0,idy=0; idx<volumes.length; idx++) {
+ if(volumes[idx] != null) {
+ fsvs[idy] = volumes[idx];
+ idy++;
+ }
+ }
+ volumes = fsvs; // replace array of volumes
}
+ Log.info("Completed FSVolumeSet.checkDirs. Removed=" + removed_size +
+ "volumes. List of current volumes: " + toString());
+
+ return removed_vols;
}
public String toString() {
@@ -656,7 +727,14 @@
return volumes.getDfsUsed();
}
}
-
+ /**
+ * Return true - if there are still valid volumes
+ * on the DataNode
+ */
+ public boolean hasEnoughResource(){
+ return volumes.numberOfVolumes() >= MIN_NUM_OF_VALID_VOLUMES;
+ }
+
/**
* Return total capacity, used and unused
*/
@@ -1226,11 +1304,19 @@
/**
* Find the file corresponding to the block and return it if it exists.
*/
- File validateBlockFile(Block b) {
+ File validateBlockFile(Block b) throws IOException {
//Should we check for metadata file too?
File f = getFile(b);
- if(f != null && f.exists())
- return f;
+
+ if(f != null ) {
+ if(f.exists())
+ return f;
+
+ // if file is not null, but doesn't exist - possibly disk failed
+ DataNode datanode = DataNode.getDataNode();
+ datanode.checkDiskError();
+ }
+
if (InterDatanodeProtocol.LOG.isDebugEnabled()) {
InterDatanodeProtocol.LOG.debug("b=" + b + ", f=" + f);
}
@@ -1375,10 +1461,51 @@
}
/**
* check if a data directory is healthy
+ * if some volumes failed - make sure to remove all the blocks that belong
+ * to these volumes
* @throws DiskErrorException
*/
public void checkDataDir() throws DiskErrorException {
- volumes.checkDirs();
+ long total_blocks=0, removed_blocks=0;
+ List<FSVolume> failed_vols = volumes.checkDirs();
+
+ //if there no failed volumes return
+ if(failed_vols == null)
+ return;
+
+ // else
+ // remove related blocks
+ long mlsec = System.currentTimeMillis();
+ synchronized (this) {
+ Iterator<ReplicaInfo> ib = volumeMap.replicas().iterator();
+ while(ib.hasNext()) {
+ ReplicaInfo b = ib.next();
+ total_blocks ++;
+ // check if the volume block belongs to still valid
+ FSVolume vol = b.getVolume();
+ for(FSVolume fv: failed_vols) {
+ if(vol == fv) {
+ DataNode.LOG.warn("removing block " + b.getBlockId() + " from vol "
+ + vol.dataDir.dir.getAbsolutePath());
+ ib.remove();
+ removed_blocks++;
+ break;
+ }
+ }
+ }
+ } // end of sync
+ mlsec = System.currentTimeMillis() - mlsec;
+ DataNode.LOG.warn(">>>>>>>>>>>>Removed " + removed_blocks + " out of " + total_blocks +
+ "(took " + mlsec + " millisecs)");
+
+ // report the error
+ StringBuilder sb = new StringBuilder();
+ for(FSVolume fv : failed_vols) {
+ sb.append(fv.dataDir.dir.getAbsolutePath() + ";");
+ }
+
+ throw new DiskErrorException("DataNode failed volumes:" + sb);
+
}
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java Wed Aug 19 21:44:37 2009
@@ -264,4 +264,10 @@
* @throws IOException
*/
public void validateBlockMetadata(Block b) throws IOException;
+
+ /**
+ * checks how many valid storage volumes are there in the DataNode
+ * @return true if more then minimum valid volumes left in the FSDataSet
+ */
+ public boolean hasEnoughResource();
}
Propchange: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/java/org/apache/hadoop/hdfs/server/datanode/DatanodeBlockInfo.java:713112
/hadoop/core/trunk/src/hdfs/org/apache/hadoop/hdfs/server/datanode/DatanodeBlockInfo.java:776175-785643,785929-786278
-/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java:800619-803337
+/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java:800619-803337,804756-805652
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java Wed Aug 19 21:44:37 2009
@@ -942,6 +942,8 @@
}
verifyRequest(nodeReg);
if (errorCode == DatanodeProtocol.DISK_ERROR) {
+ LOG.warn("Volume failed on " + dnName);
+ } else if (errorCode == DatanodeProtocol.FATAL_DISK_ERROR) {
namesystem.removeDatanode(nodeReg);
}
}
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/DatanodeProtocol.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/DatanodeProtocol.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/DatanodeProtocol.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/DatanodeProtocol.java Wed Aug 19 21:44:37 2009
@@ -42,8 +42,9 @@
// error code
final static int NOTIFY = 0;
- final static int DISK_ERROR = 1;
+ final static int DISK_ERROR = 1; // there are still valid volumes on DN
final static int INVALID_BLOCK = 2;
+ final static int FATAL_DISK_ERROR = 3; // no valid volumes left on DN
/**
* Determines actions that data node should perform
Modified: hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/DataTransferTestUtil.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/DataTransferTestUtil.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/DataTransferTestUtil.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/fi/DataTransferTestUtil.java Wed Aug 19 21:44:37 2009
@@ -17,88 +17,80 @@
*/
package org.apache.hadoop.fi;
-import java.util.ArrayList;
-import java.util.List;
-
import org.apache.hadoop.fi.FiTestUtil.Action;
import org.apache.hadoop.fi.FiTestUtil.ActionContainer;
import org.apache.hadoop.hdfs.protocol.DatanodeID;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
-import org.apache.hadoop.hdfs.server.datanode.DataNode;
import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Utilities for DataTransferProtocol related tests,
* e.g. TestFiDataTransferProtocol.
*/
public class DataTransferTestUtil {
- private static DataTransferTest thepipelinetest;
+ protected static PipelineTest thepipelinetest;
/** initialize pipeline test */
- public static DataTransferTest initTest() {
+ public static PipelineTest initTest() {
return thepipelinetest = new DataTransferTest();
}
/** get the pipeline test object */
- public static DataTransferTest getPipelineTest() {
+ public static PipelineTest getPipelineTest() {
return thepipelinetest;
}
+ /** get the pipeline test object cast to DataTransferTest */
+ public static DataTransferTest getDataTransferTest() {
+ return (DataTransferTest)getPipelineTest();
+ }
/**
* The DataTransferTest class includes a pipeline
* and some actions.
*/
- public static class DataTransferTest {
- private Pipeline thepipeline;
+ public static class DataTransferTest implements PipelineTest {
+ private List<Pipeline> pipelines = new ArrayList<Pipeline>();
+
/** Simulate action for the receiverOpWriteBlock pointcut */
- public final ActionContainer<DataNode> fiReceiverOpWriteBlock
- = new ActionContainer<DataNode>();
+ public final ActionContainer<DatanodeID> fiReceiverOpWriteBlock
+ = new ActionContainer<DatanodeID>();
/** Simulate action for the callReceivePacket pointcut */
- public final ActionContainer<DataNode> fiCallReceivePacket
- = new ActionContainer<DataNode>();
+ public final ActionContainer<DatanodeID> fiCallReceivePacket
+ = new ActionContainer<DatanodeID>();
/** Simulate action for the statusRead pointcut */
- public final ActionContainer<DataNode> fiStatusRead
- = new ActionContainer<DataNode>();
+ public final ActionContainer<DatanodeID> fiStatusRead
+ = new ActionContainer<DatanodeID>();
/** Initialize the pipeline. */
public Pipeline initPipeline(LocatedBlock lb) {
- if (thepipeline != null) {
+ final Pipeline pl = new Pipeline(lb);
+ if (pipelines.contains(pl)) {
throw new IllegalStateException("thepipeline != null");
}
- return thepipeline = new Pipeline(lb);
+ pipelines.add(pl);
+ return pl;
}
/** Return the pipeline. */
- public Pipeline getPipeline() {
- if (thepipeline == null) {
+ public Pipeline getPipeline(DatanodeID id) {
+ if (pipelines == null) {
throw new IllegalStateException("thepipeline == null");
}
- return thepipeline;
- }
- }
-
- /** A pipeline contains a list of datanodes. */
- public static class Pipeline {
- private final List<String> datanodes = new ArrayList<String>();
-
- private Pipeline(LocatedBlock lb) {
- for(DatanodeInfo d : lb.getLocations()) {
- datanodes.add(d.getName());
+ StringBuilder dnString = new StringBuilder();
+ for (Pipeline pipeline : pipelines) {
+ for (DatanodeInfo dni : pipeline.getDataNodes())
+ dnString.append(dni.getStorageID());
+ if (dnString.toString().contains(id.getStorageID()))
+ return pipeline;
}
- }
-
- /** Does the pipeline contains d at the n th position? */
- public boolean contains(int n, DatanodeID d) {
- return d.getName().equals(datanodes.get(n));
- }
-
- /** {@inheritDoc} */
- public String toString() {
- return getClass().getSimpleName() + datanodes;
+ return null;
}
}
/** Action for DataNode */
- public static abstract class DataNodeAction implements Action<DataNode> {
+ public static abstract class DataNodeAction implements Action<DatanodeID> {
/** The name of the test */
final String currentTest;
/** The index of the datanode */
@@ -108,7 +100,7 @@
* @param currentTest The name of the test
* @param index The index of the datanode
*/
- private DataNodeAction(String currentTest, int index) {
+ protected DataNodeAction(String currentTest, int index) {
this.currentTest = currentTest;
this.index = index;
}
@@ -118,10 +110,11 @@
return currentTest + ", index=" + index;
}
- /** {@inheritDoc} */
- String toString(DataNode datanode) {
+ /** {@inheritDoc}
+ * @param datanodeID*/
+ String toString(DatanodeID datanodeID) {
return "FI: " + this + ", datanode="
- + datanode.getDatanodeRegistration().getName();
+ + datanodeID.getName();
}
}
@@ -133,10 +126,10 @@
}
@Override
- public void run(DataNode datanode) {
- final Pipeline p = getPipelineTest().getPipeline();
- if (p.contains(index, datanode.getDatanodeRegistration())) {
- final String s = toString(datanode);
+ public void run(DatanodeID id) {
+ final Pipeline p = getPipelineTest().getPipeline(id);
+ if (p.contains(index, id)) {
+ final String s = toString(id);
FiTestUtil.LOG.info(s);
throw new OutOfMemoryError(s);
}
@@ -151,10 +144,10 @@
}
@Override
- public void run(DataNode datanode) throws DiskOutOfSpaceException {
- final Pipeline p = getPipelineTest().getPipeline();
- if (p.contains(index, datanode.getDatanodeRegistration())) {
- final String s = toString(datanode);
+ public void run(DatanodeID id) throws DiskOutOfSpaceException {
+ final Pipeline p = getPipelineTest().getPipeline(id);
+ if (p.contains(index, id)) {
+ final String s = toString(id);
FiTestUtil.LOG.info(s);
throw new DiskOutOfSpaceException(s);
}
@@ -179,10 +172,10 @@
}
@Override
- public void run(DataNode datanode) {
- final Pipeline p = getPipelineTest().getPipeline();
- if (p.contains(index, datanode.getDatanodeRegistration())) {
- final String s = toString(datanode) + ", duration=" + duration;
+ public void run(DatanodeID id) {
+ final Pipeline p = getPipelineTest().getPipeline(id);
+ if (p.contains(index, id)) {
+ final String s = toString(id) + ", duration=" + duration;
FiTestUtil.LOG.info(s);
if (duration <= 0) {
for(; true; FiTestUtil.sleep(1000)); //sleep forever
Modified: hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/protocol/ClientProtocolAspects.aj
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/protocol/ClientProtocolAspects.aj?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/protocol/ClientProtocolAspects.aj (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/protocol/ClientProtocolAspects.aj Wed Aug 19 21:44:37 2009
@@ -20,6 +20,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fi.DataTransferTestUtil;
+import org.apache.hadoop.fi.PipelineTest;
/** Aspect for ClientProtocol */
public aspect ClientProtocolAspects {
@@ -29,7 +30,9 @@
call(LocatedBlock ClientProtocol.addBlock(String, String));
after() returning(LocatedBlock lb): addBlock() {
- LOG.info("FI: addBlock "
- + DataTransferTestUtil.getPipelineTest().initPipeline(lb));
+ PipelineTest pipelineTest = DataTransferTestUtil.getPipelineTest();
+ if (pipelineTest != null)
+ LOG.info("FI: addBlock "
+ + pipelineTest.initPipeline(lb));
}
-}
\ No newline at end of file
+}
Modified: hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/BlockReceiverAspects.aj
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/BlockReceiverAspects.aj?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/BlockReceiverAspects.aj (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/BlockReceiverAspects.aj Wed Aug 19 21:44:37 2009
@@ -22,6 +22,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.fi.DataTransferTestUtil.DataTransferTest;
import org.apache.hadoop.fi.DataTransferTestUtil;
import org.apache.hadoop.fi.ProbabilityModel;
import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
@@ -44,8 +45,10 @@
before(BlockReceiver blockreceiver
) throws IOException : callReceivePacket(blockreceiver) {
LOG.info("FI: callReceivePacket");
- DataTransferTestUtil.getPipelineTest().fiCallReceivePacket.run(
- blockreceiver.getDataNode());
+ DataTransferTest dtTest = DataTransferTestUtil.getDataTransferTest();
+ if (dtTest != null)
+ dtTest.fiCallReceivePacket.run(
+ blockreceiver.getDataNode().getDatanodeRegistration());
if (ProbabilityModel.injectCriteria(BlockReceiver.class.getSimpleName())) {
LOG.info("Before the injection point");
Modified: hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/DataTransferProtocolAspects.aj
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/DataTransferProtocolAspects.aj?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/DataTransferProtocolAspects.aj (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/DataTransferProtocolAspects.aj Wed Aug 19 21:44:37 2009
@@ -24,6 +24,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fi.DataTransferTestUtil;
+import org.apache.hadoop.fi.DataTransferTestUtil.DataTransferTest;
import org.apache.hadoop.hdfs.protocol.DataTransferProtocol.Op;
import org.apache.hadoop.hdfs.protocol.DataTransferProtocol.Receiver;
import org.apache.hadoop.hdfs.protocol.DataTransferProtocol.Status;
@@ -59,7 +60,8 @@
final DataNode d = dataxceiver.getDataNode();
LOG.info("FI: statusRead " + status + ", datanode="
+ d.getDatanodeRegistration().getName());
- DataTransferTestUtil.getPipelineTest().fiStatusRead.run(d);
+ DataTransferTestUtil.getDataTransferTest().fiStatusRead.run(
+ d.getDatanodeRegistration());
}
pointcut receiverOpWriteBlock(DataXceiver dataxceiver):
@@ -68,7 +70,9 @@
before(DataXceiver dataxceiver
) throws IOException: receiverOpWriteBlock(dataxceiver) {
LOG.info("FI: receiverOpWriteBlock");
- DataTransferTestUtil.getPipelineTest().fiReceiverOpWriteBlock.run(
- dataxceiver.getDataNode());
+ DataTransferTest dtTest = DataTransferTestUtil.getDataTransferTest();
+ if (dtTest != null)
+ dtTest.fiReceiverOpWriteBlock.run(
+ dataxceiver.getDataNode().getDatanodeRegistration());
}
}
Modified: hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/TestFiDataTransferProtocol.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/TestFiDataTransferProtocol.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/TestFiDataTransferProtocol.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/aop/org/apache/hadoop/hdfs/server/datanode/TestFiDataTransferProtocol.java Wed Aug 19 21:44:37 2009
@@ -24,6 +24,7 @@
import org.apache.hadoop.fi.FiTestUtil;
import org.apache.hadoop.fi.DataTransferTestUtil.DataTransferTest;
import org.apache.hadoop.fi.DataTransferTestUtil.DoosAction;
+import org.apache.hadoop.fi.DataTransferTestUtil.OomAction;
import org.apache.hadoop.fi.DataTransferTestUtil.SleepAction;
import org.apache.hadoop.fi.FiTestUtil.Action;
import org.apache.hadoop.fs.FSDataInputStream;
@@ -31,9 +32,12 @@
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.MiniDFSCluster;
+import org.apache.hadoop.hdfs.protocol.DatanodeID;
+import org.junit.Assert;
+import org.junit.Test;
/** Test DataTransferProtocol with fault injection. */
-public class TestFiDataTransferProtocol extends junit.framework.TestCase {
+public class TestFiDataTransferProtocol {
static final short REPLICATION = 3;
static final long BLOCKSIZE = 1L * (1L << 20);
@@ -69,7 +73,7 @@
final FSDataInputStream in = dfs.open(p);
final int b = in.read();
in.close();
- assertEquals(1, b);
+ Assert.assertEquals(1, b);
}
finally {
cluster.shutdown();
@@ -79,7 +83,7 @@
private static void runSlowDatanodeTest(String methodName, SleepAction a
) throws IOException {
FiTestUtil.LOG.info("Running " + methodName + " ...");
- final DataTransferTest t = DataTransferTestUtil.initTest();
+ final DataTransferTest t = (DataTransferTest)DataTransferTestUtil.initTest();
t.fiCallReceivePacket.set(a);
t.fiReceiverOpWriteBlock.set(a);
t.fiStatusRead.set(a);
@@ -90,7 +94,8 @@
* Pipeline setup with DN0 very slow but it won't lead to timeout.
* Client finishes setup successfully.
*/
- public void testPipelineFi06() throws IOException {
+ @Test
+ public void pipeline_Fi_06() throws IOException {
final String methodName = FiTestUtil.getMethodName();
runSlowDatanodeTest(methodName, new SleepAction(methodName, 0, 3000));
}
@@ -99,24 +104,54 @@
* Pipeline setup with DN1 very slow but it won't lead to timeout.
* Client finishes setup successfully.
*/
- public void testPipelineFi07() throws IOException {
+ @Test
+ public void pipeline_Fi_07() throws IOException {
final String methodName = FiTestUtil.getMethodName();
runSlowDatanodeTest(methodName, new SleepAction(methodName, 1, 3000));
}
+ /**
+ * Pipeline setup with DN2 very slow but it won't lead to timeout.
+ * Client finishes setup successfully.
+ */
+ @Test
+ public void pipeline_Fi_08() throws IOException {
+ final String methodName = FiTestUtil.getMethodName();
+ runSlowDatanodeTest(methodName, new SleepAction(methodName, 2, 3000));
+ }
+
private static void runCallReceivePacketTest(String methodName,
- Action<DataNode> a) throws IOException {
+ Action<DatanodeID> a) throws IOException {
FiTestUtil.LOG.info("Running " + methodName + " ...");
- DataTransferTestUtil.initTest().fiCallReceivePacket.set(a);
+ ((DataTransferTest)DataTransferTestUtil.initTest()).fiCallReceivePacket.set(a);
+ write1byte(methodName);
+ }
+
+ private static void runStatusReadTest(String methodName, Action<DatanodeID> a
+ ) throws IOException {
+ FiTestUtil.LOG.info("Running " + methodName + " ...");
+ ((DataTransferTest)DataTransferTestUtil.initTest()).fiStatusRead.set(a);
write1byte(methodName);
}
/**
+ * Pipeline setup, DN1 throws an OutOfMemoryException right after it
+ * received a setup ack from DN2.
+ * Client gets an IOException and determine DN1 bad.
+ */
+ @Test
+ public void pipeline_Fi_12() throws IOException {
+ final String methodName = FiTestUtil.getMethodName();
+ runStatusReadTest(methodName, new OomAction(methodName, 1));
+ }
+
+ /**
* Streaming: Write a packet, DN0 throws a DiskOutOfSpaceError
* when it writes the data to disk.
* Client gets an IOException and determine DN0 bad.
*/
- public void testPipelineFi14() throws IOException {
+ @Test
+ public void pipeline_Fi_14() throws IOException {
final String methodName = FiTestUtil.getMethodName();
runCallReceivePacketTest(methodName, new DoosAction(methodName, 0));
}
@@ -126,8 +161,20 @@
* when it writes the data to disk.
* Client gets an IOException and determine DN1 bad.
*/
- public void testPipelineFi15() throws IOException {
+ @Test
+ public void pipeline_Fi_15() throws IOException {
final String methodName = FiTestUtil.getMethodName();
runCallReceivePacketTest(methodName, new DoosAction(methodName, 1));
}
+
+ /**
+ * Streaming: Write a packet, DN2 throws a DiskOutOfSpaceError
+ * when it writes the data to disk.
+ * Client gets an IOException and determine DN2 bad.
+ */
+ @Test
+ public void pipeline_Fi_16() throws IOException {
+ final String methodName = FiTestUtil.getMethodName();
+ runCallReceivePacketTest(methodName, new DoosAction(methodName, 2));
+ }
}
\ No newline at end of file
Propchange: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/test/hdfs:713112
/hadoop/core/trunk/src/test/hdfs:776175-785643
-/hadoop/hdfs/trunk/src/test/hdfs:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/test/hdfs:796829-800617,800619-803337,804756-805652
Propchange: hadoop/hdfs/branches/HDFS-265/src/test/hdfs-with-mr/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/test/hdfs-with-mr:713112
/hadoop/core/trunk/src/test/hdfs-with-mr:776175-784663
-/hadoop/hdfs/trunk/src/test/hdfs-with-mr:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/test/hdfs-with-mr:796829-800617,800619-803337,804756-805652
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java Wed Aug 19 21:44:37 2009
@@ -655,4 +655,8 @@
public String getStorageInfo() {
return "Simulated FSDataset-" + storageId;
}
+
+ public boolean hasEnoughResource() {
+ return true;
+ }
}
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFsck.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFsck.java?rev=805987&r1=805986&r2=805987&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFsck.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestFsck.java Wed Aug 19 21:44:37 2009
@@ -162,6 +162,7 @@
try {
Configuration conf = new Configuration();
conf.setLong("dfs.blockreport.intervalMsec", 10000L);
+ conf.setInt("dfs.datanode.directoryscan.interval", 1);
cluster = new MiniDFSCluster(conf, 4, true, null);
String topDir = "/srcdat";
fs = cluster.getFileSystem();
Propchange: hadoop/hdfs/branches/HDFS-265/src/webapps/datanode/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/webapps/datanode:713112
/hadoop/core/trunk/src/webapps/datanode:776175-784663
-/hadoop/hdfs/trunk/src/webapps/datanode:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/webapps/datanode:796829-800617,800619-803337,804756-805652
Propchange: hadoop/hdfs/branches/HDFS-265/src/webapps/hdfs/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/webapps/hdfs:713112
/hadoop/core/trunk/src/webapps/hdfs:776175-784663
-/hadoop/hdfs/trunk/src/webapps/hdfs:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/webapps/hdfs:796829-800617,800619-803337,804756-805652
Propchange: hadoop/hdfs/branches/HDFS-265/src/webapps/secondary/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 19 21:44:37 2009
@@ -1,3 +1,3 @@
/hadoop/core/branches/branch-0.19/hdfs/src/webapps/secondary:713112
/hadoop/core/trunk/src/webapps/secondary:776175-784663
-/hadoop/hdfs/trunk/src/webapps/secondary:796829-800617,800619-803337
+/hadoop/hdfs/trunk/src/webapps/secondary:796829-800617,800619-803337,804756-805652