From 6a76321f208da2e1968ca44f775925ce5c580643 Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Wed, 3 Jul 2019 18:57:49 +0300 Subject: [PATCH] =?UTF-8?q?[FIX]=20=D0=9C=D0=BE=D0=B4=D0=B5=D1=80=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B0=D0=BB=D0=B3=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D0=BC=D0=B0:=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BE=D0=B1=D1=8A=D1=91=D0=BC=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB-=D0=B2=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launchserver/LaunchServer.java | 3 +- .../launcher/downloader/UpdateData.java | 37 +++++++++++++++++++ .../request/update/UpdateRequest.java | 5 ++- .../pro/gravit/utils/helper/IOHelper.java | 2 +- 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java index 9d6400de..5a4fb7c5 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java @@ -37,6 +37,7 @@ import pro.gravit.launcher.Launcher; import pro.gravit.launcher.LauncherConfig; import pro.gravit.launcher.NeedGarbageCollection; +import pro.gravit.launcher.downloader.UpdateData; import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedEntry; import pro.gravit.launcher.hwid.HWIDProvider; @@ -915,7 +916,7 @@ public void syncUpdatesDir(Collection dirs) throws IOException { private void processUpdate(Path updateDir, HashedDir updateHDir, String name) throws IOException { updateHDir.walk(IOHelper.CROSS_SEPARATOR, (path, filename, entry) -> { if (entry.getType().equals(HashedEntry.Type.DIR)) { - if (entry.size() < IOHelper.MB16) { + if (UpdateData.needsZip((HashedDir) entry)) { Path p = updateDir.resolve(path); Path out = optimizedUpdatesDir.resolve(name).resolve(path); try (ZipOutputStream compressed = new ZipOutputStream(IOHelper.newOutput(out))) { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java new file mode 100644 index 00000000..227ad017 --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java @@ -0,0 +1,37 @@ +package pro.gravit.launcher.downloader; + +import java.io.IOError; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import pro.gravit.launcher.hasher.HashedDir; +import pro.gravit.launcher.hasher.HashedEntry; +import pro.gravit.utils.helper.IOHelper; + +public final class UpdateData { + public static final int COUNT_LIMIT = 4; + public static final long AVG_LIMIT = IOHelper.MB*4; + public static final long TOTAL_LIMIT = IOHelper.MB*16; + + private UpdateData() { + } + + public static boolean needsZip(HashedDir hDir) { + AtomicLong size = new AtomicLong(); + AtomicInteger cnt = new AtomicInteger(); + try { + hDir.walk(IOHelper.CROSS_SEPARATOR, (p,n,e) -> { + if (e.getType().equals(HashedEntry.Type.FILE)) { + cnt.incrementAndGet(); + size.addAndGet(e.size()); + } + return HashedDir.WalkAction.CONTINUE; + }); + } catch (IOException e) { + throw new IOError(e); // never happen + } + long avg = size.get()/(long)cnt.get(); + return size.get() < TOTAL_LIMIT && avg < AVG_LIMIT && cnt.get() > COUNT_LIMIT; + } +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java index 271af850..dc42f82c 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java @@ -11,11 +11,14 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.StringTokenizer; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import pro.gravit.launcher.Launcher; import pro.gravit.launcher.LauncherAPI; import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.downloader.ListDownloader; +import pro.gravit.launcher.downloader.UpdateData; import pro.gravit.launcher.events.request.UpdateRequestEvent; import pro.gravit.launcher.hasher.FileNameMatcher; import pro.gravit.launcher.hasher.HashedDir; @@ -212,7 +215,7 @@ public UpdateRequestEvent requestDo(StandartClientWebSocketService service) thro } catch (IOException ex) { LogHelper.error(ex); } - if (getPathed(name, e.hdir).size() < IOHelper.MB16) { + if (UpdateData.needsZip((HashedDir)getPathed(name, e.hdir))) { adds.add(new ListDownloader.DownloadTask(path, -1, true)); return HashedDir.WalkAction.SKIP_DIR; } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java index 7fbe891b..b8c794a6 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java @@ -62,7 +62,7 @@ import pro.gravit.launcher.LauncherAPI; public final class IOHelper { - public static final long MB16 = 1 << 24; + public static final long MB = 1 << 20; private static final class DeleteDirVisitor extends SimpleFileVisitor { private final Path dir; private final boolean self;