Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
-
Reviewed
Description
DirectoryScanner does scan by deep copying FinalizedReplica. In a deployment with 500,000+ blocks, we've seen the DN heap usage being accumulated to high peaks very quickly. Deep copies of FinalizedReplica will make DN heap usage even worse if directory scans are scheduled more frequently. This proposes removing unnecessary deep copies since DirectoryScanner#scan already holds lock of dataset.
DirectoryScanner#scan
try(AutoCloseableLock lock = dataset.acquireDatasetLock()) { for (Entry<String, ScanInfo[]> entry : diskReport.entrySet()) { String bpid = entry.getKey(); ScanInfo[] blockpoolReport = entry.getValue(); Stats statsRecord = new Stats(bpid); stats.put(bpid, statsRecord); LinkedList<ScanInfo> diffRecord = new LinkedList<ScanInfo>(); diffs.put(bpid, diffRecord); statsRecord.totalBlocks = blockpoolReport.length; List<ReplicaInfo> bl = dataset.getFinalizedBlocks(bpid); /* deep copies here*/
FsDatasetImpl#getFinalizedBlocks
public List<ReplicaInfo> getFinalizedBlocks(String bpid) { try (AutoCloseableLock lock = datasetLock.acquire()) { ArrayList<ReplicaInfo> finalized = new ArrayList<ReplicaInfo>(volumeMap.size(bpid)); for (ReplicaInfo b : volumeMap.replicas(bpid)) { if (b.getState() == ReplicaState.FINALIZED) { finalized.add(new ReplicaBuilder(ReplicaState.FINALIZED) .from(b).build()); /* deep copies here*/ } } return finalized; } }