in wrappers/validators/comparator-validator.ts [219:286]
validation: async (root: IBuiltStage, subtree: IBuiltStage) => {
/* signal ingestion to move to timeout phase */
signalMoveToTimeoutIngestion();
/* wait for grace timeout phase */
const graceStartTime = Date.now();
const validationCompleted = await ingestionCompleteOrTimeout();
const validationGraceDuration = ingestionLatestTime - graceStartTime;
/* ingest source generator logs */
const stageGeneratorLogCount = config.stageGeneratorLogCount ?? validationLogTotalCount;
for (let i = 0; i < stageGeneratorLogCount; ++i) {
const stageLog = await stageGeneratorInstance.next();
if (stageLog.value === null) {
break;
}
ingestStageLogBatch(stageLog.value);
if (stageLog.done) {
break;
}
}
/* verify logs in both + only_stage_log */
let duplicate = 0;
let loss = 0;
for (const myHash in stageLogHashCounts) {
const stageCount = stageLogHashCounts[myHash] ?? 0;
const validationCount = validationLogHashCounts[myHash] ?? 0;
if (stageCount > validationCount) {
loss += stageCount - validationCount;
}
if (validationCount > stageCount) {
duplicate += validationCount - stageCount;
}
}
/* verify logs in only_validation_count */
for (const myHash in validationLogHashCounts) {
if (stageLogHashCounts.hasOwnProperty(myHash)) {
/* In stageHashCounts */
continue;
}
const validationCount = validationLogHashCounts[myHash] ?? 0;
duplicate += validationCount;
}
/* additional metrics */
const testDuration = Date.now() - testStartTime;
const validationGraceAndMetricsDuration = Date.now() - graceStartTime;
return {
isValidationSuccess: true,
// Other data can be added here for validation metric collection.
validationData: {
testDuration: testDuration,
validationLogTotalCount: validationLogTotalCount,
duplicate: duplicate,
loss: loss,
validationGraceDuration: validationGraceDuration,
validationGraceAndMetricsDuration: validationGraceAndMetricsDuration,
isValidationCompleted: validationCompleted,
} as IComparatorWrapperMetrics,
/* May want to add hidden validation data */
};
},