Better rules for caching in the updater

This commit is contained in:
2026-05-19 17:05:29 -04:00
parent a7a21c89b6
commit 1b3115f094
@@ -26,10 +26,14 @@ import org.bukkit.entity.Player;
public class UpdateChecker public class UpdateChecker
{ {
private static final long PLEX_METADATA_FAILURE_CACHE_MILLIS = 5 * 60 * 1000L;
private final Plex plugin; private final Plex plugin;
private final UpdateChannel channel; private final UpdateChannel channel;
private final UpdateMetadataClient metadataClient; private final UpdateMetadataClient metadataClient;
private ArtifactMetadata latestPlexMetadata; private ArtifactMetadata latestPlexMetadata;
private UpdateMetadataClient.MetadataException latestPlexMetadataFailure;
private long latestPlexMetadataFailureAtMillis;
public UpdateChecker(Plex plugin) public UpdateChecker(Plex plugin)
{ {
@@ -115,14 +119,42 @@ public class UpdateChecker
} }
} }
private ArtifactMetadata fetchLatestPlexMetadata(boolean cached) throws UpdateMetadataClient.MetadataException private synchronized ArtifactMetadata fetchLatestPlexMetadata(boolean cached) throws UpdateMetadataClient.MetadataException
{ {
if (!cached || latestPlexMetadata == null) if (cached)
{
if (latestPlexMetadata != null)
{
return latestPlexMetadata;
}
if (latestPlexMetadataFailure != null && isPlexMetadataFailureCacheFresh())
{
throw latestPlexMetadataFailure;
}
}
try
{ {
latestPlexMetadata = metadataClient.fetchPlexLatest(BuildInfo.getMinecraftVersion()); latestPlexMetadata = metadataClient.fetchPlexLatest(BuildInfo.getMinecraftVersion());
} latestPlexMetadataFailure = null;
latestPlexMetadataFailureAtMillis = 0L;
return latestPlexMetadata; return latestPlexMetadata;
} }
catch (UpdateMetadataClient.MetadataException e)
{
if (latestPlexMetadata == null)
{
latestPlexMetadataFailure = e;
latestPlexMetadataFailureAtMillis = System.currentTimeMillis();
}
throw e;
}
}
private boolean isPlexMetadataFailureCacheFresh()
{
return System.currentTimeMillis() - latestPlexMetadataFailureAtMillis < PLEX_METADATA_FAILURE_CACHE_MILLIS;
}
private void downloadAndInstall(CommandSender sender, ArtifactMetadata metadata, File copyTo) private void downloadAndInstall(CommandSender sender, ArtifactMetadata metadata, File copyTo)
{ {