Skip to content

Commit af034ba

Browse files
committed
Checkpoint functional coverage identity and native open-loop host joins
Include all current shared working-tree changes on main as requested. Join native coverage image admission, open-loop IOptions library and host dispatch, real host configuration-to-output cases and partition-isolation workflows. Local Release attempts failed; current full build, functional coverage, Aspire RF3 and original acceptance gates remain pending. No original plan task is marked complete.
1 parent cfe1f6c commit af034ba

814 files changed

Lines changed: 14118 additions & 2871 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎AGENTS.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ Rule format:
171171
- Existing rules MUST remain present and mandatory; change or remove a rule only under explicit rule-specific owner direction, never as framework cleanup.
172172

173173
## Global Skills
174+
The owner's 2026-10-06 approval to implement the reviewed native DurableJobs path also authorizes its matching native Journaling API (`ORLEANSEXP005`). Confine that opt-in to the journal provider, native jobs integration and their registration/tests under ADR-110; do not use a global NoWarn or suppress unrelated diagnostics. Journal metadata remains RF3-authoritative and distinct from creator-authorized business effects.
175+
174176
The explicit owner instruction to enable Orleans distributed directory and activation repartitioning is consent to those two native experimental APIs. Confine compiler opt-in ORLEANSEXP003/ORLEANSEXP001 to their two configuration calls, with ADR-034 evidence; it does not authorize global NoWarn, suppression of quality diagnostics or changing analyzer severity.
175177

176178
- On 2026-10-05 the owner explicitly authorized installing the Managed Code `quality` bundle from https://skills.managed-code.com/bundles/quality/ and running KeyLoad complexity, CRAP and related code-quality analysis. Use the catalog's current bundle skill names and native installation command; this scoped permission supersedes the historical skill-installation prohibition and older `mcaf-*` naming requirement for this bundle only. Preserve existing quality thresholds and use the Aspire-owned entry point for coverage-producing tests.

‎Directory.Packages.props‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<PackageVersion Include="ModelContextProtocol.AspNetCore" Version="2.2.0" />
2424
<PackageVersion Include="ModelContextProtocol.Core" Version="2.2.0" />
2525
<PackageVersion Include="Microsoft.Orleans.Server" Version="10.4.0" />
26+
<PackageVersion Include="Microsoft.Orleans.Journaling" Version="10.4.0-alpha.1" />
27+
<PackageVersion Include="Microsoft.Orleans.DurableJobs" Version="10.4.0-alpha.1" />
2628
<PackageVersion Include="Microsoft.Orleans.Sdk" Version="10.4.0" />
2729
<PackageVersion Include="Microsoft.Orleans.Serialization" Version="10.4.0" />
2830
<PackageVersion Include="Microsoft.Orleans.CodeGenerator" Version="10.4.0" />
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using KeyLoad.Comparisons;
2+
using Microsoft.Extensions.Configuration;
3+
using Microsoft.Extensions.Options;
4+
5+
namespace KeyLoad.ComparisonHost.Features.BenchmarkComparisons;
6+
7+
/// <summary>Admits one centrally validated native open-loop dispatch.</summary>
8+
[ConfigurationBinding]
9+
internal sealed record IsolatedOpenLoopSettings(ScaledComparisonProfile Profile, int Rate,
10+
bool CancellationProof, IOptions<OpenLoopExecutionOptions> ExecutionOptions)
11+
{
12+
internal const string ProofSetting = "Benchmarks:OpenLoopCancellationProof";
13+
internal const string ProofEnvironment = "Benchmarks__OpenLoopCancellationProof";
14+
internal const string ProofSelected = "true";
15+
private const int ProofNodeCount = 3;
16+
17+
internal static IsolatedOpenLoopSettings? Read(IConfiguration configuration, ComparisonWorkerSelection selection)
18+
{
19+
var proofText = configuration[ProofSetting];
20+
if (selection.OpenLoopRate is not { } rate)
21+
{
22+
if (proofText is not null) { throw Invalid(); }
23+
return null;
24+
}
25+
if (proofText is not null && proofText != ProofSelected) { throw Invalid(); }
26+
var profile = selection.ScaledProfile ?? throw Invalid();
27+
var proof = proofText is not null;
28+
if (proof && (selection.Target != IsolatedHostConstants.KeyLoad
29+
|| selection.NodeCount != ProofNodeCount || selection.Scenario != Scenario.PointRead))
30+
{
31+
throw Invalid();
32+
}
33+
return new(profile, rate, proof, OpenLoopExecutionRegistration.Read(configuration));
34+
}
35+
36+
private static InvalidOperationException Invalid() => new(IsolatedHostConstants.Failure);
37+
}

