mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
30.02.2018 0703e4eeef5bc069b744eb7a9f63449fb8524766
Handle concurrent load of file archives properly.
3 files modified
17 ■■■■ changed files
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgCommands.java 12 ●●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgJob.java 4 ●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java 1 ●●●● patch | view | raw | blame | history
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;
    }
    /**
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;
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))))) {