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 sz...@apache.org on 2012/02/08 22:04:48 UTC
svn commit: r1242093 [1/2] - in
/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs: ./
src/main/java/ src/main/java/org/apache/hadoop/hdfs/server/datanode/
src/test/java/org/apache/hadoop/hdfs/server/datanode/
Author: szetszwo
Date: Wed Feb 8 21:04:47 2012
New Revision: 1242093
URL: http://svn.apache.org/viewvc?rev=1242093&view=rev
Log:
svn merge -c 1242087 from trunk for HDFS-2887.
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/ (props changed)
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/ (props changed)
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockVolumeChoosingPolicy.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataStorage.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeUtil.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FinalizedReplica.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaBeingWritten.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInPipeline.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaWaitingToBeRecovered.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/RoundRobinVolumesPolicy.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMultipleRegistrations.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRestart.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDirectoryScanner.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestRoundRobinVolumesPolicy.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestWriteToReplica.java
Propchange: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 8 21:04:47 2012
@@ -1,4 +1,4 @@
-/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs:1161777,1161781,1162188,1162421,1162491,1162499,1162613,1162928,1162954,1162979,1163050,1163069,1163081,1163490,1163768,1164255,1164301,1164339,1166402,1167383,1167662,1170085,1170379,1170459,1170996,1171136,1171297,1171379,1171611,1172916,1173402,1173468,1175113,1176178,1176550,1176719,1176729,1176733,1177100,1177161,1177487,1177531,1177757,1177859,1177864,1177905,1179169,1179856,1179861,1180757,1182189,1182205,1182214,1183081,1183098,1183175,1183554,1186508,1187140,1189028,1189355,1189360,1189546,1189613,1189932,1189982,1190077,1190708,1195575,1195656,1195731,1195754,1196113,1196129,1197329,1198903,1199396,1200731,1204114,1204117,1204122,1204124,1204129,1204131,1204177,1204370,1204376,1204388,1205146,1205260,1205626,1205697,1206178,1206786,1206830,1207585,1207694,1208140,1208153,1208313,1212021,1212062,1212073,1212084,1212299,1213537,1213586,1213592-1213593,1213954,1214027,1214046,1220510,1221106,1221348,1225114,1225192,
1225456,1225489,1225591,1226211,1226239,1226350,1227091,1227165,1227423,1227964,1229347,1230398,1231569,1231572,1231627,1231640,1233605,1234555,1235135,1235137,1235956,1236456,1238700,1238779,1238969,1239752,1240020,1240897,1240928
+/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs:1161777,1161781,1162188,1162421,1162491,1162499,1162613,1162928,1162954,1162979,1163050,1163069,1163081,1163490,1163768,1164255,1164301,1164339,1166402,1167383,1167662,1170085,1170379,1170459,1170996,1171136,1171297,1171379,1171611,1172916,1173402,1173468,1175113,1176178,1176550,1176719,1176729,1176733,1177100,1177161,1177487,1177531,1177757,1177859,1177864,1177905,1179169,1179856,1179861,1180757,1182189,1182205,1182214,1183081,1183098,1183175,1183554,1186508,1187140,1189028,1189355,1189360,1189546,1189613,1189932,1189982,1190077,1190708,1195575,1195656,1195731,1195754,1196113,1196129,1197329,1198903,1199396,1200731,1204114,1204117,1204122,1204124,1204129,1204131,1204177,1204370,1204376,1204388,1205146,1205260,1205626,1205697,1206178,1206786,1206830,1207585,1207694,1208140,1208153,1208313,1212021,1212062,1212073,1212084,1212299,1213537,1213586,1213592-1213593,1213954,1214027,1214046,1220510,1221106,1221348,1225114,1225192,
1225456,1225489,1225591,1226211,1226239,1226350,1227091,1227165,1227423,1227964,1229347,1230398,1231569,1231572,1231627,1231640,1233605,1234555,1235135,1235137,1235956,1236456,1238700,1238779,1238969,1239752,1240020,1240897,1240928,1242087
/hadoop/core/branches/branch-0.19/hdfs:713112
/hadoop/hdfs/branches/HDFS-1052:987665-1095512
/hadoop/hdfs/branches/HDFS-265:796829-820463
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Wed Feb 8 21:04:47 2012
@@ -2,6 +2,13 @@ Hadoop HDFS Change Log
Release 0.23.2 - UNRELEASED
+ INCOMPATIBLE CHANGES
+
+ HDFS-2887. FSVolume, is a part of FSDatasetInterface implementation, should
+ not be referred outside FSDataset. A new FSVolumeInterface is defined.
+ The BlockVolumeChoosingPolicy.chooseVolume(..) method signature is also
+ updated. (szetszwo)
+
NEW FEATURES
IMPROVEMENTS
Propchange: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 8 21:04:47 2012
@@ -1,4 +1,4 @@
-/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java:1161777,1161781,1162188,1162421,1162491,1162499,1162613,1162928,1162954,1162979,1163050,1163069,1163081,1163490,1163768,1164255,1164301,1164339,1166402,1167383,1167662,1170085,1170379,1170459,1170996,1171136,1171297,1171379,1171611,1172916,1173402,1173468,1175113,1176178,1176550,1176719,1176729,1176733,1177100,1177161,1177487,1177531,1177757,1177859,1177864,1177905,1179169,1179856,1179861,1180757,1182189,1182205,1182214,1183081,1183098,1183175,1183554,1186508,1187140,1189028,1189355,1189360,1189546,1189613,1189932,1189982,1190077,1190708,1195575,1195656,1195731,1195754,1196113,1196129,1197329,1198903,1199396,1200731,1204114,1204117,1204122,1204124,1204129,1204131,1204177,1204370,1204376,1204388,1205146,1205260,1205697,1206786,1206830,1207694,1208140,1208153,1208313,1212021,1212062,1212073,1212084,1212299,1213537,1213586,1213592-1213593,1213954,1214027,1214046,1220510,1221106,1221348,1225114,1225192,1225456,12
25489,1225591,1226211,1226239,1226350,1227091,1227165,1227423,1227964,1229347,1230398,1231569,1231572,1231627,1231640,1233605,1234555,1235135,1235137,1235956,1236456,1238700,1238779,1238969,1239752,1240020,1240897,1240928
+/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java:1161777,1161781,1162188,1162421,1162491,1162499,1162613,1162928,1162954,1162979,1163050,1163069,1163081,1163490,1163768,1164255,1164301,1164339,1166402,1167383,1167662,1170085,1170379,1170459,1170996,1171136,1171297,1171379,1171611,1172916,1173402,1173468,1175113,1176178,1176550,1176719,1176729,1176733,1177100,1177161,1177487,1177531,1177757,1177859,1177864,1177905,1179169,1179856,1179861,1180757,1182189,1182205,1182214,1183081,1183098,1183175,1183554,1186508,1187140,1189028,1189355,1189360,1189546,1189613,1189932,1189982,1190077,1190708,1195575,1195656,1195731,1195754,1196113,1196129,1197329,1198903,1199396,1200731,1204114,1204117,1204122,1204124,1204129,1204131,1204177,1204370,1204376,1204388,1205146,1205260,1205697,1206786,1206830,1207694,1208140,1208153,1208313,1212021,1212062,1212073,1212084,1212299,1213537,1213586,1213592-1213593,1213954,1214027,1214046,1220510,1221106,1221348,1225114,1225192,1225456,12
25489,1225591,1226211,1226239,1226350,1227091,1227165,1227423,1227964,1229347,1230398,1231569,1231572,1231627,1231640,1233605,1234555,1235135,1235137,1235956,1236456,1238700,1238779,1238969,1239752,1240020,1240897,1240928,1242087
/hadoop/core/branches/branch-0.19/hdfs/src/java:713112
/hadoop/core/trunk/src/hdfs:776175-785643,785929-786278
/hadoop/hdfs/branches/HDFS-1052/src/java:987665-1095512
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java Wed Feb 8 21:04:47 2012
@@ -46,15 +46,14 @@ import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
import org.apache.hadoop.hdfs.server.common.GenerationStamp;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.hdfs.util.DataTransferThrottler;
import org.apache.hadoop.io.IOUtils;
/**
* Performs two types of scanning:
* <li> Gets block files from the data directories and reconciles the
- * difference between the blocks on the disk and in memory in
- * {@link FSDataset}</li>
+ * difference between the blocks on the disk and in memory.</li>
* <li> Scans the data directories for block files under a block pool
* and verifies that the files are not corrupt</li>
* This keeps track of blocks and their last verification times.
@@ -78,7 +77,7 @@ class BlockPoolSliceScanner {
private long scanPeriod = DEFAULT_SCAN_PERIOD_HOURS * 3600 * 1000;
private DataNode datanode;
- private FSDataset dataset;
+ private final FSDatasetInterface dataset;
// sorted set
private TreeSet<BlockScanInfo> blockInfoSet;
@@ -137,8 +136,8 @@ class BlockPoolSliceScanner {
}
}
- BlockPoolSliceScanner(DataNode datanode, FSDataset dataset, Configuration conf,
- String bpid) {
+ BlockPoolSliceScanner(DataNode datanode, FSDatasetInterface dataset,
+ Configuration conf, String bpid) {
this.datanode = datanode;
this.dataset = dataset;
this.blockPoolId = bpid;
@@ -220,16 +219,16 @@ class BlockPoolSliceScanner {
* otherwise, pick the first directory.
*/
File dir = null;
- List<FSVolume> volumes = dataset.volumes.getVolumes();
- for (FSDataset.FSVolume vol : dataset.volumes.getVolumes()) {
- File bpDir = vol.getBlockPoolSlice(blockPoolId).getDirectory();
+ List<FSVolumeInterface> volumes = dataset.getVolumes();
+ for (FSVolumeInterface vol : volumes) {
+ File bpDir = vol.getDirectory(blockPoolId);
if (LogFileHandler.isFilePresent(bpDir, verificationLogFile)) {
dir = bpDir;
break;
}
}
if (dir == null) {
- dir = volumes.get(0).getBlockPoolSlice(blockPoolId).getDirectory();
+ dir = volumes.get(0).getDirectory(blockPoolId);
}
try {
@@ -577,8 +576,8 @@ class BlockPoolSliceScanner {
bytesLeft += len;
}
- static File getCurrentFile(FSVolume vol, String bpid) throws IOException {
- return LogFileHandler.getCurrentFile(vol.getBlockPoolSlice(bpid).getDirectory(),
+ static File getCurrentFile(FSVolumeInterface vol, String bpid) throws IOException {
+ return LogFileHandler.getCurrentFile(vol.getDirectory(bpid),
BlockPoolSliceScanner.verificationLogFile);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockVolumeChoosingPolicy.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockVolumeChoosingPolicy.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockVolumeChoosingPolicy.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockVolumeChoosingPolicy.java Wed Feb 8 21:04:47 2012
@@ -22,7 +22,7 @@ import java.util.List;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
/**************************************************
* BlockVolumeChoosingPolicy allows a DataNode to
@@ -46,7 +46,7 @@ public interface BlockVolumeChoosingPoli
* @return the chosen volume to store the block.
* @throws IOException when disks are unavailable or are full.
*/
- public FSVolume chooseVolume(List<FSVolume> volumes, long blockSize)
+ public FSVolumeInterface chooseVolume(List<FSVolumeInterface> volumes, long blockSize)
throws IOException;
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java Wed Feb 8 21:04:47 2012
@@ -27,12 +27,12 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
* DataBlockScanner manages block scanning for all the block pools. For each
@@ -44,7 +44,7 @@ import org.apache.commons.logging.LogFac
public class DataBlockScanner implements Runnable {
public static final Log LOG = LogFactory.getLog(DataBlockScanner.class);
private final DataNode datanode;
- private final FSDataset dataset;
+ private final FSDatasetInterface dataset;
private final Configuration conf;
/**
@@ -55,7 +55,7 @@ public class DataBlockScanner implements
new TreeMap<String, BlockPoolSliceScanner>();
Thread blockScannerThread = null;
- DataBlockScanner(DataNode datanode, FSDataset dataset, Configuration conf) {
+ DataBlockScanner(DataNode datanode, FSDatasetInterface dataset, Configuration conf) {
this.datanode = datanode;
this.dataset = dataset;
this.conf = conf;
@@ -135,7 +135,7 @@ public class DataBlockScanner implements
.iterator();
while (bpidIterator.hasNext()) {
String bpid = bpidIterator.next();
- for (FSDataset.FSVolume vol : dataset.volumes.getVolumes()) {
+ for (FSDatasetInterface.FSVolumeInterface vol : dataset.getVolumes()) {
try {
File currFile = BlockPoolSliceScanner.getCurrentFile(vol, bpid);
if (currFile.exists()) {
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java Wed Feb 8 21:04:47 2012
@@ -117,7 +117,6 @@ import org.apache.hadoop.hdfs.server.com
import org.apache.hadoop.hdfs.server.common.JspHelper;
import org.apache.hadoop.hdfs.server.common.StorageInfo;
import org.apache.hadoop.hdfs.server.common.Util;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.VolumeInfo;
import org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter.SecureResources;
import org.apache.hadoop.hdfs.server.datanode.metrics.DataNodeMetrics;
import org.apache.hadoop.hdfs.server.datanode.web.resources.DatanodeWebHdfsMethods;
@@ -556,11 +555,11 @@ public class DataNode extends Configured
if (conf.getInt(DFS_DATANODE_SCAN_PERIOD_HOURS_KEY,
DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT) < 0) {
reason = "verification is turned off by configuration";
- } else if (!(data instanceof FSDataset)) {
- reason = "verifcation is supported only with FSDataset";
+ } else if ("SimulatedFSDataset".equals(data.getClass().getSimpleName())) {
+ reason = "verifcation is not supported by SimulatedFSDataset";
}
if (reason == null) {
- blockScanner = new DataBlockScanner(this, (FSDataset)data, conf);
+ blockScanner = new DataBlockScanner(this, data, conf);
blockScanner.start();
} else {
LOG.info("Periodic Block Verification scan is disabled because " +
@@ -585,11 +584,11 @@ public class DataNode extends Configured
if (conf.getInt(DFS_DATANODE_DIRECTORYSCAN_INTERVAL_KEY,
DFS_DATANODE_DIRECTORYSCAN_INTERVAL_DEFAULT) < 0) {
reason = "verification is turned off by configuration";
- } else if (!(data instanceof FSDataset)) {
- reason = "verification is supported only with FSDataset";
+ } else if ("SimulatedFSDataset".equals(data.getClass().getSimpleName())) {
+ reason = "verifcation is not supported by SimulatedFSDataset";
}
if (reason == null) {
- directoryScanner = new DirectoryScanner(this, (FSDataset) data, conf);
+ directoryScanner = new DirectoryScanner(this, data, conf);
directoryScanner.start();
} else {
LOG.info("Periodic Directory Tree Verification scan is disabled because " +
@@ -2200,16 +2199,7 @@ public class DataNode extends Configured
*/
@Override // DataNodeMXBean
public String getVolumeInfo() {
- final Map<String, Object> info = new HashMap<String, Object>();
- Collection<VolumeInfo> volumes = ((FSDataset)this.data).getVolumeInfo();
- for (VolumeInfo v : volumes) {
- final Map<String, Object> innerInfo = new HashMap<String, Object>();
- innerInfo.put("usedSpace", v.usedSpace);
- innerInfo.put("freeSpace", v.freeSpace);
- innerInfo.put("reservedSpace", v.reservedSpace);
- info.put(v.directory, innerInfo);
- }
- return JSON.toString(info);
+ return JSON.toString(data.getVolumeInfoMap());
}
@Override // DataNodeMXBean
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataStorage.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataStorage.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataStorage.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataStorage.java Wed Feb 8 21:04:47 2012
@@ -751,7 +751,7 @@ public class DataStorage extends Storage
Matcher matcher = PRE_GENSTAMP_META_FILE_PATTERN.matcher(oldFileName);
if (matcher.matches()) {
//return the current metadata file name
- return FSDataset.getMetaFileName(matcher.group(1),
+ return DatanodeUtil.getMetaFileName(matcher.group(1),
GenerationStamp.GRANDFATHER_GENERATION_STAMP);
}
return oldFileName;
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeUtil.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeUtil.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeUtil.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DatanodeUtil.java Wed Feb 8 21:04:47 2012
@@ -18,7 +18,9 @@
package org.apache.hadoop.hdfs.server.datanode;
import java.io.File;
+import java.io.FilenameFilter;
import java.io.IOException;
+import java.util.Arrays;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.hdfs.protocol.Block;
@@ -26,6 +28,10 @@ import org.apache.hadoop.hdfs.protocol.B
/** Provide utility methods for Datanode. */
@InterfaceAudience.Private
class DatanodeUtil {
+ static final String METADATA_EXTENSION = ".meta";
+
+ static final String UNLINK_BLOCK_SUFFIX = ".unlinked";
+
private final static String DISK_ERROR = "Possible disk error on file creation: ";
/** Get the cause of an I/O exception if caused by a possible disk error
@@ -64,4 +70,37 @@ class DatanodeUtil {
}
return f;
}
+
+ static String getMetaFileName(String blockFileName, long genStamp) {
+ return blockFileName + "_" + genStamp + METADATA_EXTENSION;
+ }
+
+ static File getMetaFile(File f, long genStamp) {
+ return new File(getMetaFileName(f.getAbsolutePath(), genStamp));
+ }
+
+ /** Find the corresponding meta data file from a given block file */
+ static File findMetaFile(final File blockFile) throws IOException {
+ final String prefix = blockFile.getName() + "_";
+ final File parent = blockFile.getParentFile();
+ File[] matches = parent.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return dir.equals(parent)
+ && name.startsWith(prefix) && name.endsWith(METADATA_EXTENSION);
+ }
+ });
+
+ if (matches == null || matches.length == 0) {
+ throw new IOException("Meta file not found, blockFile=" + blockFile);
+ }
+ else if (matches.length > 1) {
+ throw new IOException("Found more than one meta files: "
+ + Arrays.asList(matches));
+ }
+ return matches[0];
+ }
+
+ static File getUnlinkTmpFile(File f) {
+ return new File(f.getParentFile(), f.getName()+UNLINK_BLOCK_SUFFIX);
+ }
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DirectoryScanner.java Wed Feb 8 21:04:47 2012
@@ -43,20 +43,19 @@ import org.apache.hadoop.hdfs.DFSConfigK
import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.GenerationStamp;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.util.Daemon;
/**
* Periodically scans the data directories for block and block metadata files.
- * Reconciles the differences with block information maintained in
- * {@link FSDataset}
+ * Reconciles the differences with block information maintained in the dataset.
*/
@InterfaceAudience.Private
public class DirectoryScanner implements Runnable {
private static final Log LOG = LogFactory.getLog(DirectoryScanner.class);
private final DataNode datanode;
- private final FSDataset dataset;
+ private final FSDatasetInterface dataset;
private final ExecutorService reportCompileThreadPool;
private final ScheduledExecutorService masterThread;
private final long scanPeriodMsecs;
@@ -158,13 +157,13 @@ public class DirectoryScanner implements
private final long blockId;
private final File metaFile;
private final File blockFile;
- private final FSVolume volume;
+ private final FSVolumeInterface volume;
ScanInfo(long blockId) {
this(blockId, null, null, null);
}
- ScanInfo(long blockId, File blockFile, File metaFile, FSVolume vol) {
+ ScanInfo(long blockId, File blockFile, File metaFile, FSVolumeInterface vol) {
this.blockId = blockId;
this.metaFile = metaFile;
this.blockFile = blockFile;
@@ -183,7 +182,7 @@ public class DirectoryScanner implements
return blockId;
}
- FSVolume getVolume() {
+ FSVolumeInterface getVolume() {
return volume;
}
@@ -220,7 +219,7 @@ public class DirectoryScanner implements
}
}
- DirectoryScanner(DataNode dn, FSDataset dataset, Configuration conf) {
+ DirectoryScanner(DataNode dn, FSDatasetInterface dataset, Configuration conf) {
this.datanode = dn;
this.dataset = dataset;
int interval = conf.getInt(DFSConfigKeys.DFS_DATANODE_DIRECTORYSCAN_INTERVAL_KEY,
@@ -269,7 +268,7 @@ public class DirectoryScanner implements
return;
}
- String[] bpids = dataset.getBPIdlist();
+ String[] bpids = dataset.getBlockPoolList();
for(String bpid : bpids) {
UpgradeManagerDatanode um =
datanode.getUpgradeManagerDatanode(bpid);
@@ -411,17 +410,29 @@ public class DirectoryScanner implements
diffRecord.add(new ScanInfo(blockId));
}
+ /** Is the given volume still valid in the dataset? */
+ private static boolean isValid(final FSDatasetInterface dataset,
+ final FSVolumeInterface volume) {
+ for (FSVolumeInterface vol : dataset.getVolumes()) {
+ if (vol == volume) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/** Get lists of blocks on the disk sorted by blockId, per blockpool */
private Map<String, ScanInfo[]> getDiskReport() {
// First get list of data directories
- List<FSVolume> volumes = dataset.volumes.getVolumes();
+ final List<FSVolumeInterface> volumes = dataset.getVolumes();
ArrayList<ScanInfoPerBlockPool> dirReports =
new ArrayList<ScanInfoPerBlockPool>(volumes.size());
Map<Integer, Future<ScanInfoPerBlockPool>> compilersInProgress =
new HashMap<Integer, Future<ScanInfoPerBlockPool>>();
for (int i = 0; i < volumes.size(); i++) {
- if (!dataset.volumes.isValid(volumes.get(i))) { // volume is still valid
+ if (!isValid(dataset, volumes.get(i))) {
+ // volume is invalid
dirReports.add(i, null);
} else {
ReportCompiler reportCompiler =
@@ -446,7 +457,8 @@ public class DirectoryScanner implements
// Compile consolidated report for all the volumes
ScanInfoPerBlockPool list = new ScanInfoPerBlockPool();
for (int i = 0; i < volumes.size(); i++) {
- if (dataset.volumes.isValid(volumes.get(i))) { // volume is still valid
+ if (isValid(dataset, volumes.get(i))) {
+ // volume is still valid
list.addAll(dirReports.get(i));
}
}
@@ -461,9 +473,9 @@ public class DirectoryScanner implements
private static class ReportCompiler
implements Callable<ScanInfoPerBlockPool> {
- private FSVolume volume;
+ private FSVolumeInterface volume;
- public ReportCompiler(FSVolume volume) {
+ public ReportCompiler(FSVolumeInterface volume) {
this.volume = volume;
}
@@ -473,14 +485,14 @@ public class DirectoryScanner implements
ScanInfoPerBlockPool result = new ScanInfoPerBlockPool(bpList.length);
for (String bpid : bpList) {
LinkedList<ScanInfo> report = new LinkedList<ScanInfo>();
- File bpFinalizedDir = volume.getBlockPoolSlice(bpid).getFinalizedDir();
+ File bpFinalizedDir = volume.getFinalizedDir(bpid);
result.put(bpid, compileReport(volume, bpFinalizedDir, report));
}
return result;
}
/** Compile list {@link ScanInfo} for the blocks in the directory <dir> */
- private LinkedList<ScanInfo> compileReport(FSVolume vol, File dir,
+ private LinkedList<ScanInfo> compileReport(FSVolumeInterface vol, File dir,
LinkedList<ScanInfo> report) {
File[] files;
try {
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java Wed Feb 8 21:04:47 2012
@@ -23,7 +23,6 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
-import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
@@ -82,14 +81,13 @@ class FSDataset implements FSDatasetInte
* A node type that can be built into a tree reflecting the
* hierarchy of blocks on the local disk.
*/
- class FSDir {
- File dir;
+ private class FSDir {
+ final File dir;
int numBlocks = 0;
FSDir children[];
int lastChildIdx = 0;
- /**
- */
- public FSDir(File dir)
+
+ private FSDir(File dir)
throws IOException {
this.dir = dir;
this.children = null;
@@ -114,7 +112,7 @@ class FSDataset implements FSDatasetInte
}
}
- public File addBlock(Block b, File src) throws IOException {
+ private File addBlock(Block b, File src) throws IOException {
//First try without creating subdirectories
File file = addBlock(b, src, false, false);
return (file != null) ? file : addBlock(b, src, true, true);
@@ -162,7 +160,7 @@ class FSDataset implements FSDatasetInte
return children[ lastChildIdx ].addBlock(b, src, true, false);
}
- void getVolumeMap(String bpid, ReplicasMap volumeMap, FSVolume volume)
+ private void getVolumeMap(String bpid, ReplicasMap volumeMap, FSVolume volume)
throws IOException {
if (children != null) {
for (int i = 0; i < children.length; i++) {
@@ -208,7 +206,7 @@ class FSDataset implements FSDatasetInte
* check if a data diretory is healthy
* @throws DiskErrorException
*/
- public void checkDirTree() throws DiskErrorException {
+ private void checkDirTree() throws DiskErrorException {
DiskChecker.checkDir(dir);
if (children != null) {
@@ -218,7 +216,7 @@ class FSDataset implements FSDatasetInte
}
}
- void clearPath(File f) {
+ private void clearPath(File f) {
String root = dir.getAbsolutePath();
String dir = f.getAbsolutePath();
if (dir.startsWith(root)) {
@@ -271,7 +269,8 @@ class FSDataset implements FSDatasetInte
}
return false;
}
-
+
+ @Override
public String toString() {
return "FSDir{" +
"dir=" + dir +
@@ -285,7 +284,7 @@ class FSDataset implements FSDatasetInte
* Taken together, all BlockPoolSlices sharing a block pool ID across a
* cluster represent a single block pool.
*/
- class BlockPoolSlice {
+ private class BlockPoolSlice {
private final String bpid;
private final FSVolume volume; // volume to which this BlockPool belongs to
private final File currentDir; // StorageDirectory/current/bpid/current
@@ -343,11 +342,7 @@ class FSDataset implements FSDatasetInte
File getDirectory() {
return currentDir.getParentFile();
}
-
- File getCurrentDir() {
- return currentDir;
- }
-
+
File getFinalizedDir() {
return finalizedDir.dir;
}
@@ -388,7 +383,7 @@ class FSDataset implements FSDatasetInte
File addBlock(Block b, File f) throws IOException {
File blockFile = finalizedDir.addBlock(b, f);
- File metaFile = getMetaFile(blockFile , b.getGenerationStamp());
+ File metaFile = DatanodeUtil.getMetaFile(blockFile, b.getGenerationStamp());
dfsUsage.incDfsUsed(b.getNumBytes()+metaFile.length());
return blockFile;
}
@@ -456,7 +451,7 @@ class FSDataset implements FSDatasetInte
DataInputStream checksumIn = null;
InputStream blockIn = null;
try {
- File metaFile = new File(getMetaFileName(blockFile.toString(), genStamp));
+ final File metaFile = DatanodeUtil.getMetaFile(blockFile, genStamp);
long blockFileLen = blockFile.length();
long metaFileLen = metaFile.length();
int crcHeaderLen = DataChecksum.getChecksumHeaderSize();
@@ -522,7 +517,7 @@ class FSDataset implements FSDatasetInte
}
}
- class FSVolume {
+ class FSVolume implements FSVolumeInterface {
private final Map<String, BlockPoolSlice> map = new HashMap<String, BlockPoolSlice>();
private final File currentDir; // <StorageDirectory>/current
private final DF usage;
@@ -535,11 +530,6 @@ class FSDataset implements FSDatasetInte
File parent = currentDir.getParentFile();
this.usage = new DF(parent, conf);
}
-
- /** Return storage directory corresponding to the volume */
- File getDir() {
- return currentDir.getParentFile();
- }
File getCurrentDir() {
return currentDir;
@@ -584,8 +574,9 @@ class FSDataset implements FSDatasetInte
long remaining = usage.getCapacity() - reserved;
return remaining > 0 ? remaining : 0;
}
-
- long getAvailable() throws IOException {
+
+ @Override
+ public long getAvailable() throws IOException {
long remaining = getCapacity()-getDfsUsed();
long available = usage.getAvailable();
if (remaining>available) {
@@ -601,19 +592,30 @@ class FSDataset implements FSDatasetInte
String getMount() throws IOException {
return usage.getMount();
}
-
- BlockPoolSlice getBlockPoolSlice(String bpid) throws IOException {
+
+ private BlockPoolSlice getBlockPoolSlice(String bpid) throws IOException {
BlockPoolSlice bp = map.get(bpid);
if (bp == null) {
throw new IOException("block pool " + bpid + " is not found");
}
return bp;
}
-
+
+ @Override
+ public File getDirectory(String bpid) throws IOException {
+ return getBlockPoolSlice(bpid).getDirectory();
+ }
+
+ @Override
+ public File getFinalizedDir(String bpid) throws IOException {
+ return getBlockPoolSlice(bpid).getFinalizedDir();
+ }
+
/**
* Make a deep copy of the list of currently active BPIDs
*/
- String[] getBlockPoolList() {
+ @Override
+ public String[] getBlockPoolList() {
synchronized(FSDataset.this) {
return map.keySet().toArray(new String[map.keySet().size()]);
}
@@ -682,7 +684,8 @@ class FSDataset implements FSDatasetInte
BlockPoolSlice bp = getBlockPoolSlice(bpid);
bp.clearPath(f);
}
-
+
+ @Override
public String toString() {
return currentDir.getAbsolutePath();
}
@@ -774,21 +777,18 @@ class FSDataset implements FSDatasetInte
* Read access to this unmodifiable list is not synchronized.
* This list is replaced on modification holding "this" lock.
*/
- private volatile List<FSVolume> volumes = null;
+ private volatile List<FSVolumeInterface> volumes = null;
+
BlockVolumeChoosingPolicy blockChooser;
int numFailedVolumes;
- FSVolumeSet(FSVolume[] volumes, int failedVols, BlockVolumeChoosingPolicy blockChooser) {
- List<FSVolume> list = Arrays.asList(volumes);
- this.volumes = Collections.unmodifiableList(list);
+ FSVolumeSet(List<FSVolumeInterface> volumes, int failedVols,
+ BlockVolumeChoosingPolicy blockChooser) {
+ this.volumes = Collections.unmodifiableList(volumes);
this.blockChooser = blockChooser;
this.numFailedVolumes = failedVols;
}
- private int numberOfVolumes() {
- return volumes.size();
- }
-
private int numberOfFailedVolumes() {
return numFailedVolumes;
}
@@ -801,36 +801,36 @@ class FSDataset implements FSDatasetInte
* @return next volume to store the block in.
*/
synchronized FSVolume getNextVolume(long blockSize) throws IOException {
- return blockChooser.chooseVolume(volumes, blockSize);
+ return (FSVolume)blockChooser.chooseVolume(volumes, blockSize);
}
private long getDfsUsed() throws IOException {
long dfsUsed = 0L;
- for (FSVolume vol : volumes) {
- dfsUsed += vol.getDfsUsed();
+ for (FSVolumeInterface v : volumes) {
+ dfsUsed += ((FSVolume)v).getDfsUsed();
}
return dfsUsed;
}
private long getBlockPoolUsed(String bpid) throws IOException {
long dfsUsed = 0L;
- for (FSVolume vol : volumes) {
- dfsUsed += vol.getBlockPoolUsed(bpid);
+ for (FSVolumeInterface v : volumes) {
+ dfsUsed += ((FSVolume)v).getBlockPoolUsed(bpid);
}
return dfsUsed;
}
private long getCapacity() throws IOException {
long capacity = 0L;
- for (FSVolume vol : volumes) {
- capacity += vol.getCapacity();
+ for (FSVolumeInterface v : volumes) {
+ capacity += ((FSVolume)v).getCapacity();
}
return capacity;
}
private long getRemaining() throws IOException {
long remaining = 0L;
- for (FSVolume vol : volumes) {
+ for (FSVolumeInterface vol : volumes) {
remaining += vol.getAvailable();
}
return remaining;
@@ -838,15 +838,15 @@ class FSDataset implements FSDatasetInte
private void getVolumeMap(ReplicasMap volumeMap)
throws IOException {
- for (FSVolume vol : volumes) {
- vol.getVolumeMap(volumeMap);
+ for (FSVolumeInterface v : volumes) {
+ ((FSVolume)v).getVolumeMap(volumeMap);
}
}
private void getVolumeMap(String bpid, ReplicasMap volumeMap)
throws IOException {
- for (FSVolume vol : volumes) {
- vol.getVolumeMap(bpid, volumeMap);
+ for (FSVolumeInterface v : volumes) {
+ ((FSVolume)v).getVolumeMap(bpid, volumeMap);
}
}
@@ -862,10 +862,10 @@ class FSDataset implements FSDatasetInte
ArrayList<FSVolume> removedVols = null;
// Make a copy of volumes for performing modification
- List<FSVolume> volumeList = new ArrayList<FSVolume>(getVolumes());
+ final List<FSVolumeInterface> volumeList = new ArrayList<FSVolumeInterface>(volumes);
for (int idx = 0; idx < volumeList.size(); idx++) {
- FSVolume fsv = volumeList.get(idx);
+ FSVolume fsv = (FSVolume)volumeList.get(idx);
try {
fsv.checkDirs();
} catch (DiskErrorException e) {
@@ -882,8 +882,8 @@ class FSDataset implements FSDatasetInte
// Remove null volumes from the volumes array
if (removedVols != null && removedVols.size() > 0) {
- List<FSVolume> newVols = new ArrayList<FSVolume>();
- for (FSVolume vol : volumeList) {
+ List<FSVolumeInterface> newVols = new ArrayList<FSVolumeInterface>();
+ for (FSVolumeInterface vol : volumeList) {
if (vol != null) {
newVols.add(vol);
}
@@ -896,44 +896,30 @@ class FSDataset implements FSDatasetInte
return removedVols;
}
-
+
+ @Override
public String toString() {
return volumes.toString();
}
- boolean isValid(FSVolume volume) {
- for (FSVolume vol : volumes) {
- if (vol == volume) {
- return true;
- }
- }
- return false;
- }
private void addBlockPool(String bpid, Configuration conf)
throws IOException {
- for (FSVolume v : volumes) {
- v.addBlockPool(bpid, conf);
+ for (FSVolumeInterface v : volumes) {
+ ((FSVolume)v).addBlockPool(bpid, conf);
}
}
private void removeBlockPool(String bpid) {
- for (FSVolume v : volumes) {
- v.shutdownBlockPool(bpid);
+ for (FSVolumeInterface v : volumes) {
+ ((FSVolume)v).shutdownBlockPool(bpid);
}
}
-
- /**
- * @return unmodifiable list of volumes
- */
- public List<FSVolume> getVolumes() {
- return volumes;
- }
private void shutdown() {
- for (FSVolume volume : volumes) {
+ for (FSVolumeInterface volume : volumes) {
if(volume != null) {
- volume.shutdown();
+ ((FSVolume)volume).shutdown();
}
}
}
@@ -945,35 +931,20 @@ class FSDataset implements FSDatasetInte
//
//////////////////////////////////////////////////////
- //Find better place?
- static final String METADATA_EXTENSION = ".meta";
- static final String UNLINK_BLOCK_SUFFIX = ".unlinked";
-
private static boolean isUnlinkTmpFile(File f) {
String name = f.getName();
- return name.endsWith(UNLINK_BLOCK_SUFFIX);
- }
-
- static File getUnlinkTmpFile(File f) {
- return new File(f.getParentFile(), f.getName()+UNLINK_BLOCK_SUFFIX);
+ return name.endsWith(DatanodeUtil.UNLINK_BLOCK_SUFFIX);
}
private static File getOrigFile(File unlinkTmpFile) {
String fileName = unlinkTmpFile.getName();
return new File(unlinkTmpFile.getParentFile(),
- fileName.substring(0, fileName.length()-UNLINK_BLOCK_SUFFIX.length()));
- }
-
- static String getMetaFileName(String blockFileName, long genStamp) {
- return blockFileName + "_" + genStamp + METADATA_EXTENSION;
- }
-
- static File getMetaFile(File f , long genStamp) {
- return new File(getMetaFileName(f.getAbsolutePath(), genStamp));
+ fileName.substring(0,
+ fileName.length() - DatanodeUtil.UNLINK_BLOCK_SUFFIX.length()));
}
protected File getMetaFile(ExtendedBlock b) throws IOException {
- return getMetaFile(getBlockFile(b), b.getGenerationStamp());
+ return DatanodeUtil.getMetaFile(getBlockFile(b), b.getGenerationStamp());
}
/** Find the metadata file for the specified block file.
@@ -995,34 +966,13 @@ class FSDataset implements FSDatasetInte
" does not have a metafile!");
return GenerationStamp.GRANDFATHER_GENERATION_STAMP;
}
-
- /** Find the corresponding meta data file from a given block file */
- private static File findMetaFile(final File blockFile) throws IOException {
- final String prefix = blockFile.getName() + "_";
- final File parent = blockFile.getParentFile();
- File[] matches = parent.listFiles(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return dir.equals(parent)
- && name.startsWith(prefix) && name.endsWith(METADATA_EXTENSION);
- }
- });
-
- if (matches == null || matches.length == 0) {
- throw new IOException("Meta file not found, blockFile=" + blockFile);
- }
- else if (matches.length > 1) {
- throw new IOException("Found more than one meta files: "
- + Arrays.asList(matches));
- }
- return matches[0];
- }
/** Find the corresponding meta data file from a given block file */
private static long parseGenerationStamp(File blockFile, File metaFile
) throws IOException {
String metaname = metaFile.getName();
String gs = metaname.substring(blockFile.getName().length() + 1,
- metaname.length() - METADATA_EXTENSION.length());
+ metaname.length() - DatanodeUtil.METADATA_EXTENSION.length());
try {
return Long.parseLong(gs);
} catch(NumberFormatException nfe) {
@@ -1032,13 +982,18 @@ class FSDataset implements FSDatasetInte
}
@Override // FSDatasetInterface
+ public List<FSVolumeInterface> getVolumes() {
+ return volumes.volumes;
+ }
+
+ @Override // FSDatasetInterface
public synchronized Block getStoredBlock(String bpid, long blkid)
throws IOException {
File blockfile = getFile(bpid, blkid);
if (blockfile == null) {
return null;
}
- File metafile = findMetaFile(blockfile);
+ final File metafile = DatanodeUtil.findMetaFile(blockfile);
return new Block(blkid, blockfile.length(),
parseGenerationStamp(blockfile, metafile));
}
@@ -1102,7 +1057,7 @@ class FSDataset implements FSDatasetInte
/**
* An FSDataset has a directory where it loads its data files.
*/
- public FSDataset(DataNode datanode, DataStorage storage, Configuration conf)
+ FSDataset(DataNode datanode, DataStorage storage, Configuration conf)
throws IOException {
this.datanode = datanode;
this.maxBlocksPerDir =
@@ -1135,12 +1090,12 @@ class FSDataset implements FSDatasetInte
+ ", volume failures tolerated: " + volFailuresTolerated);
}
- FSVolume[] volArray = new FSVolume[storage.getNumStorageDirs()];
+ final List<FSVolumeInterface> volArray = new ArrayList<FSVolumeInterface>(
+ storage.getNumStorageDirs());
for (int idx = 0; idx < storage.getNumStorageDirs(); idx++) {
- volArray[idx] = new FSVolume(storage.getStorageDir(idx).getCurrentDir(),
- conf);
- DataNode.LOG.info("FSDataset added volume - "
- + storage.getStorageDir(idx).getCurrentDir());
+ final File dir = storage.getStorageDir(idx).getCurrentDir();
+ volArray.add(new FSVolume(dir, conf));
+ DataNode.LOG.info("FSDataset added volume - " + dir);
}
volumeMap = new ReplicasMap(this);
@@ -1186,7 +1141,7 @@ class FSDataset implements FSDatasetInte
*/
@Override // FSDatasetInterface
public boolean hasEnoughResource() {
- return volumes.numberOfVolumes() >= validVolsRequired;
+ return getVolumes().size() >= validVolsRequired;
}
/**
@@ -1369,8 +1324,8 @@ class FSDataset implements FSDatasetInte
private static File moveBlockFiles(Block b, File srcfile, File destdir
) throws IOException {
final File dstfile = new File(destdir, b.getBlockName());
- final File srcmeta = getMetaFile(srcfile, b.getGenerationStamp());
- final File dstmeta = getMetaFile(dstfile, b.getGenerationStamp());
+ final File srcmeta = DatanodeUtil.getMetaFile(srcfile, b.getGenerationStamp());
+ final File dstmeta = DatanodeUtil.getMetaFile(dstfile, b.getGenerationStamp());
if (!srcmeta.renameTo(dstmeta)) {
throw new IOException("Failed to move meta file for " + b
+ " from " + srcmeta + " to " + dstmeta);
@@ -1488,7 +1443,7 @@ class FSDataset implements FSDatasetInte
// construct a RBW replica with the new GS
File blkfile = replicaInfo.getBlockFile();
- FSVolume v = replicaInfo.getVolume();
+ FSVolume v = (FSVolume)replicaInfo.getVolume();
if (v.getAvailable() < estimateBlockLen - replicaInfo.getNumBytes()) {
throw new DiskOutOfSpaceException("Insufficient space for appending to "
+ replicaInfo);
@@ -1745,7 +1700,7 @@ class FSDataset implements FSDatasetInte
+ visible + ", temp=" + temp);
}
// check volume
- final FSVolume v = temp.getVolume();
+ final FSVolume v = (FSVolume)temp.getVolume();
if (v == null) {
throw new IOException("r.getVolume() = null, temp=" + temp);
}
@@ -1806,7 +1761,7 @@ class FSDataset implements FSDatasetInte
if ( vol == null ) {
ReplicaInfo replica = volumeMap.get(bpid, blk);
if (replica != null) {
- vol = volumeMap.get(bpid, blk).getVolume();
+ vol = (FSVolume)volumeMap.get(bpid, blk).getVolume();
}
if ( vol == null ) {
throw new IOException("Could not find volume for block " + blk);
@@ -1846,7 +1801,7 @@ class FSDataset implements FSDatasetInte
newReplicaInfo = (FinalizedReplica)
((ReplicaUnderRecovery)replicaInfo).getOriginalReplica();
} else {
- FSVolume v = replicaInfo.getVolume();
+ FSVolume v = (FSVolume)replicaInfo.getVolume();
File f = replicaInfo.getBlockFile();
if (v == null) {
throw new IOException("No volume for temporary file " + f +
@@ -1944,7 +1899,8 @@ class FSDataset implements FSDatasetInte
/**
* Get the list of finalized blocks from in-memory blockmap for a block pool.
*/
- synchronized List<Block> getFinalizedBlocks(String bpid) {
+ @Override
+ public synchronized List<Block> getFinalizedBlocks(String bpid) {
ArrayList<Block> finalized = new ArrayList<Block>(volumeMap.size(bpid));
for (ReplicaInfo b : volumeMap.replicas(bpid)) {
if(b.getState() == ReplicaState.FINALIZED) {
@@ -2017,7 +1973,7 @@ class FSDataset implements FSDatasetInte
}
//check replica's meta file
- final File metafile = getMetaFile(f, r.getGenerationStamp());
+ final File metafile = DatanodeUtil.getMetaFile(f, r.getGenerationStamp());
if (!metafile.exists()) {
throw new IOException("Metafile " + metafile + " does not exist, r=" + r);
}
@@ -2048,7 +2004,7 @@ class FSDataset implements FSDatasetInte
error = true;
continue;
}
- v = dinfo.getVolume();
+ v = (FSVolume)dinfo.getVolume();
if (f == null) {
DataNode.LOG.warn("Unexpected error trying to delete block "
+ invalidBlks[i] +
@@ -2082,7 +2038,7 @@ class FSDataset implements FSDatasetInte
}
volumeMap.remove(bpid, invalidBlks[i]);
}
- File metaFile = getMetaFile(f, invalidBlks[i].getGenerationStamp());
+ File metaFile = DatanodeUtil.getMetaFile(f, invalidBlks[i].getGenerationStamp());
// Delete the block asynchronously to make sure we can do it fast enough
asyncDiskService.deleteAsync(v, bpid, f, metaFile,
@@ -2235,8 +2191,9 @@ class FSDataset implements FSDatasetInte
* @param diskMetaFile Metadata file from on the disk
* @param vol Volume of the block file
*/
+ @Override
public void checkAndUpdate(String bpid, long blockId, File diskFile,
- File diskMetaFile, FSVolume vol) {
+ File diskMetaFile, FSVolumeInterface vol) {
Block corruptBlock = null;
ReplicaInfo memBlockInfo;
synchronized (this) {
@@ -2324,7 +2281,7 @@ class FSDataset implements FSDatasetInte
// Compare generation stamp
if (memBlockInfo.getGenerationStamp() != diskGS) {
- File memMetaFile = getMetaFile(diskFile,
+ File memMetaFile = DatanodeUtil.getMetaFile(diskFile,
memBlockInfo.getGenerationStamp());
if (memMetaFile.exists()) {
if (memMetaFile.compareTo(diskMetaFile) != 0) {
@@ -2559,18 +2516,15 @@ class FSDataset implements FSDatasetInte
volumes.removeBlockPool(bpid);
}
- /**
- * get list of all bpids
- * @return list of bpids
- */
- public String [] getBPIdlist() throws IOException {
+ @Override
+ public String[] getBlockPoolList() {
return volumeMap.getBlockPoolList();
}
/**
* Class for representing the Datanode volume information
*/
- static class VolumeInfo {
+ private static class VolumeInfo {
final String directory;
final long usedSpace;
final long freeSpace;
@@ -2583,10 +2537,11 @@ class FSDataset implements FSDatasetInte
this.reservedSpace = reservedSpace;
}
}
-
- Collection<VolumeInfo> getVolumeInfo() {
+
+ private Collection<VolumeInfo> getVolumeInfo() {
Collection<VolumeInfo> info = new ArrayList<VolumeInfo>();
- for (FSVolume volume : volumes.volumes) {
+ for (FSVolumeInterface v : volumes.volumes) {
+ final FSVolume volume = (FSVolume)v;
long used = 0;
long free = 0;
try {
@@ -2603,13 +2558,27 @@ class FSDataset implements FSDatasetInte
}
return info;
}
-
+
+ @Override
+ public Map<String, Object> getVolumeInfoMap() {
+ final Map<String, Object> info = new HashMap<String, Object>();
+ Collection<VolumeInfo> volumes = getVolumeInfo();
+ for (VolumeInfo v : volumes) {
+ final Map<String, Object> innerInfo = new HashMap<String, Object>();
+ innerInfo.put("usedSpace", v.usedSpace);
+ innerInfo.put("freeSpace", v.freeSpace);
+ innerInfo.put("reservedSpace", v.reservedSpace);
+ info.put(v.directory, innerInfo);
+ }
+ return info;
+ }
+
@Override //FSDatasetInterface
public synchronized void deleteBlockPool(String bpid, boolean force)
throws IOException {
if (!force) {
- for (FSVolume volume : volumes.volumes) {
- if (!volume.isBPDirEmpty(bpid)) {
+ for (FSVolumeInterface volume : volumes.volumes) {
+ if (!((FSVolume)volume).isBPDirEmpty(bpid)) {
DataNode.LOG.warn(bpid
+ " has some block files, cannot delete unless forced");
throw new IOException("Cannot delete block pool, "
@@ -2617,8 +2586,8 @@ class FSDataset implements FSDatasetInte
}
}
}
- for (FSVolume volume : volumes.volumes) {
- volume.deleteBPDirectories(bpid, force);
+ for (FSVolumeInterface volume : volumes.volumes) {
+ ((FSVolume)volume).deleteBPDirectories(bpid, force);
}
}
@@ -2626,7 +2595,7 @@ class FSDataset implements FSDatasetInte
public BlockLocalPathInfo getBlockLocalPathInfo(ExtendedBlock block)
throws IOException {
File datafile = getBlockFile(block);
- File metafile = getMetaFile(datafile, block.getGenerationStamp());
+ File metafile = DatanodeUtil.getMetaFile(datafile, block.getGenerationStamp());
BlockLocalPathInfo info = new BlockLocalPathInfo(block,
datafile.getAbsolutePath(), metafile.getAbsolutePath());
return info;
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDatasetInterface.java Wed Feb 8 21:04:47 2012
@@ -19,10 +19,13 @@ package org.apache.hadoop.hdfs.server.da
import java.io.Closeable;
+import java.io.File;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.conf.Configuration;
@@ -46,8 +49,44 @@ import org.apache.hadoop.util.DiskChecke
*/
@InterfaceAudience.Private
public interface FSDatasetInterface extends FSDatasetMBean {
-
-
+ /**
+ * This is an interface for the underlying volume.
+ * @see org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume
+ */
+ interface FSVolumeInterface {
+ /** @return a list of block pools. */
+ public String[] getBlockPoolList();
+
+ /** @return the available storage space in bytes. */
+ public long getAvailable() throws IOException;
+
+ /** @return the directory for the block pool. */
+ public File getDirectory(String bpid) throws IOException;
+
+ /** @return the directory for the finalized blocks in the block pool. */
+ public File getFinalizedDir(String bpid) throws IOException;
+ }
+
+ /** @return a list of volumes. */
+ public List<FSVolumeInterface> getVolumes();
+
+ /** @return a volume information map (name => info). */
+ public Map<String, Object> getVolumeInfoMap();
+
+ /** @return a list of block pools. */
+ public String[] getBlockPoolList();
+
+ /** @return a list of finalized blocks for the given block pool. */
+ public List<Block> getFinalizedBlocks(String bpid);
+
+ /**
+ * Check whether the in-memory block record matches the block on the disk,
+ * and, in case that they are not matched, update the record or mark it
+ * as corrupted.
+ */
+ public void checkAndUpdate(String bpid, long blockId, File diskFile,
+ File diskMetaFile, FSVolumeInterface vol);
+
/**
* Returns the length of the metadata file of the specified block
* @param b - the block for which the metadata length is desired
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FinalizedReplica.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FinalizedReplica.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FinalizedReplica.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FinalizedReplica.java Wed Feb 8 21:04:47 2012
@@ -21,7 +21,7 @@ import java.io.File;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
/**
* This class describes a replica that has been finalized.
@@ -38,7 +38,7 @@ class FinalizedReplica extends ReplicaIn
* @param dir directory path where block and meta files are located
*/
FinalizedReplica(long blockId, long len, long genStamp,
- FSVolume vol, File dir) {
+ FSVolumeInterface vol, File dir) {
super(blockId, len, genStamp, vol, dir);
}
@@ -48,7 +48,7 @@ class FinalizedReplica extends ReplicaIn
* @param vol volume where replica is located
* @param dir directory path where block and meta files are located
*/
- FinalizedReplica(Block block, FSVolume vol, File dir) {
+ FinalizedReplica(Block block, FSVolumeInterface vol, File dir) {
super(block, vol, dir);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaBeingWritten.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaBeingWritten.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaBeingWritten.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaBeingWritten.java Wed Feb 8 21:04:47 2012
@@ -21,7 +21,7 @@ import java.io.File;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
/** This class represents replicas being written.
* Those are the replicas that
@@ -36,7 +36,7 @@ class ReplicaBeingWritten extends Replic
* @param dir directory path where block and meta files are located
*/
ReplicaBeingWritten(long blockId, long genStamp,
- FSVolume vol, File dir) {
+ FSVolumeInterface vol, File dir) {
super( blockId, genStamp, vol, dir);
}
@@ -48,7 +48,7 @@ class ReplicaBeingWritten extends Replic
* @param writer a thread that is writing to this replica
*/
ReplicaBeingWritten(Block block,
- FSVolume vol, File dir, Thread writer) {
+ FSVolumeInterface vol, File dir, Thread writer) {
super( block, vol, dir, writer);
}
@@ -62,7 +62,7 @@ class ReplicaBeingWritten extends Replic
* @param writer a thread that is writing to this replica
*/
ReplicaBeingWritten(long blockId, long len, long genStamp,
- FSVolume vol, File dir, Thread writer ) {
+ FSVolumeInterface vol, File dir, Thread writer ) {
super( blockId, len, genStamp, vol, dir, writer);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInPipeline.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInPipeline.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInPipeline.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInPipeline.java Wed Feb 8 21:04:47 2012
@@ -24,8 +24,8 @@ import java.io.RandomAccessFile;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.BlockWriteStreams;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.DataChecksum;
@@ -53,7 +53,7 @@ class ReplicaInPipeline extends ReplicaI
* @param state replica state
*/
ReplicaInPipeline(long blockId, long genStamp,
- FSVolume vol, File dir) {
+ FSVolumeInterface vol, File dir) {
this( blockId, 0L, genStamp, vol, dir, Thread.currentThread());
}
@@ -65,7 +65,7 @@ class ReplicaInPipeline extends ReplicaI
* @param writer a thread that is writing to this replica
*/
ReplicaInPipeline(Block block,
- FSVolume vol, File dir, Thread writer) {
+ FSVolumeInterface vol, File dir, Thread writer) {
this( block.getBlockId(), block.getNumBytes(), block.getGenerationStamp(),
vol, dir, writer);
}
@@ -80,7 +80,7 @@ class ReplicaInPipeline extends ReplicaI
* @param writer a thread that is writing to this replica
*/
ReplicaInPipeline(long blockId, long len, long genStamp,
- FSVolume vol, File dir, Thread writer ) {
+ FSVolumeInterface vol, File dir, Thread writer ) {
super( blockId, len, genStamp, vol, dir);
this.bytesAcked = len;
this.bytesOnDisk = len;
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaInfo.java Wed Feb 8 21:04:47 2012
@@ -26,7 +26,7 @@ import org.apache.hadoop.classification.
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.HardLink;
import org.apache.hadoop.hdfs.protocol.Block;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.io.IOUtils;
/**
@@ -35,8 +35,10 @@ import org.apache.hadoop.io.IOUtils;
*/
@InterfaceAudience.Private
abstract public class ReplicaInfo extends Block implements Replica {
- private FSVolume volume; // volume where the replica belongs
- private File dir; // directory where block & meta files belong
+ /** volume where the replica belongs */
+ private FSVolumeInterface volume;
+ /** directory where block & meta files belong */
+ private File dir;
/**
* Constructor for a zero length replica
@@ -45,7 +47,7 @@ abstract public class ReplicaInfo extend
* @param vol volume where replica is located
* @param dir directory path where block and meta files are located
*/
- ReplicaInfo(long blockId, long genStamp, FSVolume vol, File dir) {
+ ReplicaInfo(long blockId, long genStamp, FSVolumeInterface vol, File dir) {
this( blockId, 0L, genStamp, vol, dir);
}
@@ -55,7 +57,7 @@ abstract public class ReplicaInfo extend
* @param vol volume where replica is located
* @param dir directory path where block and meta files are located
*/
- ReplicaInfo(Block block, FSVolume vol, File dir) {
+ ReplicaInfo(Block block, FSVolumeInterface vol, File dir) {
this(block.getBlockId(), block.getNumBytes(),
block.getGenerationStamp(), vol, dir);
}
@@ -69,7 +71,7 @@ abstract public class ReplicaInfo extend
* @param dir directory path where block and meta files are located
*/
ReplicaInfo(long blockId, long len, long genStamp,
- FSVolume vol, File dir) {
+ FSVolumeInterface vol, File dir) {
super(blockId, len, genStamp);
this.volume = vol;
this.dir = dir;
@@ -111,14 +113,14 @@ abstract public class ReplicaInfo extend
* Get the volume where this replica is located on disk
* @return the volume where this replica is located on disk
*/
- FSVolume getVolume() {
+ FSVolumeInterface getVolume() {
return volume;
}
/**
* Set the volume where this replica is located on disk
*/
- void setVolume(FSVolume vol) {
+ void setVolume(FSVolumeInterface vol) {
this.volume = vol;
}
@@ -162,7 +164,7 @@ abstract public class ReplicaInfo extend
* be recovered (especially on Windows) on datanode restart.
*/
private void unlinkFile(File file, Block b) throws IOException {
- File tmpFile = DatanodeUtil.createTmpFile(b, FSDataset.getUnlinkTmpFile(file));
+ File tmpFile = DatanodeUtil.createTmpFile(b, DatanodeUtil.getUnlinkTmpFile(file));
try {
FileInputStream in = new FileInputStream(file);
try {
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java Wed Feb 8 21:04:47 2012
@@ -20,7 +20,7 @@ package org.apache.hadoop.hdfs.server.da
import java.io.File;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
/**
@@ -145,7 +145,7 @@ class ReplicaUnderRecovery extends Repli
}
@Override //ReplicaInfo
- void setVolume(FSVolume vol) {
+ void setVolume(FSVolumeInterface vol) {
super.setVolume(vol);
original.setVolume(vol);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaWaitingToBeRecovered.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaWaitingToBeRecovered.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaWaitingToBeRecovered.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/ReplicaWaitingToBeRecovered.java Wed Feb 8 21:04:47 2012
@@ -21,7 +21,7 @@ import java.io.File;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
/**
* This class represents a replica that is waiting to be recovered.
@@ -44,7 +44,7 @@ class ReplicaWaitingToBeRecovered extend
* @param dir directory path where block and meta files are located
*/
ReplicaWaitingToBeRecovered(long blockId, long len, long genStamp,
- FSVolume vol, File dir) {
+ FSVolumeInterface vol, File dir) {
super(blockId, len, genStamp, vol, dir);
}
@@ -54,7 +54,7 @@ class ReplicaWaitingToBeRecovered extend
* @param vol volume where replica is located
* @param dir directory path where block and meta files are located
*/
- ReplicaWaitingToBeRecovered(Block block, FSVolume vol, File dir) {
+ ReplicaWaitingToBeRecovered(Block block, FSVolumeInterface vol, File dir) {
super(block, vol, dir);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/RoundRobinVolumesPolicy.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/RoundRobinVolumesPolicy.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/RoundRobinVolumesPolicy.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/RoundRobinVolumesPolicy.java Wed Feb 8 21:04:47 2012
@@ -20,7 +20,7 @@ package org.apache.hadoop.hdfs.server.da
import java.io.IOException;
import java.util.List;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.util.DiskChecker.DiskOutOfSpaceException;
public class RoundRobinVolumesPolicy implements BlockVolumeChoosingPolicy {
@@ -28,8 +28,8 @@ public class RoundRobinVolumesPolicy imp
private int curVolume = 0;
@Override
- public synchronized FSVolume chooseVolume(List<FSVolume> volumes, long blockSize)
- throws IOException {
+ public synchronized FSVolumeInterface chooseVolume(
+ List<FSVolumeInterface> volumes, long blockSize) throws IOException {
if(volumes.size() < 1) {
throw new DiskOutOfSpaceException("No more available volumes");
}
@@ -44,7 +44,7 @@ public class RoundRobinVolumesPolicy imp
long maxAvailable = 0;
while (true) {
- FSVolume volume = volumes.get(curVolume);
+ FSVolumeInterface volume = volumes.get(curVolume);
curVolume = (curVolume + 1) % volumes.size();
long availableVolumeSize = volume.getAvailable();
if (availableVolumeSize > blockSize) { return volume; }
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/SimulatedFSDataset.java Wed Feb 8 21:04:47 2012
@@ -17,12 +17,14 @@
*/
package org.apache.hadoop.hdfs.server.datanode;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -38,11 +40,10 @@ import org.apache.hadoop.hdfs.protocol.B
import org.apache.hadoop.hdfs.protocol.BlockLocalPathInfo;
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.BlockPoolSlice;
import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolumeSet;
import org.apache.hadoop.hdfs.server.datanode.metrics.FSDatasetMBean;
-import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
+import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
import org.apache.hadoop.metrics2.util.MBeans;
import org.apache.hadoop.util.DataChecksum;
import org.apache.hadoop.util.DiskChecker.DiskErrorException;
@@ -988,8 +989,33 @@ public class SimulatedFSDataset impleme
}
@Override
- public BlockLocalPathInfo getBlockLocalPathInfo(ExtendedBlock b)
- throws IOException {
- throw new IOException("getBlockLocalPathInfo not supported.");
+ public BlockLocalPathInfo getBlockLocalPathInfo(ExtendedBlock b) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String[] getBlockPoolList() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void checkAndUpdate(String bpid, long blockId, File diskFile,
+ File diskMetaFile, FSVolumeInterface vol) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<FSVolumeInterface> getVolumes() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<Block> getFinalizedBlocks(String bpid) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Map<String, Object> getVolumeInfoMap() {
+ throw new UnsupportedOperationException();
}
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMultipleRegistrations.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMultipleRegistrations.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMultipleRegistrations.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMultipleRegistrations.java Wed Feb 8 21:04:47 2012
@@ -23,7 +23,7 @@ import static org.junit.Assert.assertNot
import static org.junit.Assert.assertNotSame;
import java.io.IOException;
-import java.util.Collection;
+import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -31,7 +31,6 @@ import org.apache.hadoop.conf.Configurat
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
-import org.apache.hadoop.hdfs.server.datanode.FSDataset.VolumeInfo;
import org.apache.hadoop.hdfs.server.namenode.FSImageTestUtil;
import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.junit.Assert;
@@ -81,11 +80,11 @@ public class TestDataNodeMultipleRegistr
// check number of volumes in fsdataset
DataNode dn = cluster.getDataNodes().get(0);
- Collection<VolumeInfo> volInfos = ((FSDataset) dn.data).getVolumeInfo();
- assertNotNull("No volumes in the fsdataset", volInfos);
+ final Map<String, Object> volInfos = dn.data.getVolumeInfoMap();
+ Assert.assertTrue("No volumes in the fsdataset", volInfos.size() > 0);
int i = 0;
- for (VolumeInfo vi : volInfos) {
- LOG.info("vol " + i++ + ";dir=" + vi.directory + ";fs= " + vi.freeSpace);
+ for (Map.Entry<String, Object> e : volInfos.entrySet()) {
+ LOG.info("vol " + i++ + ") " + e.getKey() + ": " + e.getValue());
}
// number of volumes should be 2 - [data1, data2]
assertEquals("number of volumes is wrong", 2, volInfos.size());
@@ -143,11 +142,11 @@ public class TestDataNodeMultipleRegistr
// check number of vlumes in fsdataset
DataNode dn = cluster.getDataNodes().get(0);
- Collection<VolumeInfo> volInfos = ((FSDataset) dn.data).getVolumeInfo();
- assertNotNull("No volumes in the fsdataset", volInfos);
+ final Map<String, Object> volInfos = dn.data.getVolumeInfoMap();
+ Assert.assertTrue("No volumes in the fsdataset", volInfos.size() > 0);
int i = 0;
- for (VolumeInfo vi : volInfos) {
- LOG.info("vol " + i++ + ";dir=" + vi.directory + ";fs= " + vi.freeSpace);
+ for (Map.Entry<String, Object> e : volInfos.entrySet()) {
+ LOG.info("vol " + i++ + ") " + e.getKey() + ": " + e.getValue());
}
// number of volumes should be 2 - [data1, data2]
assertEquals("number of volumes is wrong", 2, volInfos.size());
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeVolumeFailure.java Wed Feb 8 21:04:47 2012
@@ -17,6 +17,9 @@
*/
package org.apache.hadoop.hdfs.server.datanode;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
@@ -29,8 +32,8 @@ import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hdfs.BlockReader;
import org.apache.hadoop.hdfs.BlockReaderFactory;
+import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.DFSTestUtil;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster;
@@ -42,13 +45,10 @@ import org.apache.hadoop.hdfs.server.com
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols;
-import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.net.NetUtils;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import static org.junit.Assert.*;
/**
* Fine-grain testing of block files and locations after volume failure.
@@ -272,8 +272,7 @@ public class TestDataNodeVolumeFailure {
String file = BlockReaderFactory.getFileName(targetAddr,
"test-blockpoolid",
block.getBlockId());
- BlockReader blockReader =
- BlockReaderFactory.newBlockReader(conf, s, file, block, lblock
+ BlockReaderFactory.newBlockReader(conf, s, file, block, lblock
.getBlockToken(), 0, -1);
// nothing - if it fails - it will throw and exception
@@ -370,7 +369,7 @@ public class TestDataNodeVolumeFailure {
new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith("blk_") &&
- name.endsWith(FSDataset.METADATA_EXTENSION);
+ name.endsWith(DatanodeUtil.METADATA_EXTENSION);
}
}
);
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRestart.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRestart.java?rev=1242093&r1=1242092&r2=1242093&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRestart.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDatanodeRestart.java Wed Feb 8 21:04:47 2012
@@ -30,17 +30,17 @@ import org.apache.hadoop.conf.Configurat
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.DFSTestUtil;
+import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdfs.MiniDFSCluster;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface.FSVolumeInterface;
import org.apache.hadoop.io.IOUtils;
-import org.apache.hadoop.hdfs.HdfsConfiguration;
-import org.apache.hadoop.hdfs.DFSConfigKeys;
-
-import org.junit.Test;
import org.junit.Assert;
+import org.junit.Test;
/** Test if a datanode can correctly upgrade itself */
public class TestDatanodeRestart {
@@ -98,8 +98,9 @@ public class TestDatanodeRestart {
out.write(writeBuf);
out.hflush();
DataNode dn = cluster.getDataNodes().get(0);
- for (FSVolume volume : ((FSDataset)dn.data).volumes.getVolumes()) {
- File currentDir = volume.getDir().getParentFile();
+ for (FSVolumeInterface v : dn.data.getVolumes()) {
+ FSVolume volume = (FSVolume)v;
+ File currentDir = volume.getCurrentDir().getParentFile().getParentFile();
File rbwDir = new File(currentDir, "rbw");
for (File file : rbwDir.listFiles()) {
if (isCorrupt && Block.isBlockFilename(file)) {
@@ -188,7 +189,7 @@ public class TestDatanodeRestart {
} else {
src = replicaInfo.getMetaFile();
}
- File dst = FSDataset.getUnlinkTmpFile(src);
+ File dst = DatanodeUtil.getUnlinkTmpFile(src);
if (isRename) {
src.renameTo(dst);
} else {