From 0703e4eeef5bc069b744eb7a9f63449fb8524766 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 30 Dec 2018 06:02:08 +0000
Subject: [PATCH] Handle concurrent load of file archives properly.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java |    1 +
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java               |   12 +++++-------
 borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java                    |    4 +++-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
index aeb5894..4e55fa2 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java
@@ -172,23 +172,21 @@
                 .setArchive(archive.getName())
                 .setParams("--json-lines")
                 .setDescription("Loading list of files of archive '" + archive.getName() + "' of repo '" + repoConfig.getDisplayName() + "'.");
-        List<BorgFilesystemItem> content = new ArrayList<>();
         // The returned job might be an already queued or running one!
-        BorgJob job = BorgQueueExecutor.getInstance().execute(new BorgJob(command) {
+        BorgJob<List<BorgFilesystemItem>> job = BorgQueueExecutor.getInstance().execute(new BorgJob<List<BorgFilesystemItem>>(command) {
             @Override
             protected void processStdOutLine(String line, int level) {
                 BorgFilesystemItem item = JsonUtils.fromJson(BorgFilesystemItem.class, line);
                 item.setMtime(DateUtils.format(item.getMtime()));
-                content.add(item);
+                payload.add(item);
             }
         });
-
+        job.payload = new ArrayList<>();
         JobResult<String> jobResult = job.getResult();
         if (jobResult.getStatus() != JobResult.Status.OK) {
-            return content;
+            return job.getPayload();
         }
-        Collections.sort(content); // Sort by path.
-        return content;
+        return job.payload;
     }
 
     /**
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
index 921a544..7ed166b 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java
@@ -17,10 +17,12 @@
  * A queue is important because Borg doesn't support parallel calls for one repository.
  * For each repository one single queue is allocated.
  */
-public class BorgJob extends AbstractCommandLineJob<String> {
+public class BorgJob<T> extends AbstractCommandLineJob<String> {
     private Logger log = LoggerFactory.getLogger(BorgJob.class);
     @Getter
     private BorgCommand command;
+    @Getter
+    protected T payload;
 
     public BorgJob(BorgCommand command) {
         this.command = command;
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 df54f92..04abb8c 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
@@ -48,6 +48,7 @@
                     return;
                 }
                 savingFiles.add(file);
+                Collections.sort(filesystemItems); // Sort by path.
             }
             log.info("Saving archive content as file list: " + file.getAbsolutePath());
             try (ObjectOutputStream outputStream = new ObjectOutputStream(new BufferedOutputStream(new GzipCompressorOutputStream(new FileOutputStream(file))))) {

--
Gitblit v1.10.0