From b0c7532715173f179ecda01889c5c49b2be025b7 Mon Sep 17 00:00:00 2001 From: tkrmagid Date: Mon, 18 May 2026 19:07:21 +0900 Subject: [PATCH] v0.4.29: delete promoted cache file on first epoch-mismatch in publishIfNotCancelled If wipeOnShutdown runs between download's pre-move epoch check and the atomic Files.move, the wipe's directory scan misses the just-promoted final file. The first epoch-mismatch branch in publishIfNotCancelled was returning without deleting, leaking the file across sessions. Delete on the first branch too. --- gradle.properties | 2 +- .../ejclaw/videoplayer/client/playback/VideoCache.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index cc2ea9a..0a5f506 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.configuration-cache=false # Mod mod_id=video_player -mod_version=0.4.28 +mod_version=0.4.29 maven_group=com.ejclaw.videoplayer archives_base_name=video_player diff --git a/src/main/java/com/ejclaw/videoplayer/client/playback/VideoCache.java b/src/main/java/com/ejclaw/videoplayer/client/playback/VideoCache.java index 40662aa..2283913 100644 --- a/src/main/java/com/ejclaw/videoplayer/client/playback/VideoCache.java +++ b/src/main/java/com/ejclaw/videoplayer/client/playback/VideoCache.java @@ -284,7 +284,13 @@ public final class VideoCache { * caller's work was cancelled and {@code path} has been cleaned up. */ private static boolean publishIfNotCancelled(String url, Path path, long startEpoch) { - if (CACHE_EPOCH.get() != startEpoch) return false; + // If the wipe ran between download's pre-move epoch check and Files.move, its + // directory scan won't have seen this just-promoted file. We must delete it here, + // not just bail — otherwise the freshly-moved final file leaks across shutdown. + if (CACHE_EPOCH.get() != startEpoch) { + try { Files.deleteIfExists(path); } catch (Throwable ignored) {} + return false; + } READY.put(url, path); if (CACHE_EPOCH.get() != startEpoch) { READY.remove(url, path);