Enforce the retained history node limit
This commit is contained in:
@@ -99,21 +99,76 @@ func detachLoadConfiguration[T any](schema *schemaDescriptor, configuration T, m
|
||||
return detached.Interface().(T), nil
|
||||
}
|
||||
|
||||
func prepareInspectionHistory[T any](resolved resolvedLoad[T]) *Inspection {
|
||||
return &Inspection{
|
||||
metadata: resolved.metadata,
|
||||
func prepareInspectionHistory[T any](resolved resolvedLoad[T], counter *retainedNodeCounter) (*Inspection, bool) {
|
||||
metadata := resolved.metadata
|
||||
metadata.inheritance = nil
|
||||
inspection := &Inspection{
|
||||
metadata: metadata,
|
||||
baseline: resolved.decoded.baseline,
|
||||
input: resolved.decoded.final,
|
||||
inputOrigins: cloneOriginIndex(resolved.decoded.origins),
|
||||
preCLI: resolved.preCLI,
|
||||
preCLIOrigins: cloneOrigins(resolved.preCLIOrigins),
|
||||
postDecodeApps: cloneHistoryApplications(resolved.postDecodeApps),
|
||||
final: resolved.final,
|
||||
resolution: resolved.snapshots,
|
||||
resolutionReplay: coalescedResolutionSnapshots(resolved.snapshots),
|
||||
applications: cloneHistoryApplications(resolved.applications),
|
||||
inheritance: inheritanceOperations(resolved.inheritance),
|
||||
}
|
||||
if !addInspectionHistory(counter, inspection) {
|
||||
return nil, false
|
||||
}
|
||||
var ok bool
|
||||
inspection.applications, ok = cloneHistoryApplicationsWithinLimit(resolved.applications, counter)
|
||||
if !ok {
|
||||
return nil, false
|
||||
}
|
||||
inspection.postDecodeApps, ok = cloneHistoryApplicationsWithinLimit(resolved.postDecodeApps, counter)
|
||||
if !ok {
|
||||
return nil, false
|
||||
}
|
||||
if resolved.inheritance != nil {
|
||||
roots := inheritanceOperationDocumentRoots(resolved.inheritance.operations)
|
||||
if !counter.canAddClones(roots, 2) {
|
||||
return nil, false
|
||||
}
|
||||
inspection.metadata.inheritance = cloneInheritanceOperations(resolved.inheritance.operations)
|
||||
if !addInheritanceOperationDocuments(counter, inspection.metadata.inheritance) {
|
||||
return nil, false
|
||||
}
|
||||
inspection.inheritance = cloneInheritanceOperations(resolved.inheritance.operations)
|
||||
if !addInheritanceOperationDocuments(counter, inspection.inheritance) {
|
||||
return nil, false
|
||||
}
|
||||
}
|
||||
if !addInspectionHistory(counter, inspection) {
|
||||
return nil, false
|
||||
}
|
||||
return inspection, true
|
||||
}
|
||||
|
||||
func cloneHistoryApplicationsWithinLimit(values []historyApplication, counter *retainedNodeCounter) ([]historyApplication, bool) {
|
||||
for _, value := range values {
|
||||
if !counter.add(value.value) {
|
||||
return nil, false
|
||||
}
|
||||
}
|
||||
return cloneHistoryApplications(values), true
|
||||
}
|
||||
|
||||
func inheritanceOperationDocumentRoots(operations []inheritanceOperation) []*document.Node {
|
||||
roots := make([]*document.Node, 0, len(operations)*2)
|
||||
for _, operation := range operations {
|
||||
roots = append(roots, operation.parent, operation.effective)
|
||||
}
|
||||
return roots
|
||||
}
|
||||
|
||||
func addInheritanceOperationDocuments(counter *retainedNodeCounter, operations []inheritanceOperation) bool {
|
||||
for _, operation := range operations {
|
||||
if !counter.add(operation.parent) || !counter.add(operation.effective) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func publishLoadResult[T any](schema *schemaDescriptor, definition Definition[T], resolved resolvedLoad[T], inspection *Inspection, applications []historyApplication, references map[string]string, accumulator *diagnosticAccumulator) (*Loaded[T], error) {
|
||||
|
||||
Reference in New Issue
Block a user