mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-10-26 22:10:18 +00:00
Maintenance after evacuation
- Mantle-bypass maintenance starts only after players leave the world - This covers studio close, studio disable, world remove, world unload and create rollback - Maintenance ends only when it was entered - Folia no longer treats a refused chunk requested during evacuation as a chunk system crash
This commit is contained in:
1 parent
f55fde17d4
commit
b1fbede364
7 files changed
+102
-23
No files matched your search
+33
-5
@@ -24,12 +24,13 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
|
||||
StudioOpenCoordinator.sequenceStudioClose(
|
||||
() -> phase(phases, "evacuate"),
|
||||
() -> phases.add("maintenance"),
|
||||
() -> phase(phases, "unload"),
|
||||
() -> phase(phases, "close-generator"),
|
||||
() -> phase(phases, "delete-folders")
|
||||
).join();
|
||||
|
||||
assertEquals(List.of("evacuate", "unload", "close-generator", "delete-folders"), phases);
|
||||
assertEquals(List.of("evacuate", "maintenance", "unload", "close-generator", "delete-folders"), phases);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -40,6 +41,7 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
try {
|
||||
StudioOpenCoordinator.sequenceStudioClose(
|
||||
() -> phase(phases, "evacuate"),
|
||||
() -> phases.add("maintenance"),
|
||||
() -> {
|
||||
phases.add("unload");
|
||||
return CompletableFuture.failedFuture(failure);
|
||||
@@ -52,7 +54,31 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
assertSame(failure, exception.getCause());
|
||||
}
|
||||
|
||||
assertEquals(List.of("evacuate", "unload"), phases);
|
||||
assertEquals(List.of("evacuate", "maintenance", "unload"), phases);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void evacuationFailureNeverEntersMaintenance() {
|
||||
ArrayList<String> phases = new ArrayList<>();
|
||||
IllegalStateException failure = new IllegalStateException("evacuation failed");
|
||||
|
||||
try {
|
||||
StudioOpenCoordinator.sequenceStudioClose(
|
||||
() -> {
|
||||
phases.add("evacuate");
|
||||
return CompletableFuture.failedFuture(failure);
|
||||
},
|
||||
() -> phases.add("maintenance"),
|
||||
() -> phase(phases, "unload"),
|
||||
() -> phase(phases, "close-generator"),
|
||||
() -> phase(phases, "delete-folders")
|
||||
).join();
|
||||
fail("Expected evacuation failure");
|
||||
} catch (CompletionException exception) {
|
||||
assertSame(failure, exception.getCause());
|
||||
}
|
||||
|
||||
assertEquals(List.of("evacuate"), phases);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -63,6 +89,7 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
try {
|
||||
StudioOpenCoordinator.sequenceStudioClose(
|
||||
() -> phase(phases, "evacuate"),
|
||||
() -> phases.add("maintenance"),
|
||||
() -> phase(phases, "unload"),
|
||||
() -> {
|
||||
phases.add("close-generator");
|
||||
@@ -75,7 +102,7 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
assertSame(failure, exception.getCause());
|
||||
}
|
||||
|
||||
assertEquals(List.of("evacuate", "unload", "close-generator"), phases);
|
||||
assertEquals(List.of("evacuate", "maintenance", "unload", "close-generator"), phases);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -87,6 +114,7 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
MockedStatic<IrisLogging> logging = mockStatic(IrisLogging.class)) {
|
||||
CompletableFuture<Void> close = StudioOpenCoordinator.sequenceStudioClose(
|
||||
() -> phase(phases, "evacuate"),
|
||||
() -> phases.add("maintenance"),
|
||||
() -> {
|
||||
phases.add("unload");
|
||||
return unload;
|
||||
@@ -98,13 +126,13 @@ public class StudioOpenCoordinatorCloseSequenceTest {
|
||||
warning.get().run();
|
||||
assertFalse(close.isDone());
|
||||
assertFalse(unload.isDone());
|
||||
assertEquals(List.of("evacuate", "unload"), phases);
|
||||
assertEquals(List.of("evacuate", "maintenance", "unload"), phases);
|
||||
configurator.verifyNoInteractions();
|
||||
|
||||
unload.complete(null);
|
||||
close.join();
|
||||
|
||||
assertEquals(List.of("evacuate", "unload", "close-generator", "delete-folders"), phases);
|
||||
assertEquals(List.of("evacuate", "maintenance", "unload", "close-generator", "delete-folders"), phases);
|
||||
configurator.verifyNoInteractions();
|
||||
}
|
||||
}
|
||||
|
||||
+15
-1
@@ -67,12 +67,26 @@ public class IrisWorldRemovalServiceTest {
|
||||
assertTrue(result.succeeded());
|
||||
assertTrue(result.registryChanged());
|
||||
assertEquals(
|
||||
List.of("resolve", "begin", "evacuate", "unload", "close", "unregister", "unregisterRegistry", "end"),
|
||||
List.of("resolve", "evacuate", "begin", "unload", "close", "unregister", "unregisterRegistry", "end"),
|
||||
backend.operations
|
||||
);
|
||||
assertTrue(coordinator.isIdle());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mantleBypassMaintenanceStartsOnlyAfterPlayersLeave() throws Exception {
|
||||
LifecycleOperationCoordinator coordinator = new LifecycleOperationCoordinator();
|
||||
FakeBackend backend = new FakeBackend(target("evacuation-failed"));
|
||||
backend.evacuation = CompletableFuture.failedFuture(new IllegalStateException("no destination world"));
|
||||
IrisWorldRemovalService service = new IrisWorldRemovalService(coordinator, backend);
|
||||
|
||||
IrisWorldRemovalService.RemovalResult result = service.remove("evacuation-failed", true).join();
|
||||
|
||||
assertEquals(IrisWorldRemovalService.RemovalStatus.TELEPORT_FAILED, result.status());
|
||||
assertEquals(List.of("resolve", "evacuate"), backend.operations);
|
||||
assertTrue(coordinator.isIdle());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void configurationFailureStopsBeforeDeletionAndRetainsCause() throws Exception {
|
||||
LifecycleOperationCoordinator coordinator = new LifecycleOperationCoordinator();
|
||||
|
||||
Reference in new issue
Block a user