|
@@ -102,6 +102,7 @@ import org.apache.commons.text.CaseUtils;
|
|
import org.apache.hadoop.hdfs.protocol.ECTopologyVerifierResult;
|
|
import org.apache.hadoop.hdfs.protocol.ECTopologyVerifierResult;
|
|
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
|
|
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
|
|
import org.apache.hadoop.hdfs.protocol.HdfsLocatedFileStatus;
|
|
import org.apache.hadoop.hdfs.protocol.HdfsLocatedFileStatus;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.LocatedStripedBlock;
|
|
import org.apache.hadoop.hdfs.protocol.SnapshotStatus;
|
|
import org.apache.hadoop.hdfs.protocol.SnapshotStatus;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_KEY;
|
|
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_KEY;
|
|
import static org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.*;
|
|
import static org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.*;
|
|
@@ -5966,8 +5967,26 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
block.setGenerationStamp(nextGenerationStamp(
|
|
block.setGenerationStamp(nextGenerationStamp(
|
|
blockManager.isLegacyBlock(block.getLocalBlock())));
|
|
blockManager.isLegacyBlock(block.getLocalBlock())));
|
|
|
|
|
|
- locatedBlock = BlockManager.newLocatedBlock(
|
|
|
|
- block, file.getLastBlock(), null, -1);
|
|
|
|
|
|
+ BlockInfo lastBlockInfo = file.getLastBlock();
|
|
|
|
+ locatedBlock = BlockManager.newLocatedBlock(block, lastBlockInfo,
|
|
|
|
+ null, -1);
|
|
|
|
+ if (lastBlockInfo.isStriped() &&
|
|
|
|
+ ((BlockInfoStriped) lastBlockInfo).getTotalBlockNum() >
|
|
|
|
+ ((LocatedStripedBlock) locatedBlock).getBlockIndices().length) {
|
|
|
|
+ // The location info in BlockUnderConstructionFeature may not be
|
|
|
|
+ // complete after a failover, so we just return all block tokens for a
|
|
|
|
+ // striped block. This will disrupt the correspondence between
|
|
|
|
+ // LocatedStripedBlock.blockIndices and LocatedStripedBlock.locs,
|
|
|
|
+ // which is not used in client side. The correspondence between
|
|
|
|
+ // LocatedStripedBlock.blockIndices and LocatedBlock.blockToken is
|
|
|
|
+ // ensured.
|
|
|
|
+ byte[] indices =
|
|
|
|
+ new byte[((BlockInfoStriped) lastBlockInfo).getTotalBlockNum()];
|
|
|
|
+ for (int i = 0; i < indices.length; ++i) {
|
|
|
|
+ indices[i] = (byte) i;
|
|
|
|
+ }
|
|
|
|
+ ((LocatedStripedBlock) locatedBlock).setBlockIndices(indices);
|
|
|
|
+ }
|
|
blockManager.setBlockToken(locatedBlock,
|
|
blockManager.setBlockToken(locatedBlock,
|
|
BlockTokenIdentifier.AccessMode.WRITE);
|
|
BlockTokenIdentifier.AccessMode.WRITE);
|
|
} finally {
|
|
} finally {
|