[
https://issues.apache.org/jira/browse/HDFS-17346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Shuyan Zhang resolved HDFS-17346.
---------------------------------
Fix Version/s: 3.5.0
Hadoop Flags: Reviewed
Target Version/s: 3.5.0
Resolution: Fixed
> Fix DirectoryScanner check mark the normal blocks as corrupt.
> -------------------------------------------------------------
>
> Key: HDFS-17346
> URL: https://issues.apache.org/jira/browse/HDFS-17346
> Project: Hadoop HDFS
> Issue Type: Improvement
> Components: datanode
> Reporter: Haiyang Hu
> Assignee: Haiyang Hu
> Priority: Major
> Labels: pull-request-available
> Fix For: 3.5.0
>
>
> DirectoryScanner check mark the normal blocks as corrupt and report to
> namenode, it maybe cause some corrupted blocks, actually these are health.
> This can happen if Appending and DirectoryScanner are running at the same
> time, and the probability is very high.
> *Root cause:*
> * Create a file such as:blk_xxx_1001 and diskFile is
> "file:/XXX/current/finalized/blk_xxx", diskMetaFile is
> "file:/XXX/current/finalized/blk_xxx_1001.meta"
> * Run DirectoryScanner, first will create BlockPoolReport.ScanInfo and record
> blockFile is "file:/XXX/current/finalized/blk_xxx" and metaFile is
> "file:/XXX/current/finalized/blk_xxx_1001.meta"
> * Simultaneously other thread to complete append for blk_xxx, then the
> diskFile "file:/XXX/current/finalized/blk_xxx", diskMetaFile
> "file:/XXX/current/finalized/blk_xxx_1002.meta", memMetaFile
> "file:/XXX/current/finalized/blk_xxx", memDataFile
> "file:/XXX/current/finalized/blk_xxx_1002.meta"
> * DirectoryScanner continue to run, due to the different generation stamps of
> the metadata file in mem and metadata file in scanInfo will add the scanInfo
> object to the list of differences
> * Continue to run FsDatasetImpl#checkAndUpdate will traverse the list of
> differences, due to current diskMetaFile
> "/XXX/current/finalized/blk_xxx_1001.meta" is not exists, so isRegular as
> false
> {code:java}
> final boolean isRegular = FileUtil.isRegularFile(diskMetaFile, false) &&
> FileUtil.isRegularFile(diskFile, false);
> {code}
> * Here will mark the normal blocks as corrupt and report to namenode
> {code:java}
> } else if (!isRegular) {
> corruptBlock = new Block(memBlockInfo);
> LOG.warn("Block:{} is not a regular file.", corruptBlock.getBlockId());
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]