From a14f5f8edea00143a78093b06d83016528918ee6 Mon Sep 17 00:00:00 2001 From: Caleb Hulbert Date: Wed, 10 Jul 2024 13:33:17 -0400 Subject: [PATCH 1/3] perf skip isFile check during readBlock feat: add N5NoSuchKeyException --- .../n5/FileSystemKeyValueAccess.java | 6 ++++- .../saalfeldlab/n5/GsonKeyValueN5Reader.java | 4 +-- .../janelia/saalfeldlab/n5/N5Exception.java | 27 +++++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java b/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java index 01dc75d1..f56d606b 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java @@ -160,7 +160,11 @@ public FileSystemKeyValueAccess(final FileSystem fileSystem) { @Override public LockedFileChannel lockForReading(final String normalPath) throws IOException { - return new LockedFileChannel(normalPath, true); + try { + return new LockedFileChannel(normalPath, true); + } catch (NoSuchFileException e) { + throw new N5Exception.N5NoSuchKeyException("No such file", e); + } } @Override diff --git a/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java b/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java index 644aca51..91a767cf 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java @@ -94,11 +94,11 @@ default DataBlock readBlock( final long... gridPosition) throws N5Exception { final String path = absoluteDataBlockPath(N5URI.normalizeGroupPath(pathName), gridPosition); - if (!getKeyValueAccess().isFile(path)) - return null; try (final LockedChannel lockedChannel = getKeyValueAccess().lockForReading(path)) { return DefaultBlockReader.readBlock(lockedChannel.newInputStream(), datasetAttributes, gridPosition); + } catch (final N5Exception.N5NoSuchKeyException e) { + return null; } catch (final IOException | UncheckedIOException e) { throw new N5IOException( "Failed to read block " + Arrays.toString(gridPosition) + " from dataset " + path, diff --git a/src/main/java/org/janelia/saalfeldlab/n5/N5Exception.java b/src/main/java/org/janelia/saalfeldlab/n5/N5Exception.java index bbdba530..345a7cd0 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/N5Exception.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/N5Exception.java @@ -94,4 +94,31 @@ protected N5ClassCastException( super(message, cause, enableSuppression, writableStackTrace); } } + + public static class N5NoSuchKeyException extends N5IOException { + + public N5NoSuchKeyException(final String message) { + + super(message); + } + + public N5NoSuchKeyException(final String message, final Throwable cause) { + + super(message, cause); + } + + public N5NoSuchKeyException(final Throwable cause) { + + super(cause); + } + + protected N5NoSuchKeyException( + final String message, + final Throwable cause, + final boolean enableSuppression, + final boolean writableStackTrace) { + + super(message, cause, enableSuppression, writableStackTrace); + } + } } From 4ac1176637533225687a3588f435d1a159b2a8e8 Mon Sep 17 00:00:00 2001 From: Caleb Hulbert Date: Fri, 12 Jul 2024 10:38:08 -0400 Subject: [PATCH 2/3] fix: use platform agnostif compose method for absoluteDataBlock --- .../saalfeldlab/n5/CachedGsonKeyValueN5Reader.java | 14 -------------- .../saalfeldlab/n5/GsonKeyValueN5Reader.java | 9 ++++----- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java b/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java index fd512020..6c7ce80e 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java @@ -233,20 +233,6 @@ default String[] listFromContainer(final String normalPathName) { return GsonKeyValueN5Reader.super.list(normalPathName); } - @Override - default String absoluteDataBlockPath( - final String normalPath, - final long... gridPosition) { - - final String[] components = new String[gridPosition.length + 1]; - components[0] = normalPath; - int i = 0; - for (final long p : gridPosition) - components[++i] = Long.toString(p); - - return getKeyValueAccess().compose(getURI(), components); - } - /** * Check for attributes that are required for a group to be a dataset. * diff --git a/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java b/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java index 91a767cf..080d5dfd 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java @@ -137,14 +137,13 @@ default String absoluteDataBlockPath( final String normalPath, final long... gridPosition) { - final String[] components = new String[gridPosition.length + 2]; - components[0] = getURI().getPath(); - components[1] = normalPath; - int i = 1; + final String[] components = new String[gridPosition.length + 1]; + components[0] = normalPath; + int i = 0; for (final long p : gridPosition) components[++i] = Long.toString(p); - return getKeyValueAccess().compose(components); + return getKeyValueAccess().compose(getURI(), components); } /** From 6fe8f29b184457d27dec18c25993f2286de6e1d0 Mon Sep 17 00:00:00 2001 From: Caleb Hulbert Date: Mon, 15 Jul 2024 11:41:09 -0400 Subject: [PATCH 3/3] perf: throw NoSuchFileException when opening reader from Path --- .../janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java | 1 - .../janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java b/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java index 6c7ce80e..812c6ebb 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/CachedGsonKeyValueN5Reader.java @@ -25,7 +25,6 @@ */ package org.janelia.saalfeldlab.n5; -import java.io.IOException; import java.lang.reflect.Type; import com.google.gson.JsonSyntaxException; diff --git a/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java b/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java index f56d606b..cb7444f5 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/FileSystemKeyValueAccess.java @@ -175,7 +175,11 @@ public LockedFileChannel lockForWriting(final String normalPath) throws IOExcept public LockedFileChannel lockForReading(final Path path) throws IOException { - return new LockedFileChannel(path, true); + try { + return new LockedFileChannel(path, true); + } catch (NoSuchFileException e) { + throw new N5Exception.N5NoSuchKeyException("No such file", e); + } } public LockedFileChannel lockForWriting(final Path path) throws IOException {