Skip to content

Fix three cache-consistency bugs in PipeManager#1

Merged
xiaozhangup merged 2 commits into
mainfrom
copilot/check-cache-mechanism
Mar 3, 2026
Merged

Fix three cache-consistency bugs in PipeManager#1
xiaozhangup merged 2 commits into
mainfrom
copilot/check-cache-mechanism

Conversation

Copy link
Copy Markdown

Copilot AI commented Mar 2, 2026

PipeManager maintains six auxiliary maps alongside pipes (lastTransferTime, sleepUntil, nullDestRecheckUntil, dirtyPaths, pathCache, chainMembership). Three code paths failed to keep all of them in sync.

Bug 1 — unloadPipesInChunk leaks sleep/recheck state

sleepUntil and nullDestRecheckUntil were not cleared on chunk unload. After reload, scanChunk re-registers the pipes but the stale timers survive, so a pipe that was sleeping when the chunk unloaded continues sleeping — silently delaying transfers until the timer expires.

// before
lastTransferTime.remove(loc);
dirtyPaths.remove(loc);

// after
lastTransferTime.remove(loc);
sleepUntil.remove(loc);           // ← added
nullDestRecheckUntil.remove(loc); // ← added
dirtyPaths.remove(loc);

Bug 2 — transferAllPipes incomplete teardown for vanished-block pipes

When transferItems detected a missing pipe block (returns true), cleanup was toRemove.forEach(pipes::remove) — only pipes was touched. lastTransferTime, sleepUntil, nullDestRecheckUntil, dirtyPaths, chainMembership, and the orphaned ItemDisplay entities were all left behind.

Fixed by replacing the bare remove with unregisterPipe(loc), which already performs the full teardown.

Bug 3 — convertPipeVariant inconsistent cache eviction

Single-pipe variant conversions (cauldron, wax, etc.) used a hand-rolled pathCache.entrySet().removeIf(...), which only touched pathCache directly. chainMembership (the reverse index) and nullDestRecheckUntil entries for the removed paths were never cleared — diverging from the invariants evictCacheByMember maintains. Batch oxidation (tickOxidation) already called evictCacheByMember correctly; convertPipeVariant was the outlier.

// before
pathCache.entrySet().removeIf(e -> e.getValue().pipeChain().contains(normalized));

// after
evictCacheByMember(normalized);

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • repo.papermc.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 (dns block)
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 (dns block)

If you need me to access, download, or install something from one of these locations, you can either:


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Co-authored-by: xiaozhangup <68374769+xiaozhangup@users.noreply.github.com>
Copilot AI changed the title [WIP] Check and fix cache mechanism issues in plugin Fix three cache-consistency bugs in PipeManager Mar 2, 2026
@xiaozhangup xiaozhangup marked this pull request as ready for review March 3, 2026 06:36
@xiaozhangup xiaozhangup merged commit cef2bda into main Mar 3, 2026
@xiaozhangup xiaozhangup deleted the copilot/check-cache-mechanism branch March 3, 2026 06:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants