Deterministic Replay

THotPDF.DeterministicReplayLog captura decisiones externas que pueden hacer que una operación se comporte distinto entre ejecuciones, y luego sustituye los resultados grabados durante el replay

Decisiones capturadas

Grabación y replay

var
  ReplayJSON: AnsiString;
begin
  PDF.DeterministicReplayLog.BeginRecording;
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  ReplayJSON := PDF.DeterministicReplayLog.ExportJSON;

  PDF.DeterministicReplayLog.ImportJSON(ReplayJSON);
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  if not PDF.DeterministicReplayLog.CompleteReplay then
    raise Exception.Create(PDF.DeterministicReplayLog.LastDiagnostic);
end;

Ordenamiento y validación

Cada evento lleva un número de secuencia monótono, un tipo de evento, un nombre, dos argumentos enteros con signo de 64 bits y un resultado tipado

El replay consume los eventos en orden y valida su firma completa antes de devolver el resultado grabado; el modo estricto lanza EHPDFDeterministicReplayMismatch ante agotamiento o divergencia, mientras que el modo no estricto retiene un conteo de mismatches y un diagnóstico, y usa el resultado observado

CompleteReplay solo tiene éxito después de que todos los eventos retenidos se hayan consumido sin mismatches ni eventos de grabación descartados

Límites y rendimiento

EventLimit es 100,000 eventos por defecto, DroppedEventCount reporta el overflow, y el almacenamiento de eventos crece geométricamente para que el costo de append se mantenga en tiempo constante amortizado

El schema JSON es hotpdf-deterministic-replay-v1; los argumentos de 64 bits y los resultados enteros se codifican como cadenas decimales para preservar los valores exactos entre implementaciones JSON

APIs relacionadas