feat: add atomic ephemeral state (#6)
quality-gate / quality (push) Successful in 57s

Closes #6
This commit is contained in:
KyuubiYoru
2026-07-16 05:32:48 +02:00
parent 47382ddadc
commit 02ca502a76
7 changed files with 1754 additions and 2 deletions
+17 -2
View File
@@ -2,6 +2,7 @@ using System.Net;
using FinalFactory.Rendezvous.Contracts;
using FinalFactory.Rendezvous.Server.Http;
using FinalFactory.Rendezvous.Server.Provisioning;
using FinalFactory.Rendezvous.Server.State;
using FinalFactory.Rendezvous.Server.Transport;
using Microsoft.OpenApi;
@@ -35,6 +36,13 @@ builder.Services.AddOpenApi("v1", static options =>
builder.Services.ConfigureHttpJsonOptions(static options =>
ContractJson.Configure(options.SerializerOptions));
SystemRendezvousClock rendezvousClock = new();
InMemoryEphemeralRendezvousStore stateStore = new(
new EphemeralStoreOptions(),
rendezvousClock,
rendezvousClock);
builder.Services.AddSingleton<IEphemeralRendezvousStore>(stateStore);
if (isOpenApiGeneration)
{
builder.Services.AddSingleton(new ProvisioningReadiness(false));
@@ -74,6 +82,7 @@ if (!isOpenApiGeneration)
}
WebApplication app = builder.Build();
app.Lifetime.ApplicationStopping.Register(() => stateStore.BeginDrain());
app.MapOpenApi();
app.MapRendezvousContractEndpoints();
@@ -85,8 +94,14 @@ app.MapGet(
.WithTags("Health");
app.MapGet(
"/health/ready",
static (UdpMediatorService mediator, ProvisioningReadiness provisioning) =>
mediator.LocalEndpoint is null || !provisioning.IsReady
static (
UdpMediatorService mediator,
ProvisioningReadiness provisioning,
IEphemeralRendezvousStore state) =>
mediator.LocalEndpoint is null
|| !provisioning.IsReady
|| !state.IsAvailable
|| state.IsDraining
? Results.StatusCode(StatusCodes.Status503ServiceUnavailable)
: Results.Ok(new HealthResponse { Status = "ready" }))
.Produces<HealthResponse>()