fix(sitecallaudit): UpdatedAtUtc index + per-row pull resilience + UTC-convention + first-cycle test (review)
This commit is contained in:
@@ -91,6 +91,8 @@ public class OperationTrackingStore : IOperationTrackingStore, IAsyncDisposable,
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS IX_OperationTracking_Status_Updated
|
||||
ON OperationTracking (Status, UpdatedAtUtc);
|
||||
CREATE INDEX IF NOT EXISTS IX_OperationTracking_UpdatedAt
|
||||
ON OperationTracking (UpdatedAtUtc);
|
||||
""";
|
||||
cmd.ExecuteNonQuery();
|
||||
|
||||
@@ -370,8 +372,10 @@ public class OperationTrackingStore : IOperationTrackingStore, IAsyncDisposable,
|
||||
|
||||
// SiteRuntime-024: like GetStatusAsync, the reconciliation pull opens a
|
||||
// fresh, ungated read connection so a long-running write never blocks
|
||||
// central's PullSiteCalls. The query is a bounded, ordered scan over the
|
||||
// (Status, UpdatedAtUtc) index range — UpdatedAtUtc is the cursor.
|
||||
// central's PullSiteCalls. The query is a bounded, ordered scan served by
|
||||
// the standalone IX_OperationTracking_UpdatedAt index — UpdatedAtUtc is
|
||||
// the cursor. (The composite (Status, UpdatedAtUtc) index cannot satisfy a
|
||||
// status-less UpdatedAtUtc range scan; this dedicated index does.)
|
||||
await using var readConnection = new SqliteConnection(_connectionString);
|
||||
await readConnection.OpenAsync(ct).ConfigureAwait(false);
|
||||
|
||||
@@ -390,9 +394,15 @@ public class OperationTrackingStore : IOperationTrackingStore, IAsyncDisposable,
|
||||
ORDER BY UpdatedAtUtc ASC
|
||||
LIMIT $batchSize;
|
||||
""";
|
||||
cmd.Parameters.AddWithValue(
|
||||
"$since",
|
||||
sinceUtc.ToString("o", CultureInfo.InvariantCulture));
|
||||
// Force UTC kind before formatting so the cursor's "o" text matches the
|
||||
// 'Z'-suffixed round-trip form the write path persists (DateTime.UtcNow
|
||||
// .ToString("o")). A first-cycle DateTime.MinValue arrives Unspecified —
|
||||
// without this its "o" rendering would lack the 'Z', and the SQLite text
|
||||
// compare against 'Z'-suffixed stored values would be subtly inconsistent.
|
||||
var sinceText = DateTime
|
||||
.SpecifyKind(sinceUtc, DateTimeKind.Utc)
|
||||
.ToString("o", CultureInfo.InvariantCulture);
|
||||
cmd.Parameters.AddWithValue("$since", sinceText);
|
||||
cmd.Parameters.AddWithValue("$batchSize", batchSize);
|
||||
|
||||
var rows = new List<SiteCallOperational>();
|
||||
|
||||
Reference in New Issue
Block a user