From feb712c253e752bcc5a51e0828881943c8dcc101 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 15 Oct 2019 04:21:40 +0100 Subject: [PATCH] Move persisting of files on dedicated thread. Introduce an event to forcefully persist files. Do that immediately after unsharing anything --- .../main/groovy/com/muwire/core/Core.groovy | 2 ++ .../muwire/core/files/PersisterService.groovy | 36 ++++++++++++------- .../core/files/UIPersistFilesEvent.groovy | 6 ++++ .../com/muwire/gui/MainFrameController.groovy | 2 ++ 4 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 core/src/main/groovy/com/muwire/core/files/UIPersistFilesEvent.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index c87e8a96..f49e22eb 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -28,6 +28,7 @@ import com.muwire.core.files.FileSharedEvent import com.muwire.core.files.FileUnsharedEvent import com.muwire.core.files.HasherService import com.muwire.core.files.PersisterService +import com.muwire.core.files.UIPersistFilesEvent import com.muwire.core.files.AllFilesLoadedEvent import com.muwire.core.files.DirectoryUnsharedEvent import com.muwire.core.files.DirectoryWatcher @@ -223,6 +224,7 @@ public class Core { log.info "initializing persistence service" persisterService = new PersisterService(new File(home, "files.json"), eventBus, 60000, fileManager) eventBus.register(UILoadedEvent.class, persisterService) + eventBus.register(UIPersistFilesEvent.class, persisterService) log.info("initializing host cache") File hostStorage = new File(home, "hosts.json") diff --git a/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy b/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy index 720eb96b..f31da894 100644 --- a/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy +++ b/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy @@ -3,6 +3,9 @@ package com.muwire.core.files import java.nio.file.CopyOption import java.nio.file.Files import java.nio.file.StandardCopyOption +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.ThreadFactory import java.util.logging.Level import java.util.stream.Collectors @@ -28,13 +31,16 @@ class PersisterService extends Service { final int interval final Timer timer final FileManager fileManager + final ExecutorService persisterExecutor = Executors.newSingleThreadExecutor({ r -> + new Thread(r, "file persister") + } as ThreadFactory) PersisterService(File location, EventBus listener, int interval, FileManager fileManager) { this.location = location this.listener = listener this.interval = interval this.fileManager = fileManager - timer = new Timer("file persister", true) + timer = new Timer("file persister timer", true) } void stop() { @@ -44,6 +50,10 @@ class PersisterService extends Service { void onUILoadedEvent(UILoadedEvent e) { timer.schedule({load()} as TimerTask, 1) } + + void onUIPersistFilesEvent(UIPersistFilesEvent e) { + persistFiles() + } void load() { Thread.currentThread().setPriority(Thread.MIN_PRIORITY) @@ -127,19 +137,21 @@ class PersisterService extends Service { } private void persistFiles() { - def sharedFiles = fileManager.getSharedFiles() + persisterExecutor.submit( { + def sharedFiles = fileManager.getSharedFiles() - File tmp = File.createTempFile("muwire-files", "tmp") - tmp.deleteOnExit() - tmp.withPrintWriter { writer -> - sharedFiles.each { k, v -> - def json = toJson(k,v) - json = JsonOutput.toJson(json) - writer.println json + File tmp = File.createTempFile("muwire-files", "tmp") + tmp.deleteOnExit() + tmp.withPrintWriter { writer -> + sharedFiles.each { k, v -> + def json = toJson(k,v) + json = JsonOutput.toJson(json) + writer.println json + } } - } - Files.copy(tmp.toPath(), location.toPath(), StandardCopyOption.REPLACE_EXISTING) - tmp.delete() + Files.copy(tmp.toPath(), location.toPath(), StandardCopyOption.REPLACE_EXISTING) + tmp.delete() + } as Runnable) } private def toJson(File f, SharedFile sf) { diff --git a/core/src/main/groovy/com/muwire/core/files/UIPersistFilesEvent.groovy b/core/src/main/groovy/com/muwire/core/files/UIPersistFilesEvent.groovy new file mode 100644 index 00000000..6cfbc76c --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/files/UIPersistFilesEvent.groovy @@ -0,0 +1,6 @@ +package com.muwire.core.files + +import com.muwire.core.Event + +class UIPersistFilesEvent extends Event { +} diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index b38e5008..93b4d7cb 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -25,6 +25,7 @@ import com.muwire.core.download.UIDownloadPausedEvent import com.muwire.core.download.UIDownloadResumedEvent import com.muwire.core.files.DirectoryUnsharedEvent import com.muwire.core.files.FileUnsharedEvent +import com.muwire.core.files.UIPersistFilesEvent import com.muwire.core.search.QueryEvent import com.muwire.core.search.SearchEvent import com.muwire.core.trust.RemoteTrustList @@ -276,6 +277,7 @@ class MainFrameController { sf.each { core.eventBus.publish(new FileUnsharedEvent(unsharedFile : it)) } + core.eventBus.publish(new UIPersistFilesEvent()) } @ControllerAction