Bounded hydrology diagnostics

- Cold-query log suppression retains a bounded window of tile keys
- Hydrology closure releases cold-query diagnostic history
This commit is contained in:
Brian Neumann-Fopiano committed 2026-09-06 03:22:07 -04:00
1 parent 20b9b3dce3
commit b7e7f64bcf
1 file changed
+7 -3
@@ -58,6 +58,8 @@ import art.arcane.iris.util.common.data.DataProvider;
import art.arcane.iris.util.common.parallel.MultiBurst; import art.arcane.iris.util.common.parallel.MultiBurst;
import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.iris.util.project.stream.ProceduralStream;
import art.arcane.volmlib.util.math.RNG; import art.arcane.volmlib.util.math.RNG;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -70,7 +72,6 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.IntConsumer; import java.util.function.IntConsumer;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -96,7 +97,9 @@ public final class IrisHydrologyRuntime implements AutoCloseable {
private final Set<String> profileKeys; private final Set<String> profileKeys;
private final String defaultProfileKey; private final String defaultProfileKey;
private final Object terrainSampleLock; private final Object terrainSampleLock;
private final Set<HydrologyTileKey> unplannedQueries = ConcurrentHashMap.newKeySet(); private final Cache<HydrologyTileKey, Boolean> unplannedQueries = Caffeine.newBuilder()
.maximumSize(MAXIMUM_CACHE_TILES)
.build();
private final LinkedHashMap<Long, HydrologyTerrainSample> terrainSamples; private final LinkedHashMap<Long, HydrologyTerrainSample> terrainSamples;
public IrisHydrologyRuntime(IrisHydrologyRuntimeContext context) { public IrisHydrologyRuntime(IrisHydrologyRuntimeContext context) {
@@ -156,7 +159,7 @@ public final class IrisHydrologyRuntime implements AutoCloseable {
if (!planned) { if (!planned) {
int tileSize = settings.routing().tileSize(); int tileSize = settings.routing().tileSize();
HydrologyTileKey key = new HydrologyTileKey(Math.floorDiv(blockX, tileSize), Math.floorDiv(blockZ, tileSize)); HydrologyTileKey key = new HydrologyTileKey(Math.floorDiv(blockX, tileSize), Math.floorDiv(blockZ, tileSize));
if (unplannedQueries.add(key)) { if (unplannedQueries.asMap().putIfAbsent(key, Boolean.TRUE) == null) {
IrisLogging.debug("Hydrology tile %d,%d queried before it was planned; natural terrain answers until the plan lands", IrisLogging.debug("Hydrology tile %d,%d queried before it was planned; natural terrain answers until the plan lands",
key.tileX(), key.tileZ()); key.tileX(), key.tileZ());
} }
@@ -479,6 +482,7 @@ public final class IrisHydrologyRuntime implements AutoCloseable {
@Override @Override
public void close() { public void close() {
cache.close(); cache.close();
unplannedQueries.invalidateAll();
routingTerrainSampler.close(); routingTerrainSampler.close();
synchronized (terrainSampleLock) { synchronized (terrainSampleLock) {
terrainSamples.clear(); terrainSamples.clear();