3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-11-20 06:50:09 +01:00

start: don't try to delete broken packs while we are still delivering them

Dieser Commit ist enthalten in:
onebeastchris 2024-02-19 21:26:35 +01:00
Ursprung a4fa2e611c
Commit b8fa18a155
4 geänderte Dateien mit 18 neuen und 16 gelöschten Zeilen

Datei anzeigen

@ -77,16 +77,15 @@ import java.nio.channels.SeekableByteChannel;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Deque; import java.util.Deque;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.Map;
import java.util.OptionalInt; import java.util.OptionalInt;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
public class UpstreamPacketHandler extends LoggingPacketHandler { public class UpstreamPacketHandler extends LoggingPacketHandler {
private boolean networkSettingsRequested = false; private boolean networkSettingsRequested = false;
private final Deque<String> packsToSent = new ArrayDeque<>(); private final Deque<String> packsToSent = new ArrayDeque<>();
private final Set<UUID> brokenResourcePacks = new HashSet<>(); private final Map<UUID, String> brokenResourcePacks = new HashMap<>();
private final CompressionStrategy compressionStrategy; private final CompressionStrategy compressionStrategy;
private SessionLoadResourcePacksEventImpl resourcePackLoadEvent; private SessionLoadResourcePacksEventImpl resourcePackLoadEvent;
@ -315,8 +314,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
// If a remote pack ends up here, that usually implies that a platform was not able to download the pack // If a remote pack ends up here, that usually implies that a platform was not able to download the pack
if (codec instanceof UrlPackCodec urlPackCodec) { if (codec instanceof UrlPackCodec urlPackCodec) {
// Ensure we don't a. spam console, and b. spam download/check requests // Ensure we don't a. spam console, and b. spam download/check requests
if (!brokenResourcePacks.contains(packet.getPackId())) { if (!brokenResourcePacks.containsKey(packet.getPackId())) {
brokenResourcePacks.add(packet.getPackId()); brokenResourcePacks.put(packet.getPackId(), "");
GeyserImpl.getInstance().getLogger().warning("Received a request for a remote pack that the client should have already downloaded! " + GeyserImpl.getInstance().getLogger().warning("Received a request for a remote pack that the client should have already downloaded! " +
"Is the pack at the URL " + urlPackCodec.url() + " still available?"); "Is the pack at the URL " + urlPackCodec.url() + " still available?");
// not actually interested in using the download, but this does all the checks we need // not actually interested in using the download, but this does all the checks we need

Datei anzeigen

@ -88,9 +88,9 @@ public class GeyserUrlPackCodec extends UrlPackCodec {
try { try {
final Path downloadedPack = ResourcePackLoader.downloadPack(url, false).whenComplete((pack, throwable) -> { final Path downloadedPack = ResourcePackLoader.downloadPack(url, false).whenComplete((pack, throwable) -> {
if (throwable != null) { if (throwable != null) {
GeyserImpl.getInstance().getLogger().error("Failed to download pack from " + url, throwable); GeyserImpl.getInstance().getLogger().error("Failed to download pack from " + url + " due to " + throwable.getMessage());
if (GeyserImpl.getInstance().getConfig().isDebugMode()) { if (GeyserImpl.getInstance().getConfig().isDebugMode()) {
throwable.printStackTrace(); GeyserImpl.getInstance().getLogger().error("full error: " + throwable);
} }
} }
}).join(); }).join();

Datei anzeigen

@ -231,8 +231,8 @@ public class ResourcePackLoader implements RegistryLoader<Path, Map<String, Reso
return packMap; return packMap;
} }
public static CompletableFuture<@Nullable Path> downloadPack(String url, boolean force) throws IllegalArgumentException { public static CompletableFuture<@Nullable Path> downloadPack(String url, boolean checking) throws IllegalArgumentException {
return WebUtils.checkUrlAndDownloadRemotePack(url, force).whenCompleteAsync((cachedPath, throwable) -> { return WebUtils.checkUrlAndDownloadRemotePack(url, checking).whenCompleteAsync((cachedPath, throwable) -> {
if (cachedPath == null) { if (cachedPath == null) {
// already warned about in WebUtils // already warned about in WebUtils
return; return;
@ -257,9 +257,9 @@ public class ResourcePackLoader implements RegistryLoader<Path, Map<String, Reso
// Check if a "manifest.json" or "pack_manifest.json" file is located directly in the zip... does not work otherwise. // Check if a "manifest.json" or "pack_manifest.json" file is located directly in the zip... does not work otherwise.
// (something like MyZip.zip/manifest.json) will not, but will if it's a subfolder (MyPack.zip/MyPack/manifest.json) // (something like MyZip.zip/manifest.json) will not, but will if it's a subfolder (MyPack.zip/MyPack/manifest.json)
if (zip.getEntry("manifest.json") != null || zip.getEntry("pack_manifest.json") != null) { if (zip.getEntry("manifest.json") != null || zip.getEntry("pack_manifest.json") != null) {
throw new IllegalArgumentException("The remote resource pack from " + url + " contains a manifest.json file at the root of the zip file. " + /*throw new IllegalArgumentException("The remote resource pack from " + url + " contains a manifest.json file at the root of the zip file. " +
"This is not supported for remote packs, and will cause Bedrock clients to fall back to request the pack from the server. " + "This is not supported for remote packs, and will cause Bedrock clients to fall back to request the pack from the server. " +
"Please put the pack file in a subfolder, and provide that zip in the URL."); "Please put the pack file in a subfolder, and provide that zip in the URL."); */
} }
} catch (IOException e) { } catch (IOException e) {
throw new IllegalArgumentException(GeyserLocale.getLocaleStringLog("geyser.resource_pack.broken", url), e); throw new IllegalArgumentException(GeyserLocale.getLocaleStringLog("geyser.resource_pack.broken", url), e);

Datei anzeigen

@ -113,7 +113,7 @@ public class WebUtils {
* If it is, it will download the pack file and return a path to it * If it is, it will download the pack file and return a path to it
* *
* @param url The URL to check * @param url The URL to check
* @param force If true, the pack will be downloaded even if it is cached * @param force If true, the pack will be downloaded even if it is cached to a separate location.
* @return Path to the downloaded pack file * @return Path to the downloaded pack file
*/ */
public static CompletableFuture<@Nullable Path> checkUrlAndDownloadRemotePack(String url, boolean force) { public static CompletableFuture<@Nullable Path> checkUrlAndDownloadRemotePack(String url, boolean force) {
@ -124,7 +124,7 @@ public class WebUtils {
con.setConnectTimeout(10000); con.setConnectTimeout(10000);
con.setReadTimeout(10000); con.setReadTimeout(10000);
con.setRequestProperty("User-Agent", "Geyser-" + GeyserImpl.getInstance().getPlatformType().platformName() + "/" + GeyserImpl.VERSION); con.setRequestProperty("User-Agent", "Geyser-" + GeyserImpl.getInstance().getPlatformType().platformName() + "/" + GeyserImpl.VERSION);
con.setInstanceFollowRedirects(false); // TODO verify con.setInstanceFollowRedirects(true);
int responseCode = con.getResponseCode(); int responseCode = con.getResponseCode();
if (responseCode >= 400) { if (responseCode >= 400) {
@ -140,11 +140,13 @@ public class WebUtils {
return null; return null;
} }
// This doesn't seem to be a requirement (anymore?) Logging to debug might be interesting though.
if (type == null || !type.equals("application/zip")) { if (type == null || !type.equals("application/zip")) {
GeyserImpl.getInstance().getLogger().error(String.format("Invalid application type from remote pack URL: %s (type: %s)", url, type)); GeyserImpl.getInstance().getLogger().debug(String.format("Application type from remote pack URL: %s (type: %s)", url, type));
return null;
} }
// TODO: add logic here to *not* delete the cached pack (and only at shutdown).
Path packLocation = REMOTE_PACK_CACHE.resolve(url.hashCode() + ".zip"); Path packLocation = REMOTE_PACK_CACHE.resolve(url.hashCode() + ".zip");
Path packMetadata = packLocation.resolveSibling(url.hashCode() + ".metadata"); Path packMetadata = packLocation.resolveSibling(url.hashCode() + ".metadata");
@ -170,7 +172,7 @@ public class WebUtils {
if (Files.size(packLocation) != size) { if (Files.size(packLocation) != size) {
GeyserImpl.getInstance().getLogger().error(String.format("Size mismatch with resource pack at url: %s. Downloaded pack has %s bytes, expected %s bytes!", url, Files.size(packLocation), size)); GeyserImpl.getInstance().getLogger().error(String.format("Size mismatch with resource pack at url: %s. Downloaded pack has %s bytes, expected %s bytes!", url, Files.size(packLocation), size));
Files.delete(packLocation); Files.delete(packLocation);
return null; //return null;
} }
try { try {
@ -179,6 +181,7 @@ public class WebUtils {
GeyserImpl.getInstance().getLogger().error("Failed to write cached pack metadata: " + e.getMessage()); GeyserImpl.getInstance().getLogger().error("Failed to write cached pack metadata: " + e.getMessage());
} }
GeyserImpl.getInstance().getLogger().info("debug: pack downloaded");
return packLocation; return packLocation;
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new IllegalArgumentException("Malformed URL: " + url); throw new IllegalArgumentException("Malformed URL: " + url);