From 527dcfa73a071189d7a78b4fb1c61180c2705979 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Wed, 7 Feb 2024 14:23:08 -0700 Subject: [PATCH] Add flag to decide whether to removed deleted files so that this can be applied to the RandomAccessFile cache but not NetcdfFile cache --- .../java/ucar/nc2/util/cache/FileCache.java | 26 ++++++++++++++++--- .../TestRandomAccessFileCacheCleanup.java | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/cdm/core/src/main/java/ucar/nc2/util/cache/FileCache.java b/cdm/core/src/main/java/ucar/nc2/util/cache/FileCache.java index adfa3a71fa..8eba060ce7 100755 --- a/cdm/core/src/main/java/ucar/nc2/util/cache/FileCache.java +++ b/cdm/core/src/main/java/ucar/nc2/util/cache/FileCache.java @@ -109,6 +109,7 @@ private static void schedule(TimerTask task, long delay) { protected String name; protected final int softLimit, minElements, hardLimit; protected final long period; // msecs + private boolean removeDeleted = false; private final AtomicBoolean disabled = new AtomicBoolean(false); // cache is disabled protected final AtomicBoolean hasScheduled = new AtomicBoolean(false); // a cleanup is scheduled @@ -147,6 +148,23 @@ public FileCache(int minElementsInMemory, int softLimit, int hardLimit, int peri this("", minElementsInMemory, softLimit, hardLimit, period); } + /** + * Constructor. + * + * @param name of file cache + * @param minElementsInMemory keep this number in the cache + * @param softLimit trigger a cleanup if it goes over this number. + * @param hardLimit if > 0, never allow more than this many elements. This causes a cleanup to be done in the calling + * thread. + * @param period if > 0, do periodic cleanups every this number of seconds. + * @param removeDeleted if true, then remove deleted files from the cache when a cleanup is performed. + */ + public FileCache(String name, int minElementsInMemory, int softLimit, int hardLimit, int period, + boolean removeDeleted) { + this(name, minElementsInMemory, softLimit, hardLimit, period); + this.removeDeleted = removeDeleted; + } + /** * Constructor. * @@ -699,9 +717,11 @@ public int compareTo(Tracker o) { synchronized void cleanup(int maxElements) { try { - for (CacheElement.CacheFile cacheFile : files.values()) { - if (!Files.exists(Paths.get(cacheFile.ncfile.getLocation()))) { - remove(cacheFile); + if (removeDeleted) { + for (CacheElement.CacheFile cacheFile : files.values()) { + if (!Files.exists(Paths.get(cacheFile.ncfile.getLocation()))) { + remove(cacheFile); + } } } diff --git a/cdm/core/src/test/java/ucar/nc2/util/cache/TestRandomAccessFileCacheCleanup.java b/cdm/core/src/test/java/ucar/nc2/util/cache/TestRandomAccessFileCacheCleanup.java index 5f17f31324..55bae596f6 100644 --- a/cdm/core/src/test/java/ucar/nc2/util/cache/TestRandomAccessFileCacheCleanup.java +++ b/cdm/core/src/test/java/ucar/nc2/util/cache/TestRandomAccessFileCacheCleanup.java @@ -21,7 +21,7 @@ public class TestRandomAccessFileCacheCleanup { @BeforeClass public static void enableCache() { RandomAccessFile.shutdown(); - cache = new FileCache("RandomAccessFile", 0, 1, 1, 0); + cache = new FileCache("RandomAccessFile", 0, 1, 1, 0, true); RandomAccessFile.setGlobalFileCache(cache); assertThat(cache.showCache().size()).isEqualTo(0); }