HDFS-11018. Incorrect check and message in FsDatasetImpl#invalidate. Contributed by Yiqun Lin.

This commit is contained in:
Wei-Chiu Chuang 2016-10-20 10:49:39 -07:00
parent f872c6bc03
commit 6d2da38d16
1 changed files with 21 additions and 10 deletions

View File

@ -786,8 +786,14 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
throws ReplicaNotFoundException { throws ReplicaNotFoundException {
ReplicaInfo info = volumeMap.get(b.getBlockPoolId(), b.getLocalBlock()); ReplicaInfo info = volumeMap.get(b.getBlockPoolId(), b.getLocalBlock());
if (info == null) { if (info == null) {
throw new ReplicaNotFoundException( if (volumeMap.get(b.getBlockPoolId(), b.getLocalBlock().getBlockId())
ReplicaNotFoundException.NON_EXISTENT_REPLICA + b); == null) {
throw new ReplicaNotFoundException(
ReplicaNotFoundException.NON_EXISTENT_REPLICA + b);
} else {
throw new ReplicaNotFoundException(
ReplicaNotFoundException.UNEXPECTED_GS_REPLICA + b);
}
} }
return info; return info;
} }
@ -1878,16 +1884,21 @@ class FsDatasetImpl implements FsDatasetSpi<FsVolumeImpl> {
try (AutoCloseableLock lock = datasetLock.acquire()) { try (AutoCloseableLock lock = datasetLock.acquire()) {
final ReplicaInfo info = volumeMap.get(bpid, invalidBlks[i]); final ReplicaInfo info = volumeMap.get(bpid, invalidBlks[i]);
if (info == null) { if (info == null) {
// It is okay if the block is not found -- it may be deleted earlier. ReplicaInfo infoByBlockId =
LOG.info("Failed to delete replica " + invalidBlks[i] volumeMap.get(bpid, invalidBlks[i].getBlockId());
+ ": ReplicaInfo not found."); if (infoByBlockId == null) {
continue; // It is okay if the block is not found -- it
} // may be deleted earlier.
if (info.getGenerationStamp() != invalidBlks[i].getGenerationStamp()) { LOG.info("Failed to delete replica " + invalidBlks[i]
errors.add("Failed to delete replica " + invalidBlks[i] + ": ReplicaInfo not found.");
+ ": GenerationStamp not matched, info=" + info); } else {
errors.add("Failed to delete replica " + invalidBlks[i]
+ ": GenerationStamp not matched, existing replica is "
+ Block.toString(infoByBlockId));
}
continue; continue;
} }
v = (FsVolumeImpl)info.getVolume(); v = (FsVolumeImpl)info.getVolume();
if (v == null) { if (v == null) {
errors.add("Failed to delete replica " + invalidBlks[i] errors.add("Failed to delete replica " + invalidBlks[i]