Fix XLG serialization crash when strong fingerprint computation fails (#114)

During cache lookup strong fingerprint computation, if ObservedInputProcessingStatus is not "Success", the strong fingerprint cannot be computed and a cache miss is forced.

In this case, make sure the strong fingerprint inputs retrieved from cache are logged to the XLG rather than some invalid defaults, even if the cache data could not be used to compute a strong fingerprint.

Fixes AB#1504534
This commit is contained in:
Annie Fu 2019-04-09 15:59:21 -07:00 коммит произвёл GitHub
Родитель b1e469ddee
Коммит 5e264333ba
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 16 добавлений и 10 удалений

Просмотреть файл

@ -1865,9 +1865,9 @@ namespace BuildXL.Scheduler
}
var pathSet = maybePathSet.Value;
(ObservedInputProcessingResult observedInputProcessingResult, StrongContentFingerprint? strongContentFingerPrint, ObservedPathSet pathSetUsed, ContentHash pathSetHashUsed)
(bool succeeded, ObservedInputProcessingResult observedInputProcessingResult, StrongContentFingerprint? strongContentFingerprint, ObservedPathSet pathSetUsed, ContentHash pathSetHashUsed)
strongFingerprintComputationResult =
await ComputeStrongFingerprintBasedOnPriorObservedPathSetAsync(
await TryComputeStrongFingerprintBasedOnPriorObservedPathSetAsync(
operationContext,
environment,
state,
@ -1876,10 +1876,16 @@ namespace BuildXL.Scheduler
pathSet,
entryRef.PathSetHash);
BoxRef<ProcessStrongFingerprintComputationData> strongFingerprintComputationData = new ProcessStrongFingerprintComputationData(
pathSet: strongFingerprintComputationResult.pathSetUsed,
pathSetHash: strongFingerprintComputationResult.pathSetHashUsed,
priorStrongFingerprints: new List<StrongContentFingerprint>(1) { entryRef.StrongFingerprint });
// Record the most relevant strong fingerprint information, defaulting to information retrieved from cache
BoxRef<ProcessStrongFingerprintComputationData> strongFingerprintComputationData = strongFingerprintComputationResult.succeeded
? new ProcessStrongFingerprintComputationData(
pathSet: strongFingerprintComputationResult.pathSetUsed,
pathSetHash: strongFingerprintComputationResult.pathSetHashUsed,
priorStrongFingerprints: new List<StrongContentFingerprint>(1) { strongFingerprintComputationResult.strongContentFingerprint.Value })
: new ProcessStrongFingerprintComputationData(
pathSet: pathSet,
pathSetHash: entryRef.PathSetHash,
priorStrongFingerprints: new List<StrongContentFingerprint>(1) { entryRef.StrongFingerprint });
strongFingerprintComputationList.Add(strongFingerprintComputationData);
@ -1889,7 +1895,7 @@ namespace BuildXL.Scheduler
switch (processingStatus)
{
case ObservedInputProcessingStatus.Success:
strongFingerprint = strongFingerprintComputationResult.Item2;
strongFingerprint = strongFingerprintComputationResult.strongContentFingerprint;
Contract.Assume(strongFingerprint.HasValue);
strongFingerprintComputationData.Value = strongFingerprintComputationData.Value.ToSuccessfulResult(
@ -3103,7 +3109,7 @@ namespace BuildXL.Scheduler
/// Note that if the returned processing status is <see cref="ObservedInputProcessingStatus.Aborted"/>, then a failure has been logged and pip
/// execution must fail.
/// </summary>
private static async Task<(ObservedInputProcessingResult, StrongContentFingerprint?, ObservedPathSet, ContentHash)> ComputeStrongFingerprintBasedOnPriorObservedPathSetAsync(
private static async Task<(bool, ObservedInputProcessingResult, StrongContentFingerprint?, ObservedPathSet, ContentHash)> TryComputeStrongFingerprintBasedOnPriorObservedPathSetAsync(
OperationContext operationContext,
IPipExecutionEnvironment environment,
PipExecutionState.PipScopeState state,
@ -3132,7 +3138,7 @@ namespace BuildXL.Scheduler
// force cache miss if observed input processing result is not 'Success'
if (validationResult.Status != ObservedInputProcessingStatus.Success)
{
return (validationResult, default(StrongContentFingerprint?), default(ObservedPathSet), default(ContentHash));
return (false, validationResult, default(StrongContentFingerprint?), default(ObservedPathSet), default(ContentHash));
}
// check if now running with safer options than before (i.e., prior are not strictly safer than current)
@ -3165,7 +3171,7 @@ namespace BuildXL.Scheduler
finalPathSetHash);
}
return (validationResult, strongFingerprint, finalPathSet, finalPathSetHash);
return (true, validationResult, strongFingerprint, finalPathSet, finalPathSetHash);
}
}