diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java index df24f9890db044..c8b8d865711f60 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java @@ -3522,28 +3522,32 @@ public void evictBlocks(long bytesNeeded) throws IOException { ReplicaInfo replicaInfo, newReplicaInfo; final String bpid = replicaState.getBlockPoolId(); + final FsVolumeImpl lazyPersistVolume = replicaState.getLazyPersistVolume(); - try (AutoCloseableLock lock = lockManager.writeLock(LockLevel.BLOCK_POOl, bpid)) { + try (AutoCloseableLock lock = lockManager.readLock(LockLevel.BLOCK_POOl, bpid)) { replicaInfo = getReplicaInfo(replicaState.getBlockPoolId(), replicaState.getBlockId()); Preconditions.checkState(replicaInfo.getVolume().isTransientStorage()); ramDiskReplicaTracker.discardReplica(replicaState.getBlockPoolId(), replicaState.getBlockId(), false); - // Move the replica from lazyPersist/ to finalized/ on - // the target volume - newReplicaInfo = - replicaState.getLazyPersistVolume().activateSavedReplica(bpid, - replicaInfo, replicaState); - // Update the volumeMap entry. - volumeMap.add(bpid, newReplicaInfo); - - // Update metrics - datanode.getMetrics().incrRamDiskBlocksEvicted(); - datanode.getMetrics().addRamDiskBlocksEvictionWindowMs( - Time.monotonicNow() - replicaState.getCreationTime()); - if (replicaState.getNumReads() == 0) { - datanode.getMetrics().incrRamDiskBlocksEvictedWithoutRead(); + try (AutoCloseableLock lock1 = lockManager.writeLock(LockLevel.VOLUME, + bpid, lazyPersistVolume.getStorageID())) { + // Move the replica from lazyPersist/ to finalized/ on + // the target volume + newReplicaInfo = + replicaState.getLazyPersistVolume().activateSavedReplica(bpid, + replicaInfo, replicaState); + // Update the volumeMap entry. + volumeMap.add(bpid, newReplicaInfo); + + // Update metrics + datanode.getMetrics().incrRamDiskBlocksEvicted(); + datanode.getMetrics().addRamDiskBlocksEvictionWindowMs( + Time.monotonicNow() - replicaState.getCreationTime()); + if (replicaState.getNumReads() == 0) { + datanode.getMetrics().incrRamDiskBlocksEvictedWithoutRead(); + } } // Delete the block+meta files from RAM disk and release locked