This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit abaf5f1f8613e7319abbcaaa8eb29d55f94de67d Author: Savyasach Reddy <[email protected]> AuthorDate: Wed Jan 22 23:33:22 2025 +0530 [NO ISSUE]: Account for file changes on directory traversal - user model changes: no - storage format changes: no - interface changes: no Details: - Replace FileUtils.sizeOfDirectory with custom directory size function that accounts for file changes while traversing a directory. Ext-ref: MB-64944 Change-Id: I91501a6ca01a872c28ae7773120750ac28770d05 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19355 Integration-Tests: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Tested-by: Murtadha Hubail <[email protected]> --- .../java/org/apache/hyracks/api/util/IoUtil.java | 31 ++++++++++++++++++++++ .../apache/hyracks/control/nc/io/IOManager.java | 3 +-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java index ae49cb6cb3..9c29206b2b 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java @@ -24,13 +24,17 @@ import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.nio.channels.FileChannel; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Collection; import java.util.Objects; +import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.io.FileUtils; import org.apache.hyracks.api.exceptions.ErrorCode; @@ -189,4 +193,31 @@ public class IoUtil { } } } + + public static long sizeOfDirectory(final Path path) { + final AtomicLong size = new AtomicLong(0); + try { + Files.walkFileTree(path, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + size.addAndGet(attrs.size()); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) { + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + // This should never happen + throw new IllegalStateException("Cannot get the size of directory " + path); + } + return size.get(); + } } diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java index dee61a465a..8d058e5015 100644 --- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java +++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java @@ -37,7 +37,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import org.apache.commons.io.FileUtils; import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.FileReference; @@ -441,7 +440,7 @@ public class IOManager implements IIOManager { public long getTotalDiskUsage() { long totalSize = 0; for (IODeviceHandle handle : ioDevices) { - totalSize += FileUtils.sizeOfDirectory(handle.getMount()); + totalSize += IoUtil.sizeOfDirectory(handle.getMount().toPath()); } return totalSize; }
