From ce7872f667f9966bc3e2f1575be302d1181de960 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Thu, 8 Oct 2026 13:14:35 -0400 Subject: [PATCH] Removing scheduler - not needed --- .../integration/IrisIntegrationService.java | 30 +++++++++++- .../IrisIntegrationServiceTest.java | 47 +++++++++++++++++++ core/build.gradle | 1 - 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/adapters/bukkit/plugin/src/main/java/art/arcane/iris/integration/IrisIntegrationService.java b/adapters/bukkit/plugin/src/main/java/art/arcane/iris/integration/IrisIntegrationService.java index e78bbb780..fb8877a8f 100644 --- a/adapters/bukkit/plugin/src/main/java/art/arcane/iris/integration/IrisIntegrationService.java +++ b/adapters/bukkit/plugin/src/main/java/art/arcane/iris/integration/IrisIntegrationService.java @@ -6,6 +6,7 @@ import art.arcane.iris.generation.runtime.IrisTelemetrySnapshot; import art.arcane.iris.Iris; import art.arcane.iris.generation.runtime.EngineTelemetrySnapshot; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.world.task.J; import art.arcane.iris.platform.bukkit.plugin.IrisService; import art.arcane.volmlib.integration.IntegrationHandshakeRequest; import art.arcane.volmlib.integration.IntegrationHandshakeResponse; @@ -13,6 +14,9 @@ import art.arcane.volmlib.integration.IntegrationHeartbeat; import art.arcane.volmlib.integration.IntegrationMetricDescriptor; import art.arcane.volmlib.integration.IntegrationMetricGroup; import art.arcane.volmlib.integration.IntegrationMetricSample; +import art.arcane.volmlib.integration.IntegrationMetricPublisher; +import art.arcane.volmlib.integration.IntegrationMetricSnapshot; +import art.arcane.volmlib.integration.IntegrationSnapshotProvider; import art.arcane.volmlib.integration.IntegrationMetricSchema; import art.arcane.volmlib.integration.IntegrationProtocolNegotiator; import art.arcane.volmlib.integration.IntegrationProtocolVersion; @@ -30,7 +34,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Supplier; -public class IrisIntegrationService implements IrisService, IntegrationServiceContract { +public class IrisIntegrationService implements IrisService, IntegrationSnapshotProvider { private static final IntegrationProtocolVersion CURRENT_PROTOCOL = new IntegrationProtocolVersion(1, 2); private static final Set SUPPORTED_PROTOCOLS = Set.of( new IntegrationProtocolVersion(1, 0), @@ -41,6 +45,7 @@ public class IrisIntegrationService implements IrisService, IntegrationServiceCo "handshake", "heartbeat", "metrics", + IntegrationSnapshotProvider.CAPABILITY, "metric-groups", "iris-engine-metrics", "iris-world-metrics" @@ -63,6 +68,9 @@ public class IrisIntegrationService implements IrisService, IntegrationServiceCo ); private final Supplier telemetrySupplier; + private final IntegrationMetricPublisher snapshots = new IntegrationMetricPublisher( + IntegrationMetricSchema.irisKeys().size(), 30_000L); + private int snapshotTaskId = -1; public IrisIntegrationService() { this(IrisIntegrationService::currentTelemetry); @@ -77,11 +85,17 @@ public class IrisIntegrationService implements IrisService, IntegrationServiceCo @Override public void onEnable() { Bukkit.getServicesManager().register(IntegrationServiceContract.class, this, Iris.instance, ServicePriority.Normal); + snapshotTaskId = J.ar(this::publishSnapshots, 20); Iris.verbose("Integration provider registered for Iris"); } @Override public void onDisable() { + if (snapshotTaskId != -1) { + J.car(snapshotTaskId); + snapshotTaskId = -1; + } + snapshots.clear(); Bukkit.getServicesManager().unregister(IntegrationServiceContract.class, this); } @@ -188,6 +202,20 @@ public class IrisIntegrationService implements IrisService, IntegrationServiceCo return Map.copyOf(selected); } + @Override + public IntegrationMetricSnapshot snapshotMetrics(Set metricKeys) { + return snapshots.snapshotMetrics(metricKeys, System.currentTimeMillis()); + } + + void publishSnapshots() { + IntegrationMetricPublisher.Demand demand = snapshots.demandedKeys(System.currentTimeMillis()); + if (demand.keys().isEmpty()) { + return; + } + Map samples = sampleMetrics(demand.keys()); + snapshots.publish(demand, System.currentTimeMillis(), samples); + } + @Override public List metricGroups() { IrisTelemetrySnapshot snapshot = safeSnapshot(); diff --git a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/integration/IrisIntegrationServiceTest.java b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/integration/IrisIntegrationServiceTest.java index a0717ce4c..0be5b8b7a 100644 --- a/adapters/bukkit/plugin/src/test/java/art/arcane/iris/integration/IrisIntegrationServiceTest.java +++ b/adapters/bukkit/plugin/src/test/java/art/arcane/iris/integration/IrisIntegrationServiceTest.java @@ -5,19 +5,66 @@ import art.arcane.iris.generation.runtime.IrisTelemetrySnapshot; import art.arcane.iris.generation.runtime.EngineTelemetrySnapshot; import art.arcane.volmlib.integration.IntegrationMetricGroup; import art.arcane.volmlib.integration.IntegrationMetricSample; +import art.arcane.volmlib.integration.IntegrationMetricSnapshot; +import art.arcane.volmlib.integration.IntegrationSnapshotProvider; import art.arcane.volmlib.integration.IntegrationMetricSchema; import org.junit.Test; +import org.bukkit.Bukkit; +import org.bukkit.plugin.ServicesManager; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class IrisIntegrationServiceTest { + @Test + public void disableClearsPublishedSnapshots() { + IrisIntegrationService service = new IrisIntegrationService(() -> IrisTelemetrySnapshot.EMPTY); + Set keys = Set.of(IntegrationMetricSchema.IRIS_WORLD_COUNT); + service.snapshotMetrics(keys); + service.publishSnapshots(); + long generation = service.snapshotMetrics(keys).generation(); + try (MockedStatic bukkit = Mockito.mockStatic(Bukkit.class)) { + bukkit.when(Bukkit::getServicesManager).thenReturn(Mockito.mock(ServicesManager.class)); + service.onDisable(); + } + assertTrue(service.snapshotMetrics(keys).samples().isEmpty()); + assertTrue(service.snapshotMetrics(keys).generation() > generation); + } + + @Test + public void snapshotRequestsDoNotCollectAndKeepOriginalTelemetryTime() { + long sampledAt = System.currentTimeMillis() - 5_000L; + IrisTelemetrySnapshot source = telemetry(List.of(), IrisTelemetrySnapshot.PregenSnapshot.INACTIVE, sampledAt); + AtomicInteger reads = new AtomicInteger(); + IrisIntegrationService service = new IrisIntegrationService(() -> { + reads.incrementAndGet(); + return source; + }); + Set keys = Set.of(IntegrationMetricSchema.IRIS_WORLD_COUNT); + assertTrue(service.capabilities().contains(IntegrationSnapshotProvider.CAPABILITY)); + service.publishSnapshots(); + assertEquals(0, reads.get()); + assertTrue(service.snapshotMetrics(keys).samples().isEmpty()); + assertEquals(0, reads.get()); + + service.publishSnapshots(); + IntegrationMetricSnapshot publication = service.snapshotMetrics(keys); + assertEquals(1, reads.get()); + assertEquals(sampledAt, publication.samples().get(IntegrationMetricSchema.IRIS_WORLD_COUNT).sampledAtMs()); + assertTrue(publication.capturedAtMs() >= sampledAt); + assertEquals(publication, service.snapshotMetrics(keys)); + assertEquals(1, reads.get()); + } + @Test public void unavailableTelemetryDoesNotPublishFalseZeroes() { IrisIntegrationService service = new IrisIntegrationService(() -> IrisTelemetrySnapshot.EMPTY); diff --git a/core/build.gradle b/core/build.gradle index dc649addd..412e263e3 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -311,7 +311,6 @@ List unusedVolmLibClasses = [ 'art/arcane/volmlib/util/hud/HudTitleService', 'art/arcane/volmlib/util/scheduling/GroupedExecutor', 'art/arcane/volmlib/util/scheduling/SchedulerRuntime', - 'art/arcane/volmlib/util/scheduling/SchedulerUtils', 'art/arcane/volmlib/util/scheduling/TaskExecutor', 'art/arcane/volmlib/util/parallel/StreamUtilsSupport', 'art/arcane/volmlib/util/parallel/SyncExecutorSupport',