From 97e1cce284ff09f3d208fbc776fc9692af9bde0a Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 17:15:44 +0000
Subject: [PATCH] Some required synchronizations...
---
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java | 40 +++++++++----------
borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java | 30 +++++++++++---
borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java | 2
3 files changed, 43 insertions(+), 29 deletions(-)
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
index 103c9d8..67b0a10 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/Repository.java
@@ -11,6 +11,8 @@
import org.slf4j.LoggerFactory;
import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -69,15 +71,18 @@
/**
* Might be null.
*/
- @Getter
@Setter
private SortedSet<Archive> archives;
public Repository add(Archive archive) {
- if (this.archives == null) {
- this.archives = new TreeSet<>();
+ synchronized (this) {
+ if (this.archives == null) {
+ this.archives = new TreeSet<>();
+ }
}
- this.archives.add(archive);
+ synchronized (this.archives) {
+ this.archives.add(archive);
+ }
return this;
}
@@ -86,9 +91,11 @@
log.warn("Can't get archive '" + idOrName + "' from repository '" + name + "'. Archives not yet loaded or don't exist.");
return null;
}
- for (Archive archive : archives) {
- if (StringUtils.equals(idOrName, archive.getId()) || StringUtils.equals(idOrName, archive.getName())) {
- return archive;
+ synchronized (this.archives) {
+ for (Archive archive : archives) {
+ if (StringUtils.equals(idOrName, archive.getId()) || StringUtils.equals(idOrName, archive.getName())) {
+ return archive;
+ }
}
}
log.warn("Archive '" + idOrName + "' not found in repository '" + name + "'.");
@@ -103,4 +110,13 @@
public boolean isArchivesLoaded() {
return CollectionUtils.isNotEmpty(archives);
}
+
+ public Collection<Archive> getArchives() {
+ if (this.archives == null) {
+ return null;
+ }
+ synchronized (this.archives) {
+ return Collections.unmodifiableSet(this.archives);
+ }
+ }
}
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
index cf28884..7ce762e 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
@@ -1,7 +1,6 @@
package de.micromata.borgbutler.jobs;
import lombok.Getter;
-import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,7 +22,9 @@
}
public List<AbstractJob<T>> getDoneJobs() {
- return Collections.unmodifiableList(doneJobs);
+ synchronized (doneJobs) {
+ return Collections.unmodifiableList(doneJobs);
+ }
}
/**
@@ -41,31 +42,22 @@
}
}
queue.add(job.setStatus(AbstractJob.Status.QUEUED));
- job.setFuture(executorService.submit(new CallableTask(job)));
- return job;
}
+ job.setFuture(executorService.submit(new CallableTask(job)));
+ return job;
}
public AbstractJob getQueuedJob(Object id) {
- for (AbstractJob job : queue) {
- if (Objects.equals(job.getId(), id)) {
- return job;
+ synchronized (queue) {
+ for (AbstractJob job : queue) {
+ if (Objects.equals(job.getId(), id)) {
+ return job;
+ }
}
}
return null;
}
- void waitForQueue(int seconds) {
- int counter = seconds / 10;
- while (CollectionUtils.isNotEmpty(queue) && counter > 0) {
- try {
- Thread.sleep(100);
- } catch (InterruptedException ex) {
- log.error(ex.getMessage(), ex);
- }
- }
- }
-
private void organizeQueue() {
synchronized (queue) {
if (queue.isEmpty()) {
@@ -76,13 +68,19 @@
AbstractJob<T> job = it.next();
if (job.isFinished()) {
it.remove();
- doneJobs.add(0, job);
+ synchronized (doneJobs) {
+ doneJobs.add(0, job);
+ }
}
- while (doneJobs.size() > MAX_DONE_JOBS_SIZE) {
- doneJobs.remove(doneJobs.size() - 1);
+ synchronized (doneJobs) {
+ while (doneJobs.size() > MAX_DONE_JOBS_SIZE) {
+ doneJobs.remove(doneJobs.size() - 1);
+ }
}
}
}
+
+
}
private class CallableTask implements Callable<JobResult<T>> {
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
index 85e21e3..dbbf8a7 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/cache/CacheTest.java
@@ -48,7 +48,7 @@
repoConfig = repoConfigs.get(0);
Repository rerepositoryoList = ButlerCache.getInstance().getRepositoryArchives(repoConfig.getRepo());
if (rerepositoryoList != null && CollectionUtils.isNotEmpty(rerepositoryoList.getArchives())) {
- archive = rerepositoryoList.getArchives().first();
+ archive = rerepositoryoList.getArchives().iterator().next();
}
}
{
--
Gitblit v1.10.0