‎benchmarks/KeyLoad.ComparisonHost/Features/BenchmarkComparisons/Configuration/NativeComparisonExecutionRegistration.cs‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using KeyLoad.Comparisons;
2+
using KeyLoad.Client;
23
using Microsoft.Extensions.Configuration;
34
using Microsoft.Extensions.DependencyInjection;
45
using Microsoft.Extensions.Options;
@@ -20,4 +21,37 @@ internal static IOptions<NativeComparisonExecutionOptions> Read(IConfiguration c
2021
var policy = provider.GetRequiredService<IOptions<NativeComparisonExecutionOptions>>().Value.Validate();
2122
return Options.Create(policy);
2223
}
24+
25+
internal static IOptions<ComparisonLifecycleOptions> ReadLifecycle(IConfiguration configuration)
26+
{
27+
var options = new OptionsManager<ComparisonLifecycleOptions>(new OptionsFactory<ComparisonLifecycleOptions>(
28+
[new ConfigureFromConfigurationOptions<ComparisonLifecycleOptions>(
29+
configuration.GetSection(ComparisonLifecycleOptions.SectionName))], [],
30+
[new ValidateOptions<ComparisonLifecycleOptions>(Options.DefaultName,
31+
settings => settings.IsValid(), ComparisonLifecycleOptions.ValidationMessage)]));
32+
_ = options.Value;
33+
return options;
34+
}
35+
36+
internal static IOptions<KeyLoadClientExecutionOptions> ReadClient(IConfiguration configuration)
37+
{
38+
var options = new OptionsManager<KeyLoadClientExecutionOptions>(new OptionsFactory<KeyLoadClientExecutionOptions>(
39+
[new ConfigureFromConfigurationOptions<KeyLoadClientExecutionOptions>(
40+
configuration.GetSection(KeyLoadClientExecutionOptions.SectionName))], [],
41+
[new ValidateOptions<KeyLoadClientExecutionOptions>(Options.DefaultName,
42+
settings => settings.IsValid(), KeyLoadClientExecutionOptions.ValidationMessage)]));
43+
_ = options.Value;
44+
return options;
45+
}
46+
47+
internal static IOptions<QueryTranslationOptions> ReadTranslation(IConfiguration configuration)
48+
{
49+
var options = new OptionsManager<QueryTranslationOptions>(new OptionsFactory<QueryTranslationOptions>(
50+
[new ConfigureFromConfigurationOptions<QueryTranslationOptions>(
51+
configuration.GetSection(QueryTranslationOptions.SectionName))], [],
52+
[new ValidateOptions<QueryTranslationOptions>(Options.DefaultName,
53+
settings => settings.IsValid(), QueryTranslationOptions.ValidationMessage)]));
54+
_ = options.Value;
55+
return options;
56+
}
2357
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using KeyLoad.Comparisons;
2+
using Microsoft.Extensions.Configuration;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.Options;
5+
6+
namespace KeyLoad.ComparisonHost.Features.BenchmarkComparisons;
7+
8+
/// <summary>Binds the canonical open-loop policy before admitting a native target.</summary>
9+
[ConfigurationBinding]
10+
internal static class OpenLoopExecutionRegistration
11+
{
12+
internal static IOptions<OpenLoopExecutionOptions> Read(IConfiguration configuration)
13+
{
14+
ArgumentNullException.ThrowIfNull(configuration);
15+
var services = new ServiceCollection();
16+
services.AddSingleton<IValidateOptions<OpenLoopExecutionOptions>, OpenLoopExecutionOptionsValidator>();
17+
services.AddOptions<OpenLoopExecutionOptions>()
18+
.Bind(configuration.GetSection(OpenLoopExecutionOptions.SectionName)).ValidateOnStart();
19+
using var provider = services.BuildServiceProvider();
20+
var policy = provider.GetRequiredService<IOptions<OpenLoopExecutionOptions>>().Value;
21+
return Options.Create(policy);
22+
}
23+
}

