Remove daemon frame and SoA store readers

This commit is contained in:
Meta Vens 2026-06-28 05:08:36 +01:00
commit 1cf7fa0c94
4 changed files with 49 additions and 110 deletions

View file

@ -8514,8 +8514,10 @@ static void RequireDaemonVersePublication(string root)
{
var daemonDocumentsPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonDocuments.cs");
var daemonTickRunnerPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonTickRunner.cs");
var daemonFrameStorePath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonFrameStore.cs");
var daemonPublicationStorePath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonPublicationStore.cs");
var daemonSoaDocumentsPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonSoaDocuments.cs");
var daemonSoaViewStorePath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonSoaViewStore.cs");
var daemonSoaFramePublisherPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonSoaFramePublisher.cs");
var daemonStateRefsPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonStateRefs.cs");
var daemonGameSurfaceBuilderPath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonGameSurfaceBuilder.cs");
@ -8538,8 +8540,10 @@ static void RequireDaemonVersePublication(string root)
{
daemonDocumentsPath,
daemonTickRunnerPath,
daemonFrameStorePath,
daemonPublicationStorePath,
daemonSoaDocumentsPath,
daemonSoaViewStorePath,
daemonSoaFramePublisherPath,
daemonStateRefsPath,
daemonGameSurfaceBuilderPath,
@ -8571,8 +8575,10 @@ static void RequireDaemonVersePublication(string root)
var daemonDocuments = File.ReadAllText(daemonDocumentsPath);
var daemonTickRunner = File.ReadAllText(daemonTickRunnerPath);
var daemonFrameStore = File.ReadAllText(daemonFrameStorePath);
var daemonPublicationStore = File.ReadAllText(daemonPublicationStorePath);
var daemonSoaDocuments = File.ReadAllText(daemonSoaDocumentsPath);
var daemonSoaViewStore = File.ReadAllText(daemonSoaViewStorePath);
var daemonSoaFramePublisher = File.ReadAllText(daemonSoaFramePublisherPath);
var daemonStateRefs = File.ReadAllText(daemonStateRefsPath);
var daemonGameSurfaceBuilder = File.ReadAllText(daemonGameSurfaceBuilderPath);
@ -8740,6 +8746,15 @@ static void RequireDaemonVersePublication(string root)
string.Join(", ", publicationStoreReaderHits));
}
if (daemonFrameStore.Contains("TryReadFrame(", StringComparison.Ordinal) ||
daemonFrameStore.Contains("ReadFrame(", StringComparison.Ordinal) ||
daemonSoaViewStore.Contains("TryReadView(", StringComparison.Ordinal) ||
daemonSoaViewStore.Contains("ReadView(", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"Daemon frame/SoA stores still expose file-backed readers; use tick-result documents or AetheriaClient managed observation.");
}
var requiredDaemonRegistrySymbols = new[]
{
"CultMesh.CreateCultCacheDocumentRegistry(DocumentTypes)",

View file

@ -96,7 +96,7 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void FrameStorePublishesLatestDaemonFrame()
public void FrameStorePublishesLatestDaemonFrameWitness()
{
var statePath = Path.Combine(
Path.GetTempPath(),
@ -117,31 +117,17 @@ public class DaemonRuntimeDocumentTests
0.016);
var framePath = AetheriaRuntimeDaemonFrameStore.PublishFrame(statePath, frame);
var read = AetheriaRuntimeDaemonFrameStore.TryReadFrame(statePath, out var stored);
Assert.IsTrue(read);
Assert.AreEqual(AetheriaRuntimeStateBoundary.GetDaemonFramePath(statePath), framePath);
Assert.AreEqual(AetheriaRuntimeDaemonSchemas.Frame, stored.Schema);
Assert.AreEqual("aetheria-daemon", stored.DaemonId);
Assert.AreEqual("session-3", stored.SessionId);
Assert.AreEqual(123, stored.FrameId);
Assert.IsTrue(stored.IsAuthoritative);
Assert.AreEqual("daemon", stored.StateSource);
Assert.AreEqual("run-2", stored.Run.RunId);
Assert.AreEqual(7, stored.Run.CurrentZoneIndex);
Assert.AreEqual("entity:ship", stored.Run.CurrentEntityKey);
}
[Test]
public void FrameStoreReportsMissingFrame()
{
var statePath = Path.Combine(
Path.GetTempPath(),
"aetheria-daemon-frame-store-tests",
Path.GetRandomFileName(),
"missing-state.cc");
Assert.IsFalse(AetheriaRuntimeDaemonFrameStore.TryReadFrame(statePath, out _));
Assert.AreEqual(AetheriaRuntimeDaemonSchemas.Frame, frame.Schema);
Assert.AreEqual("aetheria-daemon", frame.DaemonId);
Assert.AreEqual("session-3", frame.SessionId);
Assert.AreEqual(123, frame.FrameId);
Assert.IsTrue(frame.IsAuthoritative);
Assert.AreEqual("daemon", frame.StateSource);
Assert.AreEqual("run-2", frame.Run.RunId);
Assert.AreEqual(7, frame.Run.CurrentZoneIndex);
Assert.AreEqual("entity:ship", frame.Run.CurrentEntityKey);
}
[Test]
@ -427,8 +413,8 @@ public class DaemonRuntimeDocumentTests
Assert.AreEqual("zone.0.entity.0", result.Intents.Movement.ActorEntityKey);
Assert.AreEqual(1.0, result.Intents.Movement.DirectionX, 0.0001);
Assert.AreEqual(12.5, result.Run.Zones[0].SimulationTimeSeconds, 0.0001);
Assert.IsTrue(AetheriaRuntimeDaemonFrameStore.TryReadFrame(statePath, out var frame));
Assert.AreEqual(result.FramePath, AetheriaRuntimeDaemonFrameStore.GetFramePath(statePath));
var frame = result.Frame;
Assert.AreEqual("test-daemon", frame.DaemonId);
Assert.AreEqual("session-tick", frame.SessionId);
Assert.AreEqual(42, frame.FrameId);
@ -2003,23 +1989,21 @@ public class DaemonRuntimeDocumentTests
});
var viewPath = AetheriaRuntimeDaemonSoaViewStore.PublishView(statePath, view);
var read = AetheriaRuntimeDaemonSoaViewStore.TryReadView(statePath, out var stored);
Assert.IsTrue(read);
Assert.AreEqual(AetheriaRuntimeStateBoundary.GetDaemonSoaViewPath(statePath), viewPath);
Assert.AreEqual(AetheriaRuntimeDaemonSchemas.SoaView, stored.Schema);
Assert.AreEqual("aetheria-daemon", stored.DaemonId);
Assert.AreEqual("session-soa-store", stored.SessionId);
Assert.AreEqual(123, stored.FrameId);
Assert.AreEqual(456, stored.Generation);
Assert.IsTrue(stored.IsAuthoritative);
Assert.AreEqual(1, stored.Buffers.Count);
Assert.AreEqual("entity-hot-0", stored.Buffers[0].BufferId);
Assert.IsFalse(stored.Buffers[0].ObserverWritable);
Assert.AreEqual(1, stored.Columns.Count);
Assert.AreEqual(AetheriaRuntimeDaemonSoaColumnKinds.Heat, stored.Columns[0].Kind);
Assert.AreEqual(1, stored.DirtyRanges.Count);
Assert.AreEqual(256, stored.DirtyRanges[0].Count);
Assert.AreEqual(AetheriaRuntimeDaemonSchemas.SoaView, view.Schema);
Assert.AreEqual("aetheria-daemon", view.DaemonId);
Assert.AreEqual("session-soa-store", view.SessionId);
Assert.AreEqual(123, view.FrameId);
Assert.AreEqual(456, view.Generation);
Assert.IsTrue(view.IsAuthoritative);
Assert.AreEqual(1, view.Buffers.Count);
Assert.AreEqual("entity-hot-0", view.Buffers[0].BufferId);
Assert.IsFalse(view.Buffers[0].ObserverWritable);
Assert.AreEqual(1, view.Columns.Count);
Assert.AreEqual(AetheriaRuntimeDaemonSoaColumnKinds.Heat, view.Columns[0].Kind);
Assert.AreEqual(1, view.DirtyRanges.Count);
Assert.AreEqual(256, view.DirtyRanges[0].Count);
}
[Test]
@ -2086,24 +2070,22 @@ public class DaemonRuntimeDocumentTests
0.02);
var view = AetheriaRuntimeDaemonSoaFramePublisher.PublishCurrentZoneEntities(statePath, frame);
Assert.IsTrue(AetheriaRuntimeDaemonSoaViewStore.TryReadView(statePath, out var stored));
Assert.AreEqual(view.Generation, stored.Generation);
Assert.AreEqual(AetheriaRuntimeDaemonSoaBackends.MemoryMappedFile, stored.Backend);
Assert.AreEqual(1, stored.Buffers.Count);
Assert.IsFalse(stored.Buffers[0].ObserverWritable);
Assert.AreEqual(11, stored.Columns.Count);
Assert.AreEqual(1, stored.RenderGroups.Count);
Assert.AreEqual(2, stored.RenderGroups[0].InstanceCount);
Assert.AreEqual(AetheriaRuntimeDaemonSoaBackends.MemoryMappedFile, view.Backend);
Assert.AreEqual(1, view.Buffers.Count);
Assert.IsFalse(view.Buffers[0].ObserverWritable);
Assert.AreEqual(11, view.Columns.Count);
Assert.AreEqual(1, view.RenderGroups.Count);
Assert.AreEqual(2, view.RenderGroups[0].InstanceCount);
var index = AetheriaRuntimeDaemonSoaViewIndex.Build(stored);
var index = AetheriaRuntimeDaemonSoaViewIndex.Build(view);
Assert.IsTrue(index.IsValid, string.Join("\n", index.ValidationErrors));
Assert.IsTrue(index.TryGetFirstColumnOfKind(AetheriaRuntimeDaemonSoaColumnKinds.EntityIndex, out var entityIndex));
Assert.IsTrue(index.TryGetFirstColumnOfKind(AetheriaRuntimeDaemonSoaColumnKinds.Position, out var position));
Assert.IsTrue(index.TryGetFirstColumnOfKind(AetheriaRuntimeDaemonSoaColumnKinds.Velocity, out var velocity));
Assert.IsTrue(index.TryGetFirstColumnOfKind(AetheriaRuntimeDaemonSoaColumnKinds.RenderVisibility, out var visibility));
using var memory = MemoryMappedFile.OpenExisting(stored.Buffers[0].Location, MemoryMappedFileRights.Read);
using var accessor = memory.CreateViewAccessor(0, stored.Buffers[0].ByteLength, MemoryMappedFileAccess.Read);
using var memory = MemoryMappedFile.OpenExisting(view.Buffers[0].Location, MemoryMappedFileRights.Read);
using var accessor = memory.CreateViewAccessor(0, view.Buffers[0].ByteLength, MemoryMappedFileAccess.Read);
Assert.AreEqual(3, accessor.ReadInt32(entityIndex.AbsoluteByteOffset));
Assert.AreEqual(7, accessor.ReadInt32(entityIndex.AbsoluteByteOffset + entityIndex.Column.ElementStride));
Assert.AreEqual(-2f, accessor.ReadSingle(position.AbsoluteByteOffset), 0.0001f);
@ -2115,18 +2097,6 @@ public class DaemonRuntimeDocumentTests
Assert.AreEqual(1, accessor.ReadByte(visibility.AbsoluteByteOffset + visibility.Column.ElementStride));
}
[Test]
public void SoaViewStoreReportsMissingView()
{
var statePath = Path.Combine(
Path.GetTempPath(),
"aetheria-daemon-soa-view-store-tests",
Path.GetRandomFileName(),
"missing-state.cc");
Assert.IsFalse(AetheriaRuntimeDaemonSoaViewStore.TryReadView(statePath, out _));
}
[Test]
public void AetheriaClientObservesManagedDaemonStateWithSoaView()
{

View file

@ -28,31 +28,5 @@ namespace GameCult.Aetheria.State.Verse
AetheriaRuntimeCultCacheDocumentStore.WriteDaemonFrame(framePath, frame);
return framePath;
}
public static bool TryReadFrame(string stateFilePath, out AetheriaRuntimeDaemonFrameDocument frame)
{
var framePath = GetFramePath(stateFilePath);
if (!File.Exists(framePath))
{
frame = new AetheriaRuntimeDaemonFrameDocument();
return false;
}
try
{
frame = AetheriaRuntimeCultCacheDocumentStore.ReadDaemonFrame(framePath);
return true;
}
catch (Exception)
{
frame = new AetheriaRuntimeDaemonFrameDocument();
return false;
}
}
public static AetheriaRuntimeDaemonFrameDocument ReadFrame(string stateFilePath)
{
return AetheriaRuntimeCultCacheDocumentStore.ReadDaemonFrame(GetFramePath(stateFilePath));
}
}
}

View file

@ -1,5 +1,3 @@
using System.IO;
#nullable enable
namespace GameCult.Aetheria.State.Verse
@ -17,23 +15,5 @@ namespace GameCult.Aetheria.State.Verse
AetheriaRuntimeCultCacheDocumentStore.WriteDaemonSoaView(path, view);
return path;
}
public static bool TryReadView(string stateFilePath, out AetheriaRuntimeDaemonSoaViewDocument view)
{
var path = GetViewPath(stateFilePath);
if (!File.Exists(path))
{
view = new AetheriaRuntimeDaemonSoaViewDocument();
return false;
}
view = AetheriaRuntimeCultCacheDocumentStore.ReadDaemonSoaView(path);
return true;
}
public static AetheriaRuntimeDaemonSoaViewDocument ReadView(string stateFilePath)
{
return AetheriaRuntimeCultCacheDocumentStore.ReadDaemonSoaView(GetViewPath(stateFilePath));
}
}
}