Skip to content

Commit eeef54b

Browse files
committed
Checkpoint all work and database hot-path regression scope
1 parent 5bbf30f commit eeef54b

75 files changed

Lines changed: 6849 additions & 414 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.

‎.github/workflows/ci.yml‎

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -187,30 +187,30 @@ jobs:
187187
- run: dotnet build tests/KeyLoad.ComparisonTests --no-restore --configuration Release
188188
- name: Qualify native image export and import
189189
id: roundtrip
190-
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ImageBundleRealTests/*'
190+
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ImageBundleRealTests/*' --results-directory TestResults/comparison-images/image-roundtrip
191191
- name: Qualify authenticated current-job identity
192-
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedGitHubCurrentJobTests/*'
192+
run: dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedGitHubCurrentJobTests/*' --results-directory TestResults/comparison-images/job-identity
193193
- name: Qualify exact native topology composition models
194194
run: |
195-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/Isolated*Resource*/*'
196-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessResourceTests/*'
197-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessIdentityTests/*'
198-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessTaskFailureTests/*'
199-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKurrentVolumeRegressionFailureTests/*'
200-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKeyLoadAdmissionTests/*'
201-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonResourceLogBufferTests/*'
195+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/Isolated*Resource*/*' --results-directory TestResults/comparison-images/resource-models
196+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessResourceTests/*' --results-directory TestResults/comparison-images/mongo-resource
197+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessIdentityTests/*' --results-directory TestResults/comparison-images/mongo-identity
198+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoReadinessTaskFailureTests/*' --results-directory TestResults/comparison-images/mongo-task-failure
199+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKurrentVolumeRegressionFailureTests/*' --results-directory TestResults/comparison-images/kurrent-volume-failure
200+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKeyLoadAdmissionTests/*' --results-directory TestResults/comparison-images/keyload-admission
201+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonResourceLogBufferTests/*' --results-directory TestResults/comparison-images/log-buffer
202202
- name: Qualify isolated replay admission and native diagnostics
203203
run: |
204-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKeyLoadReplayAdmissionTests/*'
205-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/RedisReplicaDiagnosticTests/*'
206-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoBootstrapDiagnosticTests/*'
207-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/KurrentCleanupDiagnosticTests/*'
208-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonReplayDiagnosticLogTests/*'
209-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonReplayDiagnosticRetentionTests/*'
204+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/IsolatedKeyLoadReplayAdmissionTests/*' --results-directory TestResults/comparison-images/replay-admission
205+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/RedisReplicaDiagnosticTests/*' --results-directory TestResults/comparison-images/redis-diagnostics
206+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/MongoBootstrapDiagnosticTests/*' --results-directory TestResults/comparison-images/mongo-diagnostics
207+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/KurrentCleanupDiagnosticTests/*' --results-directory TestResults/comparison-images/kurrent-diagnostics
208+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonReplayDiagnosticLogTests/*' --results-directory TestResults/comparison-images/replay-log
209+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/ComparisonReplayDiagnosticRetentionTests/*' --results-directory TestResults/comparison-images/replay-retention
210210
- name: Qualify time-series workload and aggregation contracts
211211
run: |
212-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesWorkloadTests/*'
213-
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesPackageVersionTests/*'
212+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesWorkloadTests/*' --results-directory TestResults/comparison-images/timeseries-workload
213+
dotnet test --project tests/KeyLoad.ComparisonTests --no-build --no-restore --configuration Release --treenode-filter '/*/*/TimeSeriesPackageVersionTests/*' --results-directory TestResults/comparison-images/timeseries-package
214214
- name: Retain common image bundle
215215
id: bundle
216216
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a

‎README.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,27 @@ The earlier isolated Linux baseline ([run37087909605](https://github.com/managed
302302

303303
The bounded RAM pool, embedded point cache and local binding passed the development checks in the [R83 source receipt](docs/implementation/cache-memory-source-r83.json). The newer [d45 native source gates](docs/implementation/cache-native-source-r93.json) pass1583/1583 normal and scalar unit cases with identical IDs and no skips,164/164 recovery plus1000 seeded process-cut rows,118 analyzer cases and63/63 SDK/MCP RF3 cases. All17 earlier identity failures and the byte77 oracle now pass. The comparison workflow concluded with24/27 successful preflight jobs and3 failures; the270-cell matrix did not execute. These source gates provide no performance result. The [R100 wire source receipt](docs/implementation/cache-wire-source-r100.json) binds the complete independent review of34 unused internal signed-metadata files and26 corrected test files. Fresh integrated source gates and delivered-SHA native qualification remain pending. Orleans RF3 controls, product coverage, measured benefit, endurance and power-loss gates remain open; server RF3 caches are disabled.
304304

305+
The later ALL186-file `5bbf30f70` checkpoint has [terminal CI evidence](docs/implementation/cache-checkpoint-native-r104.json): real RF3 passes63/63 and analyzer regressions118/118. Its full solution build fails20 Node test-helper diagnostics; normal/scalar unit tests, recovery and comparisons are skipped. The new cache-wire tests therefore remain unqualified. Current helper corrections require a fresh complete source gate and delivered-SHA CI run.
306+
307+
The actual database hot-path investigation has an independently authenticated
308+
[PointRead baseline](docs/implementation/database-hotpath-baseline-d45-r115.json)
309+
from that earlier d45 native preflight: median2187ops/s for1 voter,805ops/s for2
310+
and891ops/s forRF3, at16 closed-loop clients and five10000-operation repetitions.
311+
Each group runs on one Docker host; this is not multi-host scaling or a complete
312+
competitor comparison. Server CPU/allocations and phase timings are unavailable.
313+
The [first preserving repair](docs/Features/ClusterReplication/ReplicaTermMetadata.md)
314+
targets repeated full-entry decoding during term checks, retaining both public
315+
authorized quorum barriers. New regressions, implementation and measured benefit
316+
remain pending. [Current source ownership evidence](docs/implementation/image-http-owner-source-r115.json)
317+
closes the Node-helper source review; the full R113 development build still fails
318+
21 other SiteTests diagnostics, and delivered-SHA native tests remain required.
319+
305320

306321
The delivered `2f374fc34` [Linux run37093197474](https://github.com/managedcode/KeyLoad/actions/runs/37093197474) now passes the complete source gates,118 analyzer cases,1483 normal and1483 scalar unit cases,164 process-recovery cases and63 Docker RF3 cases without skips. The [original-source receipt](docs/implementation/isolated-source-qualification-37093197474.json) retains exact report/artifact hashes. Comparative image and diagnostic gates pass;27 native preflights finish16 job successes and11 failures, including two explicit unavailable Neo4j topologies among the successes. Complete270 performance and site publication remain unqualified. The separate TimeSeries pure30 cases pass in both modes, while its bounded runner has36 new declared TUnit cases prepared in source and native adapters/all30 cells remain pending.
307322

308323
The later `2ecbeee4d` [run37093992229](https://github.com/managedcode/KeyLoad/actions/runs/37093992229) fails17 normal unit cases and one RF3 queue-receive case; scalar and native comparison jobs are skipped. The [original-failure receipt](docs/implementation/isolated-current-main-baseline-37093992229.json) preserves the exact reports and artifact hashes. Current repairs and a prepared intensive TimeSeries runner remain unqualified until their delivered-source GitHub gates pass.
309324

310325

311326
The fixture-only `d45d7f253` [Linux source qualification](docs/implementation/isolated-source-qualification-37098964980.json) passes normal1583/scalar1583, recovery164, analyzer118 and RF363 without skips; all17 prior fixture failures pass in both modes. The [terminal comparison receipt](docs/implementation/isolated-comparison-terminal-37098964980.json) records24successful native preflight jobs and3failures (Mongo2 image import, Mongo3 priority takeover, Kurrent2 cleanup). Two successful jobs explicitly report unavailable Neo4j Community topologies. Full270 was not allocated; aggregation and refreshed site metrics remain unqualified. New ACK ownership, SDK TimeSeries adapter, SQL and transactional lifecycle source require their own delivered-SHA qualification; TimeSeries6/30 remains incomplete.
327+
328+
The later `5bbf30f70` [Linux source run37104211481](docs/implementation/isolated-source-qualification-37104211481.json) fails the full Release build on20 Node-helper diagnostics. Analyzer118 and Docker/Aspire RF363 pass; normal/scalar units, recovery and all native comparison jobs are skipped. No intensive cells execute and no performance metrics are refreshed. Current repairs and the new TimeSeries1/2/3 resource models require a new delivered-source GitHub run; models do not establish native ACKs or copied data.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Runtime.ExceptionServices;
2+
3+
namespace KeyLoad.Comparisons.Targets;
4+
5+
internal static class KurrentCleanupFatalCause
6+
{
7+
private const int FirstAggregateIndex = 0;
8+
private const int PreviousIndexOffset = 1;
9+
10+
internal static ExceptionDispatchInfo? Find(Exception error)
11+
{
12+
ArgumentNullException.ThrowIfNull(error);
13+
var visited = new HashSet<Exception>(ReferenceEqualityComparer.Instance);
14+
var pending = new Stack<Exception>();
15+
pending.Push(error);
16+
while (pending.TryPop(out var current))
17+
{
18+
if (!visited.Add(current))
19+
{
20+
continue;
21+
}
22+
if (IsFatal(current))
23+
{
24+
return ExceptionDispatchInfo.Capture(current);
25+
}
26+
if (current is AggregateException aggregate)
27+
{
28+
for (var index = aggregate.InnerExceptions.Count - PreviousIndexOffset;
29+
index >= FirstAggregateIndex; index--)
30+
{
31+
pending.Push(aggregate.InnerExceptions[index]);
32+
}
33+
}
34+
else if (current.InnerException is { } inner)
35+
{
36+
pending.Push(inner);
37+
}
38+
}
39+
return null;
40+
}
41+
42+
private static bool IsFatal(Exception error)
43+
=> error is OutOfMemoryException or StackOverflowException or AccessViolationException
44+
or AppDomainUnloadedException or BadImageFormatException or CannotUnloadAppDomainException;
45+
}

‎benchmarks/KeyLoad.Comparisons/Features/BenchmarkComparisons/KurrentCleanupState.cs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ internal sealed class KurrentCleanupState(int tracked)
99
private readonly Stopwatch clock = Stopwatch.StartNew();
1010
private int next, submitted, acknowledged, faulted, pending, peak, laterDisposals;
1111
private ExceptionDispatchInfo? primary;
12+
private ExceptionDispatchInfo? firstFatal;
1213
private KurrentCleanupStage failedStage;
1314
private KurrentCleanupFailureReason reason;
1415
private int? grpcStatus;
@@ -123,7 +124,7 @@ internal void ThrowIfFailed()
123124
ExceptionDispatchInfo? failure;
124125
lock (gate)
125126
{
126-
failure = primary;
127+
failure = firstFatal ?? primary;
127128
}
128129
failure?.Throw();
129130
}
@@ -132,6 +133,10 @@ internal void ThrowIfFailed()
132133

133134
private void Capture(Exception error, KurrentCleanupStage stage)
134135
{
136+
if (firstFatal is null)
137+
{
138+
firstFatal = KurrentCleanupFatalCause.Find(error);
139+
}
135140
var classified = KurrentCleanupDiagnostics.Classify(error);
136141
if (primary is not null)
137142
{

‎benchmarks/KeyLoad.Comparisons/Features/BenchmarkComparisons/TimeSeries/Intensive/TimeSeriesIntensiveAcknowledgement.cs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ namespace KeyLoad.Comparisons.Features.BenchmarkComparisons.TimeSeries.Intensive
22

33
internal readonly record struct TimeSeriesIntensiveAcknowledgement(Guid CommandId, long Sequence)
44
{
5+
private const long MinimumSequence = 1L;
6+
private const string MissingCommand = "An acknowledgement requires an actual nonempty command UUID.";
57
internal static TimeSeriesIntensiveAcknowledgement FromReceipt(TimeSeriesIntensiveAppendReceipt receipt)
68
{
79
ArgumentNullException.ThrowIfNull(receipt);
@@ -13,8 +15,8 @@ internal static void Validate(TimeSeriesIntensiveAcknowledgement acknowledgement
1315
{
1416
if (acknowledgement.CommandId == Guid.Empty)
1517
{
16-
throw new ArgumentException("An acknowledgement requires an actual nonempty command UUID.", nameof(acknowledgement));
18+
throw new ArgumentException(MissingCommand, nameof(acknowledgement));
1719
}
18-
ArgumentOutOfRangeException.ThrowIfLessThan(acknowledgement.Sequence, 1L, nameof(acknowledgement));
20+
ArgumentOutOfRangeException.ThrowIfLessThan(acknowledgement.Sequence, MinimumSequence, nameof(acknowledgement));
1921
}
2022
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace KeyLoad.Comparisons.Features.BenchmarkComparisons.TimeSeries.Intensive;
2+
3+
internal enum TimeSeriesIntensiveCellPhase
4+
{
5+
Preflight,
6+
Intensive
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Collections.Immutable;
2+
3+
namespace KeyLoad.Comparisons.Features.BenchmarkComparisons.TimeSeries.Intensive;
4+
5+
internal sealed record TimeSeriesIntensiveFamilyCell(string Id, TimeSeriesIntensiveSelection Selection);
6+
7+
internal sealed record TimeSeriesIntensiveFamilyCells(
8+
ImmutableArray<TimeSeriesIntensiveFamilyCell> Preflight,
9+
ImmutableArray<TimeSeriesIntensiveFamilyCell> Intensive);

0 commit comments

Comments
 (0)