From 1b6eda5a403c4b4a397511d39ba3d5259e294a46 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Fri, 21 Jun 2019 13:34:00 +0100 Subject: [PATCH] skeleton of mesh manager --- .../main/groovy/com/muwire/core/Core.groovy | 5 +++ .../groovy/com/muwire/core/mesh/Mesh.groovy | 19 ++++++++ .../com/muwire/core/mesh/MeshManager.groovy | 43 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 core/src/main/groovy/com/muwire/core/mesh/Mesh.groovy create mode 100644 core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 17b7eda0..73509f47 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -29,6 +29,7 @@ import com.muwire.core.files.DirectoryWatcher import com.muwire.core.hostcache.CacheClient import com.muwire.core.hostcache.HostCache import com.muwire.core.hostcache.HostDiscoveredEvent +import com.muwire.core.mesh.MeshManager import com.muwire.core.search.QueryEvent import com.muwire.core.search.ResultsEvent import com.muwire.core.search.ResultsSender @@ -166,6 +167,10 @@ public class Core { eventBus.register(FileDownloadedEvent.class, fileManager) eventBus.register(FileUnsharedEvent.class, fileManager) eventBus.register(SearchEvent.class, fileManager) + + log.info("initializing mesh manager") + MeshManager meshManager = new MeshManager(fileManager) + eventBus.register(SourceDiscoveredEvent.class, meshManager) log.info "initializing persistence service" persisterService = new PersisterService(new File(home, "files.json"), eventBus, 15000, fileManager) diff --git a/core/src/main/groovy/com/muwire/core/mesh/Mesh.groovy b/core/src/main/groovy/com/muwire/core/mesh/Mesh.groovy new file mode 100644 index 00000000..d18c75fb --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/mesh/Mesh.groovy @@ -0,0 +1,19 @@ +package com.muwire.core.mesh + +import com.muwire.core.InfoHash + +import com.muwire.core.download.Pieces + +import net.i2p.data.Destination +import net.i2p.util.ConcurrentHashSet + +class Mesh { + private final InfoHash infoHash + private final Set sources = new ConcurrentHashSet<>() + private final Pieces pieces + + Mesh(InfoHash infoHash, Pieces pieces) { + this.infoHash = infoHash + this.pieces = pieces + } +} diff --git a/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy b/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy new file mode 100644 index 00000000..0239acd8 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/mesh/MeshManager.groovy @@ -0,0 +1,43 @@ +package com.muwire.core.mesh + +import com.muwire.core.Constants +import com.muwire.core.InfoHash +import com.muwire.core.download.Pieces +import com.muwire.core.download.SourceDiscoveredEvent +import com.muwire.core.files.FileManager + +class MeshManager { + + private final Map meshes = Collections.synchronizedMap(new HashMap<>()) + private final FileManager fileManager + + MeshManager(FileManager fileManager) { + this.fileManager = fileManager + } + + Mesh get(InfoHash infoHash) { + meshes.get(infoHash) + } + + Mesh getOrCreate(InfoHash infoHash, int nPieces) { + synchronized(meshes) { + if (meshes.containsKey(infoHash)) + return meshes.get(infoHash) + Pieces pieces = new Pieces(nPieces, Constants.DOWNLOAD_SEQUENTIAL_RATIO) + if (fileManager.rootToFiles.containsKey(infoHash)) { + for (int i = 0; i < nPieces; i++) + pieces.markDownloaded(i) + } + Mesh rv = new Mesh(infoHash, pieces) + meshes.put(infoHash, rv) + return rv + } + } + + void onSourceDiscoveredEvent(SourceDiscoveredEvent e) { + Mesh mesh = meshes.get(e.infoHash) + if (mesh == null) + return + mesh.sources.add(e.source.destination) + } +}