fix(deployment): read every external system's methods in one query for the artifact snapshot (review 2026-10-21 04/P7)
This commit is contained in:
+11
@@ -1,4 +1,5 @@
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Deployment;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.ExternalSystems;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Instances;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Deployment;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums;
|
||||
@@ -206,6 +207,16 @@ public interface IDeploymentManagerRepository
|
||||
/// <returns>The number of rows deleted; fewer than <paramref name="batchSize"/> means the sweep is complete.</returns>
|
||||
Task<int> PurgeSystemArtifactDeploymentRecordsAsync(DateTimeOffset cutoffUtc, int batchSize, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// Reads every external-system method in ONE untracked query, for the artifact-deploy
|
||||
/// global snapshot (which serializes each system's methods into its artifact). Replaces a
|
||||
/// per-system method query that ran on every artifact deploy and every pending-updates
|
||||
/// evaluation.
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">A cancellation token that can be used to cancel the operation.</param>
|
||||
/// <returns>All external-system methods; group by <c>ExternalSystemDefinitionId</c>.</returns>
|
||||
Task<IReadOnlyList<ExternalSystemMethod>> GetAllExternalSystemMethodsAsync(CancellationToken cancellationToken = default);
|
||||
|
||||
// DeployedConfigSnapshot
|
||||
/// <summary>
|
||||
/// Gets the deployed config snapshot for an instance.
|
||||
|
||||
+12
@@ -1,5 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Deployment;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.ExternalSystems;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Instances;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Types.Deployment;
|
||||
@@ -308,6 +309,17 @@ public class DeploymentManagerRepository : IDeploymentManagerRepository
|
||||
return stale.Count;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<IReadOnlyList<ExternalSystemMethod>> GetAllExternalSystemMethodsAsync(
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
return await _dbContext.Set<ExternalSystemMethod>()
|
||||
.AsNoTracking()
|
||||
.OrderBy(m => m.ExternalSystemDefinitionId)
|
||||
.ThenBy(m => m.Id)
|
||||
.ToListAsync(cancellationToken);
|
||||
}
|
||||
|
||||
// --- DeployedConfigSnapshot ---
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -301,7 +301,8 @@ public class ArtifactDeploymentService
|
||||
/// <remarks>
|
||||
/// The per-site artifact build path previously re-issued
|
||||
/// every one of these queries per site (≈ N + M·N round trips for N sites
|
||||
/// and M external systems). Hoisting them here drops that to a single fetch.
|
||||
/// and M external systems). Hoisting them here drops that to a single fetch, and the
|
||||
/// methods of every external system are read in one query rather than one per system.
|
||||
///
|
||||
/// Notification lists and SMTP configurations are NOT
|
||||
/// fetched here. Notification delivery is central-only, so they are never
|
||||
@@ -313,6 +314,10 @@ public class ArtifactDeploymentService
|
||||
var externalSystems = await _externalSystemRepo.GetAllExternalSystemsAsync(cancellationToken);
|
||||
var dbConnections = await _externalSystemRepo.GetAllDatabaseConnectionsAsync(cancellationToken);
|
||||
|
||||
// Every system's methods in ONE query, grouped here — not one query per system.
|
||||
var methodsBySystem = (await _deploymentRepo.GetAllExternalSystemMethodsAsync(cancellationToken))
|
||||
.ToLookup(m => m.ExternalSystemDefinitionId);
|
||||
|
||||
// Map shared scripts
|
||||
var scriptArtifacts = sharedScripts.Select(s =>
|
||||
new SharedScriptArtifact(s.Name, s.Code, s.ParameterDefinitions, s.ReturnDefinition)).ToList();
|
||||
@@ -321,7 +326,7 @@ public class ArtifactDeploymentService
|
||||
var externalSystemArtifacts = new List<ExternalSystemArtifact>();
|
||||
foreach (var es in externalSystems)
|
||||
{
|
||||
var methods = await _externalSystemRepo.GetMethodsByExternalSystemIdAsync(es.Id, cancellationToken);
|
||||
var methods = methodsBySystem[es.Id].ToList();
|
||||
// The property NAMES emitted here are part of a contract:
|
||||
// ArtifactRevisionHashService.CanonicalizeMethodDefinitions re-orders this array by
|
||||
// each element's "Name" property (case-insensitively) so repository row order cannot
|
||||
|
||||
Reference in New Issue
Block a user