From a19451799f5a65a5b65cfd8f419d3f3e8699ff63 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Mon, 10 Dec 2018 23:09:03 +0000
Subject: [PATCH] Expiry

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java |   75 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
index 2fcd07d..4ac4219 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
@@ -12,13 +12,21 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
 import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
 
 class ArchiveFilelistCache {
     private static Logger log = LoggerFactory.getLogger(ArchiveFilelistCache.class);
     private static final String CACHE_ARCHIVE_LISTS_BASENAME = "archive-content-";
     private static final String CACHE_FILE_GZIP_EXTENSION = "gz";
     private File cacheDir;
+    private int cacheArchiveContentMaxDiscSizeMB;
+    private long FILES_EXPIRE_TIME = 5 * 24 * 3660 * 1000; // Expires after 5 days.
 
     @Getter
     private Archive archive;
@@ -80,10 +88,70 @@
      */
     public void cleanUp() {
         File[] files = cacheDir.listFiles();
+        long currentMillis = System.currentTimeMillis();
+        for (File file : files) {
+            try {
+                if (!file.exists() || !isCacheFile(file)) continue;
+                // Get last access time of file:
+                FileTime time = Files.readAttributes(file.toPath(), BasicFileAttributes.class).lastAccessTime();
+                if (currentMillis - FILES_EXPIRE_TIME > time.toMillis()) {
+                    log.info("Delete old cache file (last access " + time + " older than 5 days): " + file.getAbsolutePath());
+                    file.delete();
+                }
+            } catch (IOException ex) {
+                log.error("Can't get last accesstime from cache files (ignore file '" + file.getAbsolutePath() + "'): " + ex.getMessage(), ex);
+            }
+        }
+        int sizeInMB = getCacheDiskSizeInMB(files);
+        if (sizeInMB > cacheArchiveContentMaxDiscSizeMB) {
+            log.info("Maximum size of cache files exceeded (" + sizeInMB + "MB > " + cacheArchiveContentMaxDiscSizeMB
+                    + "MB). Deleting the old ones (with the oldest access)...");
+        }
+        SortedMap<FileTime, File> sortedFiles = new TreeMap<>();
+        for (File file : files) {
+            if (!file.exists() || !isCacheFile(file)) continue;
+            try {
+                // Get last access time of file:
+                FileTime time = Files.readAttributes(file.toPath(), BasicFileAttributes.class).lastAccessTime();
+                sortedFiles.put(time, file);
+            } catch (IOException ex) {
+                log.error("Can't get last accesstime from cache files (ignore file '" + file.getAbsolutePath() + "'): " + ex.getMessage(), ex);
+            }
+        }
+        for (Map.Entry<FileTime, File> entry : sortedFiles.entrySet()) {
+            FileTime time = entry.getKey();
+            File file = entry.getValue();
+            if (!file.exists() || !isCacheFile(file)) continue;
+            log.info("Deleting cache file (last access " + time + "): " + file.getAbsolutePath());
+            file.delete();
+            int newSizeInMB = getCacheDiskSizeInMB(files);
+            if (newSizeInMB < cacheArchiveContentMaxDiscSizeMB) {
+                log.info("New cache size is " + newSizeInMB + "MB. (" + (sizeInMB - newSizeInMB) + "MB deleted.)");
+                break;
+            }
+        }
+    }
+
+    public int getCacheDiskSizeInMB() {
+        return getCacheDiskSizeInMB(cacheDir.listFiles());
+    }
+
+    private int getCacheDiskSizeInMB(File[] files) {
+        int sizeInMB = 0;
+        for (File file : files) {
+            if (!file.exists()) continue;
+            if (!isCacheFile(file)) continue;
+            sizeInMB += (int) (file.length() / 1048576); // In MB
+        }
+        return sizeInMB;
+    }
+
+    public void removeAllCacheFiles() {
+        File[] files = cacheDir.listFiles();
         for (File file : files) {
             if (isCacheFile(file)) {
-                log.info("Processing cache file: " + file.getAbsolutePath());
-                //file.delete();
+                log.info("Deleting cache file: " + file.getAbsolutePath());
+                file.delete();
             }
         }
     }
@@ -93,8 +161,9 @@
                 + "-" + repoConfig.getRepo() + "-" + archive.getArchive() + ".gz", true));
     }
 
-    ArchiveFilelistCache(File cacheDir) {
+    ArchiveFilelistCache(File cacheDir, int cacheArchiveContentMaxDiscSizeMB) {
         this.cacheDir = cacheDir;
+        this.cacheArchiveContentMaxDiscSizeMB = cacheArchiveContentMaxDiscSizeMB;
     }
 
     private boolean isCacheFile(File file) {

--
Gitblit v1.10.0