‎benchmarks/KeyLoad.ComparisonHost/Features/BenchmarkComparisons/Hosting/ComparisonApplication.cs‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ internal static async Task<int> RunAsync(string[] arguments)
1616
configuration.AddJsonFile(Path.Combine(AppContext.BaseDirectory, NativeComparisonExecutionRegistration.ConfigurationPath), optional: false);
1717
configuration.AddEnvironmentVariables();
1818
configuration.AddCommandLine(arguments);
19-
var owner = new ComparisonTargetOwner(NativeComparisonExecutionRegistration.Read(configuration));
19+
var owner = new ComparisonTargetOwner(NativeComparisonExecutionRegistration.Read(configuration),
20+
NativeComparisonExecutionRegistration.ReadLifecycle(configuration),
21+
NativeComparisonExecutionRegistration.ReadClient(configuration),
22+
NativeComparisonExecutionRegistration.ReadTranslation(configuration));
2023
ComparisonCancellationLifetime? cancellationLifetime = null;
2124
try
2225
{

‎benchmarks/KeyLoad.ComparisonHost/Features/BenchmarkComparisons/Hosting/ComparisonTargetOwner.cs‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
using System.Text;
44
using Microsoft.Extensions.Options;
55
using KeyLoad.Comparisons;
6+
using KeyLoad.Client;
67
using KeyLoad.Comparisons.Targets;
78

89
namespace KeyLoad.ComparisonHost.Features.BenchmarkComparisons;
910

1011
/// <summary>Owns target construction and each client until its target takes ownership.</summary>
11-
internal sealed class ComparisonTargetOwner(IOptions<NativeComparisonExecutionOptions> executionOptions) : IAsyncDisposable
12+
internal sealed class ComparisonTargetOwner(IOptions<NativeComparisonExecutionOptions> executionOptions,
13+
IOptions<ComparisonLifecycleOptions> lifecycleOptions, IOptions<KeyLoadClientExecutionOptions> clientOptions, IOptions<QueryTranslationOptions> translationOptions) : IAsyncDisposable
1214
{
1315
private readonly List<IComparisonTarget> targets = new(ComparisonHostConstants.TargetCount);
1416
private readonly List<HttpClient> unownedClients = new(ComparisonHostConstants.HttpClientCount);
@@ -27,22 +29,22 @@ internal IComparisonTarget[] CreateTargets(ComparisonHostSettings settings)
2729
var neo4jClient = CreateClient(settings.Neo4jEndpoint);
2830
neo4jClient.DefaultRequestHeaders.Authorization = CreateNeo4jAuthorization(settings.Neo4jPassword);
2931

30-
pendingTarget = new KeyLoadTarget(keyLoadClient, settings.AdminKey, settings.RunId,
32+
pendingTarget = new KeyLoadTarget(keyLoadClient, settings.AdminKey, settings.RunId, lifecycleOptions, clientOptions, translationOptions,
3133
image: settings.ExecutionIdentity?.KeyLoadImage, peers: keyLoadClients);
3234
PublishPendingTarget(keyLoadClients);
33-
pendingTarget = new PostgresTarget(settings.PostgresConnection, settings.RunId, settings.PostgresImage);
35+
pendingTarget = new PostgresTarget(settings.PostgresConnection, settings.RunId, settings.PostgresImage, executionOptions, lifecycleOptions);
3436
PublishPendingTarget();
35-
pendingTarget = new QdrantTarget(qdrantClient, settings.RunId, settings.QdrantImage, settings.Options.Topology, null, executionOptions);
37+
pendingTarget = new QdrantTarget(qdrantClient, settings.RunId, settings.QdrantImage, executionOptions, lifecycleOptions, settings.Options.Topology, null);
3638
PublishPendingTarget(qdrantClient);
3739
var rabbitManagementClient = CreateClient(settings.RabbitManagementEndpoint);
3840
rabbitManagementClient.DefaultRequestHeaders.Authorization =
3941
ComparisonEndpointBindings.CreateRabbitAuthorization(settings.RabbitUser, settings.RabbitPassword);
40-
pendingTarget = new RabbitTarget(settings.RabbitConnection, settings.RunId, settings.RabbitImage,
42+
pendingTarget = new RabbitTarget(settings.RabbitConnection, settings.RunId, settings.RabbitImage, lifecycleOptions,
4143
management: rabbitManagementClient);
4244
PublishPendingTarget(rabbitManagementClient);
43-
pendingTarget = new RedisTarget(settings.RedisConnection, settings.RunId, settings.RedisImage);
45+
pendingTarget = new RedisTarget(settings.RedisConnection, settings.RunId, settings.RedisImage, lifecycleOptions);
4446
PublishPendingTarget();
45-
pendingTarget = new Neo4jTarget(neo4jClient, settings.RunId, settings.Neo4jImage);
47+
pendingTarget = new Neo4jTarget(neo4jClient, settings.RunId, settings.Neo4jImage, lifecycleOptions);
4648
PublishPendingTarget(neo4jClient);
4749
return [.. targets];
4850
}

‎benchmarks/KeyLoad.ComparisonHost/Features/BenchmarkComparisons/Hosting/IsolatedHostApplication.cs‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using KeyLoad.Comparisons;
2+
using ManagedCode.Communication.CQRS;
23
using Microsoft.Extensions.Configuration;
34

45
namespace KeyLoad.ComparisonHost.Features.BenchmarkComparisons;
@@ -30,6 +31,7 @@ private static async Task<int> RunSelectedAsync(IConfiguration configuration, Ca
3031
{
3132
cancellationToken.ThrowIfCancellationRequested();
3233
var settings = IsolatedHostSettings.Read(configuration);
34+
var openLoop = IsolatedOpenLoopSettings.Read(configuration, settings.Selection);
3335
IsolatedHostReportWriter.ValidateDestination(settings.OutputDirectory);
3436
if (settings.UnsupportedReason is { } reason)
3537
{
@@ -39,21 +41,37 @@ private static async Task<int> RunSelectedAsync(IConfiguration configuration, Ca
3941
return ComparisonHostConstants.SuccessfulExitCode;
4042
}
4143
var policy = NativeComparisonExecutionRegistration.Read(configuration);
42-
return await RunNativeAsync(settings, policy, cancellationToken);
44+
return await RunNativeAsync(settings, policy,
45+
NativeComparisonExecutionRegistration.ReadLifecycle(configuration),
46+
NativeComparisonExecutionRegistration.ReadClient(configuration),
47+
NativeComparisonExecutionRegistration.ReadTranslation(configuration), openLoop, cancellationToken);
4348
}
4449
catch (OperationCanceledException)
4550
{
4651
throw;
4752
}
53+
catch (Exception failure) when (CqrsRuntimeFailures.FindFatal(failure) is not null)
54+
{
55+
throw;
56+
}
4857
catch (Exception)
4958
{
5059
throw new ComparisonFailureException(IsolatedHostConstants.Failure);
5160
}
5261
}
5362

54-
private static async Task<int> RunNativeAsync(IsolatedHostSettings settings, Microsoft.Extensions.Options.IOptions<NativeComparisonExecutionOptions> policy, CancellationToken cancellationToken)
63+
private static async Task<int> RunNativeAsync(IsolatedHostSettings settings,
64+
Microsoft.Extensions.Options.IOptions<NativeComparisonExecutionOptions> policy,
65+
Microsoft.Extensions.Options.IOptions<ComparisonLifecycleOptions> lifecycleOptions,
66+
Microsoft.Extensions.Options.IOptions<KeyLoad.Client.KeyLoadClientExecutionOptions> clientOptions,
67+
Microsoft.Extensions.Options.IOptions<KeyLoad.Client.QueryTranslationOptions> translationOptions,
68+
IsolatedOpenLoopSettings? openLoop, CancellationToken cancellationToken)
5569
{
56-
await using var owner = new IsolatedHostTargetOwner(policy);
70+
await using var owner = new IsolatedHostTargetOwner(policy, lifecycleOptions, clientOptions, translationOptions);
71+
if (openLoop is not null)
72+
{
73+
return await IsolatedOpenLoopHostApplication.RunAsync(owner, settings, openLoop, cancellationToken);
74+
}
5775
if (settings.Selection.VectorProfile is not null)
5876
{
5977
return await IsolatedVectorHostApplication.RunAsync(owner, settings, cancellationToken);

0 commit comments

Comments
 (0)