From 6a5424a1b87d5e7bcec65c4a75480e1ce00469b5 Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Mon, 16 Feb 2026 15:46:14 +0100 Subject: [PATCH 1/3] OAK-12098: blob-plugins - remove use of TransientFileFactory (part 2) --- .../blob/AbstractSharedCachingDataStore.java | 14 +++++++++----- .../oak/plugins/blob/CachingDataStoreTest.java | 6 ++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java b/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java index 569f45cd714..a3ea5ede51a 100644 --- a/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java +++ b/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; import java.security.DigestOutputStream; import java.security.MessageDigest; import java.util.Iterator; @@ -52,8 +53,6 @@ import org.apache.jackrabbit.oak.spi.blob.AbstractSharedBackend; import org.apache.jackrabbit.oak.spi.blob.BlobOptions; import org.apache.jackrabbit.oak.stats.StatisticsProvider; -import org.apache.jackrabbit.util.LazyFileInputStream; -import org.apache.jackrabbit.util.TransientFileFactory; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -323,11 +322,16 @@ public InputStream getStream() throws DataStoreException { try { // If cache configured to 0 will return null if (cached == null || !cached.exists()) { - TransientFileFactory fileFactory = TransientFileFactory.getInstance(); - File tmpFile = fileFactory.createTransientFile("temp0cache", null, temp); + final File tmpFile = Files.createTempFile(temp.toPath(), "blob-cache-", null).toFile(); try (InputStream in = backend.getRecord(getIdentifier()).getStream()) { copyInputStreamToFile(in, tmpFile); - return new LazyFileInputStream(tmpFile); + return new FileInputStream(tmpFile); + } finally { + // temp file can be created right now, as we already obtained the FileInputStream + boolean deleted = tmpFile.delete(); + if (!deleted) { + LOG.debug("Could not delete temporary file '{}''", tmpFile); + } } } else { return new FileInputStream(cached); diff --git a/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java b/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java index eb046262aba..41c16009f49 100644 --- a/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java +++ b/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java @@ -46,7 +46,6 @@ import org.apache.jackrabbit.oak.spi.blob.BlobOptions; import org.apache.jackrabbit.oak.stats.DefaultStatisticsProvider; import org.apache.jackrabbit.oak.stats.StatisticsProvider; -import org.apache.jackrabbit.util.LazyFileInputStream; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -192,12 +191,11 @@ public void loadDirectBackendTemp(long cacheSize) throws Exception { closer.register(is); assertNotNull(is); - assertTrue(is instanceof LazyFileInputStream); - ((LazyFileInputStream)is).open(); File tmp = new File(new File(path), "tmp"); + // (tmp file names are implementation details) Collection temp0cacheFiles = - FileUtils.listFiles(tmp, FileFilterUtils.prefixFileFilter("temp0cache"), null); + FileUtils.listFiles(tmp, FileFilterUtils.prefixFileFilter("blob-cache-"), null); assertEquals(1, temp0cacheFiles.size()); assertFile(is, f, folder, false); From 98220e271fbe026e539fb9c7847a87f172d09922 Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Mon, 9 Mar 2026 16:13:28 +0100 Subject: [PATCH 2/3] OAK-12098: use DELETE_ON_CLOSE instead) --- .../oak/plugins/blob/AbstractSharedCachingDataStore.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java b/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java index a3ea5ede51a..30085fcb063 100644 --- a/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java +++ b/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/AbstractSharedCachingDataStore.java @@ -29,6 +29,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.StandardOpenOption; import java.security.DigestOutputStream; import java.security.MessageDigest; import java.util.Iterator; @@ -325,13 +326,7 @@ public InputStream getStream() throws DataStoreException { final File tmpFile = Files.createTempFile(temp.toPath(), "blob-cache-", null).toFile(); try (InputStream in = backend.getRecord(getIdentifier()).getStream()) { copyInputStreamToFile(in, tmpFile); - return new FileInputStream(tmpFile); - } finally { - // temp file can be created right now, as we already obtained the FileInputStream - boolean deleted = tmpFile.delete(); - if (!deleted) { - LOG.debug("Could not delete temporary file '{}''", tmpFile); - } + return Files.newInputStream(tmpFile.toPath(), StandardOpenOption.DELETE_ON_CLOSE); } } else { return new FileInputStream(cached); From acbb4a9f1dbf717b84a5a252a3c55ddae6707db4 Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Mon, 9 Mar 2026 17:15:09 +0100 Subject: [PATCH 3/3] OAK-12098: remove broken test assumption --- .../oak/plugins/blob/CachingDataStoreTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java b/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java index 41c16009f49..5421e4487c1 100644 --- a/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java +++ b/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/CachingDataStoreTest.java @@ -192,11 +192,14 @@ public void loadDirectBackendTemp(long cacheSize) throws Exception { assertNotNull(is); - File tmp = new File(new File(path), "tmp"); + + // OAK-12098: Incorrect assumptions about files still to be present + // File tmp = new File(new File(path), "tmp"); + // // (tmp file names are implementation details) - Collection temp0cacheFiles = - FileUtils.listFiles(tmp, FileFilterUtils.prefixFileFilter("blob-cache-"), null); - assertEquals(1, temp0cacheFiles.size()); + // Collection temp0cacheFiles = + // FileUtils.listFiles(tmp, FileFilterUtils.prefixFileFilter("blob-cache-"), null); + // assertEquals(1, temp0cacheFiles.size()); assertFile(is, f, folder, false);