From de2f2ca49cce4f4bf8fd0b86004bc29a9029db92 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 06 Jan 2019 13:50:52 +0000
Subject: [PATCH] ConcurrentModificationException while multiple loading request of different repo archives.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java |   45 +++++++++++++++++++++++++--------------------
 1 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
index 650d4a5..5f7f9d3 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -18,6 +18,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -269,30 +270,34 @@
         if (archive == null || StringUtils.isBlank(archive.getName())) {
             return null;
         }
-        List<BorgFilesystemItem> items = archiveFilelistCache.load(repoConfig, archive, filter);
-        if (items == null && forceLoad) {
-            List<BorgFilesystemItem> list = BorgCommands.listArchiveContent(repoConfig, archive);
-            if (CollectionUtils.isNotEmpty(list)) {
-                archiveFilelistCache.save(repoConfig, archive, list);
-                items = new ArrayList<>();
-                int fileNumber = -1;
-                for (BorgFilesystemItem item : list) {
-                    ++fileNumber;
-                    item.setFileNumber(fileNumber);
-                    if (filter == null || filter.matches(item)) {
-                        items.add(item);
-                        if (filter != null && filter.isFinished()) break;
+        synchronized (archive) {
+            List<BorgFilesystemItem> items = archiveFilelistCache.load(repoConfig, archive, filter);
+            if (items == null && forceLoad) {
+                List<BorgFilesystemItem> list = BorgCommands.listArchiveContent(repoConfig, archive);
+                if (CollectionUtils.isNotEmpty(list)) {
+                    archiveFilelistCache.save(repoConfig, archive, list);
+                    items = new ArrayList<>();
+                    int fileNumber = -1;
+                    Iterator<BorgFilesystemItem> it = list.iterator(); // Don't use for-each (ConcurrentModificationException)
+                    while (it.hasNext()) {
+                        BorgFilesystemItem item = it.next();
+                        ++fileNumber;
+                        item.setFileNumber(fileNumber);
+                        if (filter == null || filter.matches(item)) {
+                            items.add(item);
+                            if (filter != null && filter.isFinished()) break;
+                        }
+                    }
+                    if (filter != null) {
+                        items = filter.reduce(items);
                     }
                 }
-                if (filter != null) {
-                    items = filter.reduce(items);
-                }
             }
+            if (items == null && forceLoad) {
+                log.warn("Repo::archiv with name '" + archive.getBorgIdentifier() + "' not found.");
+            }
+            return items;
         }
-        if (items == null && forceLoad) {
-            log.warn("Repo::archiv with name '" + archive.getBorgIdentifier() + "' not found.");
-        }
-        return items;
     }
 
     public List<BorgFilesystemItem> getArchiveContent(File file) {

--
Gitblit v1.10.0