Multi-thread download tasks

This commit is contained in:
JFronny 2021-05-07 17:39:13 +02:00
parent c43ec9a1e9
commit c186821942
10 changed files with 41 additions and 25 deletions

View File

@ -3,12 +3,12 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties # Fabric Properties
# check these on https://modmuss50.me/fabric.html # check these on https://modmuss50.me/fabric.html
minecraft_version=1.16.5 minecraft_version=1.16.5
yarn_mappings=1.16.5+build.6 yarn_mappings=1.16.5+build.8
loader_version=0.11.3 loader_version=0.11.3
# Mod Properties # Mod Properties
mod_version=1.5.0 mod_version=1.6.0
maven_group=io.gitlab.jfronny maven_group=io.gitlab.jfronny
archives_base_name=resclone archives_base_name=resclone
# Dependencies # Dependencies
# check this on https://modmuss50.me/fabric.html # check this on https://modmuss50.me/fabric.html
fabric_version=0.32.5+1.16 fabric_version=0.34.1+1.16

View File

@ -9,6 +9,7 @@ import io.gitlab.jfronny.resclone.fetchers.PackFetcher;
import io.gitlab.jfronny.resclone.processors.PackProcessor; import io.gitlab.jfronny.resclone.processors.PackProcessor;
import io.gitlab.jfronny.resclone.processors.RemoveEmptyProcessor; import io.gitlab.jfronny.resclone.processors.RemoveEmptyProcessor;
import io.gitlab.jfronny.resclone.processors.RootPathProcessor; import io.gitlab.jfronny.resclone.processors.RootPathProcessor;
import io.gitlab.jfronny.resclone.util.PackUrlCache;
import io.gitlab.jfronny.resclone.util.Result; import io.gitlab.jfronny.resclone.util.Result;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
@ -22,6 +23,9 @@ import java.nio.file.FileSystems;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Resclone implements ModInitializer, RescloneApi { public class Resclone implements ModInitializer, RescloneApi {
@ -84,19 +88,35 @@ public class Resclone implements ModInitializer, RescloneApi {
@Override @Override
public void reload() { public void reload() {
//Get paths from patchers. Downloading is implemented in PackFetcher to allow for unconsidered sources
Set<PackMetaLoaded> metas = new LinkedHashSet<>(); Set<PackMetaLoaded> metas = new LinkedHashSet<>();
//Download try {
for (PackMetaUnloaded s : conf) { ExecutorService pool = Executors.newFixedThreadPool(conf.size());
for (PackMetaUnloaded s : conf) {
pool.submit(generateTask(s, metas));
}
pool.shutdown();
if (!pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS)) {
LOGGER.error("Download timed out. This shouldn't be possible");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
urlCache.save();
downloadedPacks.clear();
downloadedPacks.addAll(metas);
}
private Runnable generateTask(PackMetaUnloaded meta, Set<PackMetaLoaded> metas) {
return () -> {
try { try {
if (!fetcherInstances.containsKey(s.fetcher)) if (!fetcherInstances.containsKey(meta.fetcher))
throw new Exception("Invalid fetcher: " + s.fetcher); throw new Exception("Invalid fetcher: " + meta.fetcher);
Path cacheDir = getConfigPath().resolve("cache"); Path cacheDir = getConfigPath().resolve("cache");
PackMetaLoaded p; PackMetaLoaded p;
try { try {
//Download //Download
Result fr = fetcherInstances.get(s.fetcher).get(s.source, cacheDir, s.forceDownload); Result fr = fetcherInstances.get(meta.fetcher).get(meta.source, cacheDir, meta.forceDownload);
p = new PackMetaLoaded(fr.downloadPath, s.name); p = new PackMetaLoaded(fr.downloadPath, meta.name);
metas.add(p); metas.add(p);
if (fr.freshDownload) { if (fr.freshDownload) {
//Process //Process
@ -116,14 +136,9 @@ public class Resclone implements ModInitializer, RescloneApi {
throw new Exception("Failed to download pack", e); throw new Exception("Failed to download pack", e);
} }
} catch (Throwable e) { } catch (Throwable e) {
System.err.println("Encountered issue while preparing " + s.name); LOGGER.error("Encountered issue while preparing " + meta.name, e);
e.printStackTrace();
} }
} };
//Set variable
urlCache.save();
downloadedPacks.clear();
downloadedPacks.addAll(metas);
} }
@Override @Override

View File

@ -1,5 +1,6 @@
package io.gitlab.jfronny.resclone.fetchers; package io.gitlab.jfronny.resclone.fetchers;
import io.gitlab.jfronny.resclone.Resclone;
import io.gitlab.jfronny.resclone.data.CfAddon; import io.gitlab.jfronny.resclone.data.CfAddon;
import io.gitlab.jfronny.resclone.util.UrlUtils; import io.gitlab.jfronny.resclone.util.UrlUtils;
import net.minecraft.MinecraftVersion; import net.minecraft.MinecraftVersion;
@ -40,7 +41,7 @@ public class CurseforgeFetcher extends PackFetcher {
} }
if (!foundMatchingVersion) if (!foundMatchingVersion)
System.err.println("Could not find pack for matching version, using latest"); Resclone.LOGGER.error("Could not find pack for matching version, using latest");
return latest.downloadUrl; return latest.downloadUrl;
} catch (Throwable e) { } catch (Throwable e) {
throw new Exception("Could not get CF download for " + baseUrl, e); throw new Exception("Could not get CF download for " + baseUrl, e);

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.resclone.processors; package io.gitlab.jfronny.resclone.processors;
import io.gitlab.jfronny.resclone.io.PathPruneVisitor; import io.gitlab.jfronny.resclone.util.io.PathPruneVisitor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.resclone.processors; package io.gitlab.jfronny.resclone.processors;
import io.gitlab.jfronny.resclone.io.PathPruneVisitor; import io.gitlab.jfronny.resclone.util.io.PathPruneVisitor;
import java.io.IOException; import java.io.IOException;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.resclone.processors; package io.gitlab.jfronny.resclone.processors;
import io.gitlab.jfronny.resclone.io.MoveDirVisitor; import io.gitlab.jfronny.resclone.util.io.MoveDirVisitor;
import java.io.IOException; import java.io.IOException;
import java.nio.file.*; import java.nio.file.*;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.resclone; package io.gitlab.jfronny.resclone.util;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.resclone.io; package io.gitlab.jfronny.resclone.util.io;
import java.io.IOException; import java.io.IOException;
import java.nio.file.*; import java.nio.file.*;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.resclone.io; package io.gitlab.jfronny.resclone.util.io;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.resclone.io; package io.gitlab.jfronny.resclone.util.io;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;