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 sh...@apache.org on 2009/09/29 03:17:04 UTC
svn commit: r819791 - in /hadoop/hdfs/branches/HDFS-265: ./
src/java/org/apache/hadoop/hdfs/server/datanode/
src/java/org/apache/hadoop/hdfs/server/namenode/
src/java/org/apache/hadoop/hdfs/server/protocol/
src/test/hdfs/org/apache/hadoop/hdfs/ src/tes...
Author: shv
Date: Tue Sep 29 01:17:03 2009
New Revision: 819791
URL: http://svn.apache.org/viewvc?rev=819791&view=rev
Log:
HDFS-658. Block recovery for primary data-node. Contributed by Konstantin Shvachko.
Added:
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java (with props)
Modified:
hadoop/hdfs/branches/HDFS-265/CHANGES.txt
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/ReplicaUnderRecovery.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/BlockManager.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/InterDatanodeProtocol.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileAppend3.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileCreation.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestLeaseRecovery.java
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/datanode/TestInterDatanodeProtocol.java
hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestBlockUnderConstruction.java
Modified: hadoop/hdfs/branches/HDFS-265/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/CHANGES.txt?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/CHANGES.txt (original)
+++ hadoop/hdfs/branches/HDFS-265/CHANGES.txt Tue Sep 29 01:17:03 2009
@@ -17,6 +17,8 @@
HDFS-657. Remove unused legacy data-node protocol methods. (shv)
+ HDFS-658. Block recovery for primary data-node. (shv)
+
NEW FEATURES
HDFS-536. Support hflush at DFSClient. (hairong)
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=819791&r1=819790&r2=819791&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 Tue Sep 29 01:17:03 2009
@@ -54,11 +54,13 @@
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.protocol.RecoveryInProgressException;
import org.apache.hadoop.hdfs.protocol.UnregisteredNodeException;
import org.apache.hadoop.hdfs.protocol.DataTransferProtocol.BlockConstructionStage;
import org.apache.hadoop.hdfs.server.common.HdfsConstants;
import org.apache.hadoop.hdfs.server.common.IncorrectVersionException;
import org.apache.hadoop.hdfs.server.common.Storage;
+import org.apache.hadoop.hdfs.server.common.HdfsConstants.ReplicaState;
import org.apache.hadoop.hdfs.server.common.HdfsConstants.StartupOption;
import org.apache.hadoop.hdfs.server.datanode.metrics.DataNodeMetrics;
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
@@ -75,6 +77,7 @@
import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
import org.apache.hadoop.hdfs.server.protocol.KeyUpdateCommand;
import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
+import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
import org.apache.hadoop.hdfs.server.protocol.UpgradeCommand;
import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
import org.apache.hadoop.http.HttpServer;
@@ -1547,6 +1550,38 @@
}
}
+ @Override // InterDatanodeProtocol
+ public ReplicaRecoveryInfo initReplicaRecovery(RecoveringBlock rBlock)
+ throws IOException {
+ return data.initReplicaRecovery(rBlock);
+ }
+
+ /**
+ * Convenience method, which unwraps RemoteException.
+ * @throws IOException not a RemoteException.
+ */
+ private static ReplicaRecoveryInfo callInitReplicaRecovery(
+ InterDatanodeProtocol datanode,
+ RecoveringBlock rBlock) throws IOException {
+ try {
+ return datanode.initReplicaRecovery(rBlock);
+ } catch(RemoteException re) {
+ throw re.unwrapRemoteException();
+ }
+ }
+
+ /**
+ * Update replica with the new generation stamp and length.
+ */
+ @Override // InterDatanodeProtocol
+ public Block updateReplicaUnderRecovery(Block oldBlock,
+ long recoveryId,
+ long newLength) throws IOException {
+ ReplicaInfo r =
+ data.updateReplicaUnderRecovery(oldBlock, recoveryId, newLength);
+ return new Block(r);
+ }
+
/** {@inheritDoc} */
public long getProtocolVersion(String protocol, long clientVersion
) throws IOException {
@@ -1559,31 +1594,32 @@
+ ": " + protocol);
}
- /** A convenient class used in lease recovery */
+ /** A convenient class used in block recovery */
private static class BlockRecord {
final DatanodeID id;
final InterDatanodeProtocol datanode;
- final Block block;
+ final ReplicaRecoveryInfo rInfo;
- BlockRecord(DatanodeID id, InterDatanodeProtocol datanode, Block block) {
+ BlockRecord(DatanodeID id,
+ InterDatanodeProtocol datanode,
+ ReplicaRecoveryInfo rInfo) {
this.id = id;
this.datanode = datanode;
- this.block = block;
+ this.rInfo = rInfo;
}
/** {@inheritDoc} */
public String toString() {
- return "block:" + block + " node:" + id;
+ return "block:" + rInfo + " node:" + id;
}
}
/** Recover a block */
- private LocatedBlock recoverBlock(RecoveringBlock rBlock) throws IOException {
+ private void recoverBlock(RecoveringBlock rBlock) throws IOException {
Block block = rBlock.getBlock();
DatanodeInfo[] targets = rBlock.getLocations();
DatanodeID[] datanodeids = (DatanodeID[])targets;
- List<BlockRecord> syncList = new ArrayList<BlockRecord>();
- long minlength = Long.MAX_VALUE;
+ List<BlockRecord> syncList = new ArrayList<BlockRecord>(datanodeids.length);
int errorCount = 0;
//check generation stamps
@@ -1591,95 +1627,136 @@
try {
InterDatanodeProtocol datanode = dnRegistration.equals(id)?
this: DataNode.createInterDataNodeProtocolProxy(id, getConf());
- BlockMetaDataInfo info = datanode.getBlockMetaDataInfo(block);
- if (info != null && info.getGenerationStamp() >= block.getGenerationStamp()) {
- syncList.add(new BlockRecord(id, datanode, new Block(info)));
- if (info.getNumBytes() < minlength) {
- minlength = info.getNumBytes();
- }
+ ReplicaRecoveryInfo info = callInitReplicaRecovery(datanode, rBlock);
+ if (info != null &&
+ info.getGenerationStamp() >= block.getGenerationStamp() &&
+ info.getNumBytes() > 0) {
+ syncList.add(new BlockRecord(id, datanode, info));
}
+ } catch (RecoveryInProgressException ripE) {
+ InterDatanodeProtocol.LOG.warn(
+ "Recovery for replica " + block + " on data-node " + id
+ + " is already in progress. Recovery id = "
+ + rBlock.getNewGenerationStamp() + " is aborted.", ripE);
+ return;
} catch (IOException e) {
++errorCount;
InterDatanodeProtocol.LOG.warn(
- "Failed to getBlockMetaDataInfo for block (=" + block
+ "Failed to obtain replica info for block (=" + block
+ ") from datanode (=" + id + ")", e);
}
}
- if (syncList.isEmpty() && errorCount > 0) {
+ if (errorCount == datanodeids.length) {
throw new IOException("All datanodes failed: block=" + block
+ ", datanodeids=" + Arrays.asList(datanodeids));
}
- block.setNumBytes(minlength);
- return syncBlock(rBlock, syncList);
+
+ syncBlock(rBlock, syncList);
}
/** Block synchronization */
- private LocatedBlock syncBlock(RecoveringBlock rBlock,
- List<BlockRecord> syncList) throws IOException {
+ private void syncBlock(RecoveringBlock rBlock,
+ List<BlockRecord> syncList) throws IOException {
Block block = rBlock.getBlock();
- long newGenerationStamp = rBlock.getNewGenerationStamp();
+ long recoveryId = rBlock.getNewGenerationStamp();
if (LOG.isDebugEnabled()) {
LOG.debug("block=" + block + ", (length=" + block.getNumBytes()
+ "), syncList=" + syncList);
}
- //syncList.isEmpty() that all datanodes do not have the block
- //so the block can be deleted.
+ // syncList.isEmpty() means that all data-nodes do not have the block
+ // or their replicas have 0 length.
+ // The block can be deleted.
if (syncList.isEmpty()) {
- namenode.commitBlockSynchronization(block, newGenerationStamp, 0,
+ namenode.commitBlockSynchronization(block, recoveryId, 0,
true, true, DatanodeID.EMPTY_ARRAY);
- //always return a new access token even if everything else stays the same
- LocatedBlock b = new LocatedBlock(block, rBlock.getLocations());
- if (isAccessTokenEnabled) {
- b.setAccessToken(accessTokenHandler.generateToken(null, b.getBlock()
- .getBlockId(), EnumSet.of(AccessTokenHandler.AccessMode.WRITE)));
- }
- return b;
+ return;
}
- List<DatanodeID> successList = new ArrayList<DatanodeID>();
+ // Calculate the best available replica state.
+ ReplicaState bestState = ReplicaState.RWR;
+ long finalizedLength = -1;
+ for(BlockRecord r : syncList) {
+ assert r.rInfo.getNumBytes() > 0 : "zero length replica";
+ ReplicaState rState = r.rInfo.getOriginalReplicaState();
+ if(rState.getValue() < bestState.getValue())
+ bestState = rState;
+ if(rState == ReplicaState.FINALIZED) {
+ if(finalizedLength > 0 && finalizedLength != r.rInfo.getNumBytes())
+ throw new IOException("Inconsistent size of finalized replicas. " +
+ "Replica " + r.rInfo + " expected size: " + finalizedLength);
+ finalizedLength = r.rInfo.getNumBytes();
+ }
+ }
- Block newblock =
- new Block(block.getBlockId(), block.getNumBytes(), newGenerationStamp);
+ // Calculate list of nodes that will participate in the recovery
+ // and the new block size
+ List<BlockRecord> participatingList = new ArrayList<BlockRecord>();
+ Block newBlock = new Block(block.getBlockId(), -1, recoveryId);
+ switch(bestState) {
+ case FINALIZED:
+ assert finalizedLength > 0 : "finalizedLength is not positive";
+ for(BlockRecord r : syncList) {
+ ReplicaState rState = r.rInfo.getOriginalReplicaState();
+ if(rState == ReplicaState.FINALIZED ||
+ rState == ReplicaState.RBW &&
+ r.rInfo.getNumBytes() == finalizedLength)
+ participatingList.add(r);
+ }
+ newBlock.setNumBytes(finalizedLength);
+ break;
+ case RBW:
+ case RWR:
+ long minLength = Long.MAX_VALUE;
+ for(BlockRecord r : syncList) {
+ ReplicaState rState = r.rInfo.getOriginalReplicaState();
+ if(rState == bestState) {
+ minLength = Math.min(minLength, r.rInfo.getNumBytes());
+ participatingList.add(r);
+ }
+ }
+ newBlock.setNumBytes(minLength);
+ break;
+ case RUR:
+ case TEMPORARY:
+ assert false : "bad replica state: " + bestState;
+ }
- for(BlockRecord r : syncList) {
+ List<DatanodeID> failedList = new ArrayList<DatanodeID>();
+ List<DatanodeID> successList = new ArrayList<DatanodeID>();
+ for(BlockRecord r : participatingList) {
try {
- r.datanode.updateBlock(r.block, newblock, true);
+ Block reply = r.datanode.updateReplicaUnderRecovery(
+ r.rInfo, recoveryId, newBlock.getNumBytes());
+ assert reply.equals(newBlock) &&
+ reply.getNumBytes() == newBlock.getNumBytes() :
+ "Updated replica must be the same as the new block.";
successList.add(r.id);
} catch (IOException e) {
InterDatanodeProtocol.LOG.warn("Failed to updateBlock (newblock="
- + newblock + ", datanode=" + r.id + ")", e);
+ + newBlock + ", datanode=" + r.id + ")", e);
+ failedList.add(r.id);
}
}
- if (!successList.isEmpty()) {
- DatanodeID[] nlist = successList.toArray(new DatanodeID[successList.size()]);
-
- namenode.commitBlockSynchronization(block,
- newblock.getGenerationStamp(), newblock.getNumBytes(), true, false,
- nlist);
- DatanodeInfo[] info = new DatanodeInfo[nlist.length];
- for (int i = 0; i < nlist.length; i++) {
- info[i] = new DatanodeInfo(nlist[i]);
+ // If any of the data-nodes failed, the recovery fails, because
+ // we never know the actual state of the replica on failed data-nodes.
+ // The recovery should be started over.
+ if(!failedList.isEmpty()) {
+ StringBuilder b = new StringBuilder();
+ for(DatanodeID id : failedList) {
+ b.append("\n " + id);
}
- LocatedBlock b = new LocatedBlock(newblock, info); // success
- // should have used client ID to generate access token, but since
- // owner ID is not checked, we simply pass null for now.
- if (isAccessTokenEnabled) {
- b.setAccessToken(accessTokenHandler.generateToken(null, b.getBlock()
- .getBlockId(), EnumSet.of(AccessTokenHandler.AccessMode.WRITE)));
- }
- return b;
+ throw new IOException("Cannot recover " + block + ", the following "
+ + failedList.size() + " data-nodes failed {" + b + "\n}");
}
- //failed
- StringBuilder b = new StringBuilder();
- for(BlockRecord r : syncList) {
- b.append("\n " + r.id);
- }
- throw new IOException("Cannot recover " + block + ", none of these "
- + syncList.size() + " datanodes success {" + b + "\n}");
+ // Notify the name-node about successfully recovered replicas.
+ DatanodeID[] nlist = successList.toArray(new DatanodeID[successList.size()]);
+ namenode.commitBlockSynchronization(block,
+ newBlock.getGenerationStamp(), newBlock.getNumBytes(), true, false,
+ nlist);
}
private static void logRecoverBlock(String who,
@@ -1696,15 +1773,6 @@
/** {@inheritDoc} */
@Override // ClientDataNodeProtocol
public long getReplicaVisibleLength(final Block block) throws IOException {
- final Replica replica = data.getReplica(block.getBlockId());
- if (replica == null) {
- throw new ReplicaNotFoundException(block);
- }
- if (replica.getGenerationStamp() < block.getGenerationStamp()) {
- throw new IOException(
- "replica.getGenerationStamp() < block.getGenerationStamp(), block="
- + block + ", replica=" + replica);
- }
- return replica.getVisibleLength();
+ return data.getReplicaVisibleLength(block);
}
}
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=819791&r1=819790&r2=819791&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 Tue Sep 29 01:17:03 2009
@@ -49,6 +49,8 @@
import org.apache.hadoop.hdfs.protocol.RecoveryInProgressException;
import org.apache.hadoop.hdfs.server.datanode.metrics.FSDatasetMBean;
import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
+import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
+import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
import org.apache.hadoop.metrics.util.MBeanUtil;
import org.apache.hadoop.util.DataChecksum;
import org.apache.hadoop.util.DiskChecker;
@@ -1959,14 +1961,15 @@
return volumeMap.get(blockId);
}
- /** Initialize a replica recovery. */
- synchronized ReplicaUnderRecovery.Info initReplicaRecovery(
- Block block, long recoveryId) throws IOException {
- return initReplicaRecovery(volumeMap, block, recoveryId);
+ @Override // FSDatasetInterface
+ public synchronized ReplicaRecoveryInfo initReplicaRecovery(
+ RecoveringBlock rBlock) throws IOException {
+ return initReplicaRecovery(
+ volumeMap, rBlock.getBlock(), rBlock.getNewGenerationStamp());
}
/** static version of {@link #initReplicaRecovery(Block, long)}. */
- static ReplicaUnderRecovery.Info initReplicaRecovery(
+ static ReplicaRecoveryInfo initReplicaRecovery(
ReplicasMap map, Block block, long recoveryId) throws IOException {
final ReplicaInfo replica = map.get(block.getBlockId());
DataNode.LOG.info("initReplicaRecovery: block=" + block
@@ -1975,7 +1978,7 @@
//check replica
if (replica == null) {
- throw new ReplicaNotFoundException(block);
+ return null;
}
//stop writer if there is any
@@ -2046,17 +2049,22 @@
checkReplicaFiles(replica);
//update replica
- final FinalizedReplica finalized = updateReplicaUnderRecovery(
- (ReplicaUnderRecovery)replica, recoveryId, newlength);
+ final ReplicaInfo finalized = (ReplicaInfo)updateReplicaUnderRecovery(
+ replica, recoveryId, newlength);
//check replica files after update
checkReplicaFiles(finalized);
}
- /** Update a ReplicaUnderRecovery to a FinalizedReplica. */
- FinalizedReplica updateReplicaUnderRecovery(
- final ReplicaUnderRecovery rur, final long recoveryId,
- final long newlength) throws IOException {
+ @Override // FSDatasetInterface
+ public synchronized FinalizedReplica updateReplicaUnderRecovery(
+ Block oldBlock,
+ long recoveryId,
+ long newlength) throws IOException {
+ Replica r = getReplica(oldBlock.getBlockId());
+ if(r.getState() != ReplicaState.RUR)
+ throw new IOException("Replica " + r + " must be under recovery.");
+ ReplicaUnderRecovery rur = (ReplicaUnderRecovery)r;
DataNode.LOG.info("updateReplicaUnderRecovery: recoveryId=" + recoveryId
+ ", newlength=" + newlength
+ ", rur=" + rur);
@@ -2086,4 +2094,19 @@
// finalize the block
return finalizeReplica(rur);
}
+
+ @Override // FSDatasetInterface
+ public synchronized long getReplicaVisibleLength(final Block block)
+ throws IOException {
+ final Replica replica = getReplica(block.getBlockId());
+ if (replica == null) {
+ throw new ReplicaNotFoundException(block);
+ }
+ if (replica.getGenerationStamp() < block.getGenerationStamp()) {
+ throw new IOException(
+ "replica.getGenerationStamp() < block.getGenerationStamp(), block="
+ + block + ", replica=" + replica);
+ }
+ return replica.getVisibleLength();
+ }
}
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=819791&r1=819790&r2=819791&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 Tue Sep 29 01:17:03 2009
@@ -28,6 +28,8 @@
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.protocol.Block;
import org.apache.hadoop.hdfs.protocol.BlockListAsLongs;
import org.apache.hadoop.io.IOUtils;
@@ -331,4 +333,25 @@
* @return true if more then minimum valid volumes left in the FSDataSet
*/
public boolean hasEnoughResource();
+
+ /**
+ * Get visible length of the specified replica.
+ */
+ long getReplicaVisibleLength(final Block block) throws IOException;
+
+ /**
+ * Initialize a replica recovery.
+ *
+ * @return actual state of the replica on this data-node or
+ * null if data-node does not have the replica.
+ */
+ public ReplicaRecoveryInfo initReplicaRecovery(RecoveringBlock rBlock)
+ throws IOException;
+
+ /**
+ * Update replica's generation stamp and length and finalize it.
+ */
+ public FinalizedReplica updateReplicaUnderRecovery(Block oldBlock,
+ long recoveryId,
+ long newLength) throws IOException;
}
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/datanode/ReplicaUnderRecovery.java Tue Sep 29 01:17:03 2009
@@ -17,14 +17,11 @@
*/
package org.apache.hadoop.hdfs.server.datanode;
-import java.io.DataInput;
-import java.io.DataOutput;
import java.io.File;
-import java.io.IOException;
-import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.server.common.HdfsConstants.ReplicaState;
import org.apache.hadoop.hdfs.server.datanode.FSDataset.FSVolume;
+import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
/**
* This class represents replicas that are under block recovery
@@ -160,43 +157,7 @@
+ "\n original=" + original;
}
- Info createInfo() {
- return new Info(this);
- }
-
- /** Replica recovery information. */
- static class Info extends Block{
- private ReplicaState originalState;
-
- private Info(ReplicaUnderRecovery rur) {
- super(rur);
- originalState = rur.getOrignalReplicaState();
- }
-
- ReplicaState getOriginalReplicaState() {
- return originalState;
- }
-
- @Override
- public void readFields(DataInput in) throws IOException {
- super.readFields(in);
- originalState = ReplicaState.read(in);
- }
-
- @Override
- public void write(DataOutput out) throws IOException {
- super.write(out);
- originalState.write(out);
- }
-
- @Override
- public boolean equals(Object o) {
- return super.equals(o);
- }
-
- @Override
- public int hashCode() {
- return super.hashCode();
- }
+ ReplicaRecoveryInfo createInfo() {
+ return new ReplicaRecoveryInfo(this, getOrignalReplicaState());
}
}
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/BlockManager.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/BlockManager.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/BlockManager.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/BlockManager.java Tue Sep 29 01:17:03 2009
@@ -366,7 +366,7 @@
final int numCorruptReplicas = corruptReplicas.numCorruptReplicas(blk);
if (numCorruptNodes != numCorruptReplicas) {
FSNamesystem.LOG.warn("Inconsistent number of corrupt replicas for "
- + blk + "blockMap has " + numCorruptNodes
+ + blk + " blockMap has " + numCorruptNodes
+ " but corrupt replicas map has " + numCorruptReplicas);
}
@@ -530,6 +530,10 @@
addToInvalidates(storedBlock, node);
return;
}
+
+ // Add replica to the data-node if it is not already there
+ node.addBlock(storedBlock);
+
// Add this replica to corruptReplicas Map
corruptReplicas.addToCorruptReplicasMap(storedBlock, node);
if (countNodes(storedBlock).liveReplicas() > inode.getReplication()) {
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Tue Sep 29 01:17:03 2009
@@ -3878,7 +3878,7 @@
if (storedBlock == null ||
storedBlock.getBlockUCState() != BlockUCState.UNDER_CONSTRUCTION) {
throw new IOException(block +
- " does not exist or is not under Construction");
+ " does not exist or is not under Construction" + storedBlock);
}
// check file inode
Modified: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/InterDatanodeProtocol.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/InterDatanodeProtocol.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/InterDatanodeProtocol.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/InterDatanodeProtocol.java Tue Sep 29 01:17:03 2009
@@ -23,6 +23,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hdfs.protocol.Block;
+import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
import org.apache.hadoop.ipc.VersionedProtocol;
/** An inter-datanode protocol for updating generation stamp
@@ -31,17 +32,36 @@
public static final Log LOG = LogFactory.getLog(InterDatanodeProtocol.class);
/**
- * 3: added a finalize parameter to updateBlock
+ * 4: initReplicaRecovery(), updateReplicaUnderRecovery() added.
*/
- public static final long versionID = 3L;
+ public static final long versionID = 4L;
/** @return the BlockMetaDataInfo of a block;
* null if the block is not found
*/
+ @Deprecated
BlockMetaDataInfo getBlockMetaDataInfo(Block block) throws IOException;
/**
* Update the block to the new generation stamp and length.
*/
- void updateBlock(Block oldblock, Block newblock, boolean finalize) throws IOException;
+ @Deprecated
+ void updateBlock(Block oldblock, Block newblock, boolean finalize)
+ throws IOException;
+
+ /**
+ * Initialize a replica recovery.
+ *
+ * @return actual state of the replica on this data-node or
+ * null if data-node does not have the replica.
+ */
+ ReplicaRecoveryInfo initReplicaRecovery(RecoveringBlock rBlock)
+ throws IOException;
+
+ /**
+ * Update replica with the new generation stamp and length.
+ */
+ Block updateReplicaUnderRecovery(Block oldBlock,
+ long recoveryId,
+ long newLength) throws IOException;
}
Added: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java?rev=819791&view=auto
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java (added)
+++ hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java Tue Sep 29 01:17:03 2009
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdfs.server.protocol;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.hadoop.hdfs.protocol.Block;
+import org.apache.hadoop.hdfs.server.common.HdfsConstants.ReplicaState;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableFactories;
+import org.apache.hadoop.io.WritableFactory;
+
+/**
+ * Replica recovery information.
+ */
+public class ReplicaRecoveryInfo extends Block {
+ private ReplicaState originalState;
+
+ public ReplicaRecoveryInfo() {
+ }
+
+ public ReplicaRecoveryInfo(Block r, ReplicaState rState) {
+ super(r);
+ originalState = rState;
+ }
+
+ public ReplicaState getOriginalReplicaState() {
+ return originalState;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return super.equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ ///////////////////////////////////////////
+ // Writable
+ ///////////////////////////////////////////
+ static { // register a ctor
+ WritableFactories.setFactory
+ (ReplicaRecoveryInfo.class,
+ new WritableFactory() {
+ public Writable newInstance() { return new ReplicaRecoveryInfo(); }
+ });
+ }
+
+ @Override
+ public void readFields(DataInput in) throws IOException {
+ super.readFields(in);
+ originalState = ReplicaState.read(in);
+ }
+
+ @Override
+ public void write(DataOutput out) throws IOException {
+ super.write(out);
+ originalState.write(out);
+ }
+}
Propchange: hadoop/hdfs/branches/HDFS-265/src/java/org/apache/hadoop/hdfs/server/protocol/ReplicaRecoveryInfo.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileAppend3.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileAppend3.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileAppend3.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileAppend3.java Tue Sep 29 01:17:03 2009
@@ -33,7 +33,6 @@
import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
import org.apache.hadoop.hdfs.server.datanode.DataNode;
import org.apache.hadoop.hdfs.server.datanode.FSDataset;
-import org.apache.hadoop.hdfs.server.protocol.BlockMetaDataInfo;
/** This class implements some of tests posted in HADOOP-2658. */
public class TestFileAppend3 extends junit.framework.TestCase {
@@ -251,7 +250,7 @@
}
for(DatanodeInfo datanodeinfo : lb.getLocations()) {
final DataNode dn = cluster.getDataNode(datanodeinfo.getIpcPort());
- final BlockMetaDataInfo metainfo = dn.getBlockMetaDataInfo(blk);
+ final Block metainfo = dn.data.getStoredBlock(blk.getBlockId());
assertEquals(size, metainfo.getNumBytes());
}
}
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileCreation.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileCreation.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileCreation.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestFileCreation.java Tue Sep 29 01:17:03 2009
@@ -48,7 +48,6 @@
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
import org.apache.hadoop.hdfs.server.namenode.LeaseManager;
import org.apache.hadoop.io.IOUtils;
-import org.apache.hadoop.hdfs.protocol.FSConstants;
import org.apache.log4j.Level;
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestLeaseRecovery.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestLeaseRecovery.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestLeaseRecovery.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/TestLeaseRecovery.java Tue Sep 29 01:17:03 2009
@@ -26,17 +26,15 @@
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
import org.apache.hadoop.hdfs.server.datanode.DataNode;
import org.apache.hadoop.hdfs.server.datanode.TestInterDatanodeProtocol;
-import org.apache.hadoop.hdfs.server.protocol.BlockMetaDataInfo;
-import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
public class TestLeaseRecovery extends junit.framework.TestCase {
static final int BLOCK_SIZE = 1024;
static final short REPLICATION_NUM = (short)3;
private static final long LEASE_PERIOD = 300L;
- static void checkMetaInfo(Block b, InterDatanodeProtocol idp
+ static void checkMetaInfo(Block b, DataNode dn
) throws IOException {
- TestInterDatanodeProtocol.checkMetaInfo(b, idp, null);
+ TestInterDatanodeProtocol.checkMetaInfo(b, dn);
}
static int min(Integer... x) {
@@ -89,10 +87,8 @@
assertEquals(REPLICATION_NUM, datanodeinfos.length);
//connect to data nodes
- InterDatanodeProtocol[] idps = new InterDatanodeProtocol[REPLICATION_NUM];
DataNode[] datanodes = new DataNode[REPLICATION_NUM];
for(int i = 0; i < REPLICATION_NUM; i++) {
- idps[i] = DataNode.createInterDataNodeProtocolProxy(datanodeinfos[i], conf);
datanodes[i] = cluster.getDataNode(datanodeinfos[i].getIpcPort());
assertTrue(datanodes[i] != null);
}
@@ -101,7 +97,7 @@
Block lastblock = locatedblock.getBlock();
DataNode.LOG.info("newblocks=" + lastblock);
for(int i = 0; i < REPLICATION_NUM; i++) {
- checkMetaInfo(lastblock, idps[i]);
+ checkMetaInfo(lastblock, datanodes[i]);
}
@@ -111,13 +107,14 @@
// expire lease to trigger block recovery.
waitLeaseRecovery(cluster);
- BlockMetaDataInfo[] updatedmetainfo = new BlockMetaDataInfo[REPLICATION_NUM];
+ Block[] updatedmetainfo = new Block[REPLICATION_NUM];
long oldSize = lastblock.getNumBytes();
lastblock = TestInterDatanodeProtocol.getLastLocatedBlock(
dfs.dfs.getNamenode(), filestr).getBlock();
long currentGS = lastblock.getGenerationStamp();
for(int i = 0; i < REPLICATION_NUM; i++) {
- updatedmetainfo[i] = idps[i].getBlockMetaDataInfo(lastblock);
+ updatedmetainfo[i] =
+ datanodes[i].data.getStoredBlock(lastblock.getBlockId());
assertEquals(lastblock.getBlockId(), updatedmetainfo[i].getBlockId());
assertEquals(oldSize, updatedmetainfo[i].getNumBytes());
assertEquals(currentGS, updatedmetainfo[i].getGenerationStamp());
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=819791&r1=819790&r2=819791&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 Tue Sep 29 01:17:03 2009
@@ -36,6 +36,8 @@
import org.apache.hadoop.hdfs.protocol.FSConstants;
import org.apache.hadoop.hdfs.server.common.HdfsConstants.ReplicaState;
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.metrics.util.MBeanUtil;
import org.apache.hadoop.util.DataChecksum;
import org.apache.hadoop.util.DiskChecker.DiskErrorException;
@@ -793,4 +795,23 @@
public boolean hasEnoughResource() {
return true;
}
+
+ @Override
+ public ReplicaRecoveryInfo initReplicaRecovery(RecoveringBlock rBlock)
+ throws IOException {
+ return new ReplicaRecoveryInfo(rBlock.getBlock(), ReplicaState.FINALIZED);
+ }
+
+ @Override
+ public FinalizedReplica updateReplicaUnderRecovery(Block oldBlock,
+ long recoveryId,
+ long newlength) throws IOException {
+ return new FinalizedReplica(
+ oldBlock.getBlockId(), newlength, recoveryId, null, null);
+ }
+
+ @Override
+ public long getReplicaVisibleLength(Block block) throws IOException {
+ return block.getNumBytes();
+ }
}
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestInterDatanodeProtocol.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestInterDatanodeProtocol.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestInterDatanodeProtocol.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/datanode/TestInterDatanodeProtocol.java Tue Sep 29 01:17:03 2009
@@ -31,9 +31,9 @@
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
import org.apache.hadoop.hdfs.protocol.RecoveryInProgressException;
-import org.apache.hadoop.hdfs.server.datanode.ReplicaUnderRecovery.Info;
-import org.apache.hadoop.hdfs.server.protocol.BlockMetaDataInfo;
import org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol;
+import org.apache.hadoop.hdfs.server.protocol.ReplicaRecoveryInfo;
+import org.apache.hadoop.hdfs.server.protocol.BlockRecoveryCommand.RecoveringBlock;
import org.junit.Assert;
import org.junit.Test;
@@ -41,15 +41,10 @@
* This tests InterDataNodeProtocol for block handling.
*/
public class TestInterDatanodeProtocol extends junit.framework.TestCase {
- public static void checkMetaInfo(Block b, InterDatanodeProtocol idp,
- DataBlockScanner scanner) throws IOException {
- BlockMetaDataInfo metainfo = idp.getBlockMetaDataInfo(b);
+ public static void checkMetaInfo(Block b, DataNode dn) throws IOException {
+ Block metainfo = dn.data.getStoredBlock(b.getBlockId());
assertEquals(b.getBlockId(), metainfo.getBlockId());
assertEquals(b.getNumBytes(), metainfo.getNumBytes());
- if (scanner != null) {
- assertEquals(scanner.getLastScanTime(b),
- metainfo.getLastScanTime());
- }
}
public static LocatedBlock getLastLocatedBlock(
@@ -101,13 +96,16 @@
//verify BlockMetaDataInfo
Block b = locatedblock.getBlock();
InterDatanodeProtocol.LOG.info("b=" + b + ", " + b.getClass());
- checkMetaInfo(b, idp, datanode.blockScanner);
+ checkMetaInfo(b, datanode);
+ long recoveryId = b.getGenerationStamp() + 1;
+ idp.initReplicaRecovery(
+ new RecoveringBlock(b, locatedblock.getLocations(), recoveryId));
//verify updateBlock
Block newblock = new Block(
b.getBlockId(), b.getNumBytes()/2, b.getGenerationStamp()+1);
- idp.updateBlock(b, newblock, false);
- checkMetaInfo(newblock, idp, datanode.blockScanner);
+ idp.updateReplicaUnderRecovery(b, recoveryId, newblock.getNumBytes());
+ checkMetaInfo(newblock, datanode);
}
finally {
if (cluster != null) {cluster.shutdown();}
@@ -119,7 +117,7 @@
null, null);
}
- private static void assertEquals(ReplicaInfo originalInfo, Info recoveryInfo) {
+ private static void assertEquals(ReplicaInfo originalInfo, ReplicaRecoveryInfo recoveryInfo) {
Assert.assertEquals(originalInfo.getBlockId(), recoveryInfo.getBlockId());
Assert.assertEquals(originalInfo.getGenerationStamp(), recoveryInfo.getGenerationStamp());
Assert.assertEquals(originalInfo.getBytesOnDisk(), recoveryInfo.getNumBytes());
@@ -145,7 +143,7 @@
final ReplicaInfo originalInfo = map.get(b);
final long recoveryid = gs + 1;
- final Info recoveryInfo = FSDataset.initReplicaRecovery(map, blocks[0], recoveryid);
+ final ReplicaRecoveryInfo recoveryInfo = FSDataset.initReplicaRecovery(map, blocks[0], recoveryid);
assertEquals(originalInfo, recoveryInfo);
final ReplicaUnderRecovery updatedInfo = (ReplicaUnderRecovery)map.get(b);
@@ -154,7 +152,7 @@
//recover one more time
final long recoveryid2 = gs + 2;
- final Info recoveryInfo2 = FSDataset.initReplicaRecovery(map, blocks[0], recoveryid2);
+ final ReplicaRecoveryInfo recoveryInfo2 = FSDataset.initReplicaRecovery(map, blocks[0], recoveryid2);
assertEquals(originalInfo, recoveryInfo2);
final ReplicaUnderRecovery updatedInfo2 = (ReplicaUnderRecovery)map.get(b);
@@ -174,13 +172,8 @@
{ //replica not found
final long recoveryid = gs + 1;
final Block b = new Block(firstblockid - 1, length, gs);
- try {
- FSDataset.initReplicaRecovery(map, b, recoveryid);
- Assert.fail();
- }
- catch(ReplicaNotFoundException rnfe) {
- System.out.println("GOOD: getting " + rnfe);
- }
+ ReplicaRecoveryInfo r = FSDataset.initReplicaRecovery(map, b, recoveryid);
+ Assert.assertNull("Data-node should not have this replica.", r);
}
{ //case "THIS IS NOT SUPPOSED TO HAPPEN"
@@ -240,8 +233,9 @@
FSDataset.checkReplicaFiles(rur);
//update
- final FinalizedReplica finalized = fsdataset.updateReplicaUnderRecovery(
- rur, recoveryid, newlength);
+ final ReplicaInfo finalized =
+ (ReplicaInfo)fsdataset.updateReplicaUnderRecovery(
+ rur, recoveryid, newlength);
//check meta data after update
FSDataset.checkReplicaFiles(finalized);
Modified: hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestBlockUnderConstruction.java
URL: http://svn.apache.org/viewvc/hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestBlockUnderConstruction.java?rev=819791&r1=819790&r2=819791&view=diff
==============================================================================
--- hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestBlockUnderConstruction.java (original)
+++ hadoop/hdfs/branches/HDFS-265/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestBlockUnderConstruction.java Tue Sep 29 01:17:03 2009
@@ -148,7 +148,7 @@
@Test
public void testGetBlockLocations() throws IOException {
final NameNode namenode = cluster.getNameNode();
- final Path p = new Path(BASE_DIR, "file1.dat");
+ final Path p = new Path(BASE_DIR, "file2.dat");
final String src = p.toString();
final FSDataOutputStream out = TestFileCreation.createFile(hdfs, p, 3);