HDFS-16891 Avoid the overhead of copy-on-write exception list while loading inodes sub sections in parallel (#5300)

Reviewed-by: Stephen O'Donnell <sodonnell@apache.org>
Signed-off-by: Chris Nauroth <cnauroth@apache.org>
This commit is contained in:
Viraj Jasani 2023-01-18 13:13:41 -08:00 committed by GitHub
parent 442a5fb285
commit 04f3573f6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -23,9 +23,9 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -227,8 +227,7 @@ void loadINodeDirectorySectionInParallel(ExecutorService service,
LOG.info("Loading the INodeDirectory section in parallel with {} sub-" +
"sections", sections.size());
CountDownLatch latch = new CountDownLatch(sections.size());
final CopyOnWriteArrayList<IOException> exceptions =
new CopyOnWriteArrayList<>();
final List<IOException> exceptions = Collections.synchronizedList(new ArrayList<>());
for (FileSummary.Section s : sections) {
service.submit(() -> {
InputStream ins = null;
@ -237,8 +236,7 @@ void loadINodeDirectorySectionInParallel(ExecutorService service,
compressionCodec);
loadINodeDirectorySection(ins);
} catch (Exception e) {
LOG.error("An exception occurred loading INodeDirectories in " +
"parallel", e);
LOG.error("An exception occurred loading INodeDirectories in parallel", e);
exceptions.add(new IOException(e));
} finally {
latch.countDown();
@ -424,8 +422,7 @@ void loadINodeSectionInParallel(ExecutorService service,
long expectedInodes = 0;
CountDownLatch latch = new CountDownLatch(sections.size());
AtomicInteger totalLoaded = new AtomicInteger(0);
final CopyOnWriteArrayList<IOException> exceptions =
new CopyOnWriteArrayList<>();
final List<IOException> exceptions = Collections.synchronizedList(new ArrayList<>());
for (int i=0; i < sections.size(); i++) {
FileSummary.Section s = sections.get(i);