[FIX] Модернизация алгоритма: проверка среднего объёма и кол-ва файлов.

This commit is contained in:
Zaxar163 2019-07-03 18:57:49 +03:00
parent 394e1ae670
commit 6a76321f20
4 changed files with 44 additions and 3 deletions

View file

@ -37,6 +37,7 @@
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherConfig; import pro.gravit.launcher.LauncherConfig;
import pro.gravit.launcher.NeedGarbageCollection; import pro.gravit.launcher.NeedGarbageCollection;
import pro.gravit.launcher.downloader.UpdateData;
import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedDir;
import pro.gravit.launcher.hasher.HashedEntry; import pro.gravit.launcher.hasher.HashedEntry;
import pro.gravit.launcher.hwid.HWIDProvider; import pro.gravit.launcher.hwid.HWIDProvider;
@ -915,7 +916,7 @@ public void syncUpdatesDir(Collection<String> dirs) throws IOException {
private void processUpdate(Path updateDir, HashedDir updateHDir, String name) throws IOException { private void processUpdate(Path updateDir, HashedDir updateHDir, String name) throws IOException {
updateHDir.walk(IOHelper.CROSS_SEPARATOR, (path, filename, entry) -> { updateHDir.walk(IOHelper.CROSS_SEPARATOR, (path, filename, entry) -> {
if (entry.getType().equals(HashedEntry.Type.DIR)) { if (entry.getType().equals(HashedEntry.Type.DIR)) {
if (entry.size() < IOHelper.MB16) { if (UpdateData.needsZip((HashedDir) entry)) {
Path p = updateDir.resolve(path); Path p = updateDir.resolve(path);
Path out = optimizedUpdatesDir.resolve(name).resolve(path); Path out = optimizedUpdatesDir.resolve(name).resolve(path);
try (ZipOutputStream compressed = new ZipOutputStream(IOHelper.newOutput(out))) { try (ZipOutputStream compressed = new ZipOutputStream(IOHelper.newOutput(out))) {

View file

@ -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;
}
}

View file

@ -11,11 +11,14 @@
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Objects; import java.util.Objects;
import java.util.StringTokenizer; 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.Launcher;
import pro.gravit.launcher.LauncherAPI; import pro.gravit.launcher.LauncherAPI;
import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.LauncherNetworkAPI;
import pro.gravit.launcher.downloader.ListDownloader; import pro.gravit.launcher.downloader.ListDownloader;
import pro.gravit.launcher.downloader.UpdateData;
import pro.gravit.launcher.events.request.UpdateRequestEvent; import pro.gravit.launcher.events.request.UpdateRequestEvent;
import pro.gravit.launcher.hasher.FileNameMatcher; import pro.gravit.launcher.hasher.FileNameMatcher;
import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedDir;
@ -212,7 +215,7 @@ public UpdateRequestEvent requestDo(StandartClientWebSocketService service) thro
} catch (IOException ex) { } catch (IOException ex) {
LogHelper.error(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)); adds.add(new ListDownloader.DownloadTask(path, -1, true));
return HashedDir.WalkAction.SKIP_DIR; return HashedDir.WalkAction.SKIP_DIR;
} }

View file

@ -62,7 +62,7 @@
import pro.gravit.launcher.LauncherAPI; import pro.gravit.launcher.LauncherAPI;
public final class IOHelper { 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<Path> { private static final class DeleteDirVisitor extends SimpleFileVisitor<Path> {
private final Path dir; private final Path dir;
private final boolean self; private final boolean self;