From 5a8340dfe309e30fdab406a504ada04815171b6c Mon Sep 17 00:00:00 2001 From: Caleb Hulbert Date: Fri, 6 Mar 2026 09:56:46 -0500 Subject: [PATCH 1/2] fix: don't lock when deleting directories --- src/main/java/org/janelia/saalfeldlab/n5/FsIoPolicy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/janelia/saalfeldlab/n5/FsIoPolicy.java b/src/main/java/org/janelia/saalfeldlab/n5/FsIoPolicy.java index 5d01dd919..2a3e26a6e 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/FsIoPolicy.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/FsIoPolicy.java @@ -69,6 +69,8 @@ public VolatileReadData read(String key) throws IOException { @Override public void delete(final String key) throws IOException { final Path path = Paths.get(key); + if (!Files.isRegularFile(path)) + Files.delete(path); try (LockedFileChannel ignore = FILE_LOCK_MANAGER.lockForWriting(path)) { Files.delete(path); } From 5f37ae601b0324fc8e275f7d85784bd5a3b83d80 Mon Sep 17 00:00:00 2001 From: Caleb Hulbert Date: Mon, 9 Mar 2026 10:36:51 -0400 Subject: [PATCH 2/2] fix: ensure the VolatileReadData closes on InputStream close Signed-off-by: Caleb Hulbert --- .../saalfeldlab/n5/BufferedKvaLockedChannel.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/janelia/saalfeldlab/n5/BufferedKvaLockedChannel.java b/src/main/java/org/janelia/saalfeldlab/n5/BufferedKvaLockedChannel.java index 70ed4ba60..495eb8fbd 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/BufferedKvaLockedChannel.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/BufferedKvaLockedChannel.java @@ -1,6 +1,8 @@ package org.janelia.saalfeldlab.n5; +import org.apache.commons.io.input.ProxyInputStream; import org.janelia.saalfeldlab.n5.readdata.ReadData; +import org.janelia.saalfeldlab.n5.readdata.VolatileReadData; import java.io.*; @@ -23,7 +25,15 @@ public Reader newReader() throws N5Exception.N5IOException { @Override public InputStream newInputStream() throws N5Exception.N5IOException { - return kva.createReadData(key).inputStream(); + + VolatileReadData volatileReadData = kva.createReadData(key); + return new ProxyInputStream(volatileReadData.inputStream()) { + @Override + public void close() throws IOException { + volatileReadData.close(); + super.close(); + } + }; } @Override