[
https://issues.apache.org/jira/browse/HDFS-16757?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17906593#comment-17906593
]
ASF GitHub Bot commented on HDFS-16757:
---------------------------------------
tomscut commented on code in PR #6926:
URL: https://github.com/apache/hadoop/pull/6926#discussion_r1889576893
##########
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java:
##########
@@ -4388,4 +4409,94 @@ boolean isSlownode() {
public BlockPoolManager getBlockPoolManager() {
return blockPoolManager;
}
+
+ public void copyBlockCrossNamespace(ExtendedBlock sourceBlk, ExtendedBlock
targetBlk,
+ DatanodeInfo targetDn) throws IOException {
+ if (!data.isValidBlock(sourceBlk)) {
+ // block does not exist or is under-construction
+ String errStr =
+ "copyBlock:(" + this.getInfoPort() + ") Can't send invalid block " +
sourceBlk + " "
+ + data.getReplicaString(sourceBlk.getBlockPoolId(),
sourceBlk.getBlockId());
+ LOG.info(errStr);
+ throw new IOException(errStr);
+ }
+ long onDiskLength = data.getLength(sourceBlk);
+ if (sourceBlk.getNumBytes() > onDiskLength) {
+ // Shorter on-disk len indicates corruption so report NN the corrupt
block
+ String msg = "copyBlock: Can't replicate block " + sourceBlk + " because
on-disk length "
+ + onDiskLength + " is shorter than provided length " +
sourceBlk.getNumBytes();
+ LOG.info(msg);
+ throw new IOException(msg);
+ }
+ LOG.info(getDatanodeInfo() + " copyBlock: Starting thread to transfer: " +
"block:"
+ + sourceBlk + " from " + this.getDatanodeUuid() + " to " +
targetDn.getDatanodeUuid()
+ + "(" + targetDn + ")");
+ Future<?> result;
+ if (this.getDatanodeUuid().equals(targetDn.getDatanodeUuid())) {
+ result = copyBlockCrossNamespaceExecutor.submit(new
LocalBlockCopy(sourceBlk, targetBlk));
+ } else {
+ result = copyBlockCrossNamespaceExecutor.submit(
+ new DataCopy(targetDn, sourceBlk, targetBlk).getDataTransfer());
+ }
+ try {
+ result.get(getDnConf().getCopyBlockCrossNamespaceSocketTimeout(),
TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ LOG.error(e.getMessage());
+ throw new IOException(e);
+ }
+ }
+
+ private class DataCopy {
+ private final DataTransfer dataTransfer;
+
+ DataCopy(DatanodeInfo targetDn, ExtendedBlock sourceBlk, ExtendedBlock
targetBlk) {
+ FsVolumeImpl volume = (FsVolumeImpl) data.getVolume(sourceBlk);
+ StorageType storageType = volume.getStorageType();
+ String storageId = volume.getStorageID();
+
+ DatanodeInfo[] targets = new DatanodeInfo[] {targetDn};
+ StorageType[] targetStorageTypes = new StorageType[] {storageType};
+ String[] targetStorageIds = new String[] {storageId};
+ dataTransfer =
+ new DataTransfer(targets, targetStorageTypes, targetStorageIds,
sourceBlk, targetBlk,
+ PIPELINE_SETUP_CREATE, "");
+ }
+
+ public DataTransfer getDataTransfer() {
+ return dataTransfer;
+ }
+ }
+
+ class LocalBlockCopy implements Callable<Boolean> {
+ private ExtendedBlock sourceBlk = null;
+ private ExtendedBlock targetBlk = null;
+
+ LocalBlockCopy(ExtendedBlock sourceBlk, ExtendedBlock targetBlk) {
+ this.sourceBlk = sourceBlk;
+ this.targetBlk = targetBlk;
+ }
+
+ public Boolean call() throws IOException {
+ try {
+ targetBlk.setNumBytes(sourceBlk.getNumBytes());
+ data.hardLinkOneBlock(sourceBlk, targetBlk);
+ FsVolumeSpi v = (FsVolumeSpi) (getFSDataset().getVolume(targetBlk));
+ closeBlock(targetBlk, null, v.getStorageID(), v.isTransientStorage());
+
+ BlockLocalPathInfo srcBlpi = data.getBlockLocalPathInfo(sourceBlk);
+ BlockLocalPathInfo dstBlpi = data.getBlockLocalPathInfo(targetBlk);
+ LOG.info(
+ getClass().getSimpleName() + ": Hardlinked " + sourceBlk + "( " +
srcBlpi.getBlockPath()
+ + " " + srcBlpi.getMetaPath() + " ) " + "to " + targetBlk + "(
"
+ + dstBlpi.getBlockPath() + " " + dstBlpi.getMetaPath() + " )
");
+
Review Comment:
@LiuGuH If this is fixed, please "Resolve conversation", thanks.
> Add a new method copyBlockCrossNamespace to DataNode
> ----------------------------------------------------
>
> Key: HDFS-16757
> URL: https://issues.apache.org/jira/browse/HDFS-16757
> Project: Hadoop HDFS
> Issue Type: Sub-task
> Reporter: ZanderXu
> Assignee: liuguanghua
> Priority: Minor
> Labels: pull-request-available
>
> Add a new method copyBlockCrossNamespace in DataTransferProtocol at the
> DataNode Side.
> This method will copy a source block from one namespace to a target block
> from a different namespace. If the target DN is the same with the current DN,
> this method will copy the block via HardLink. If the target DN is different
> with the current DN, this method will copy the block via TransferBlock.
> This method will contains some parameters:
> * ExtendedBlock sourceBlock
> * Token<BlockTokenIdentifier> sourceBlockToken
> * ExtendedBlock targetBlock
> * Token<BlockTokenIdentifier> targetBlockToken
> * DatanodeInfo targetDN
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]