Детерминированное воспроизведение

THotPDF.DeterministicReplayLog фиксирует внешние решения, из-за которых операция может вести себя по-разному между запусками, а при воспроизведении подставляет записанные результаты

Фиксируемые решения

Запись и воспроизведение

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;

Порядок и валидация

Каждое событие несёт монотонный порядковый номер, тип события, имя, два знаковых 64-битных аргумента и типизированный результат

Воспроизведение потребляет события по порядку и проверяет их полную сигнатуру, прежде чем вернуть записанный результат: в строгом режиме при исчерпании или расхождении выбрасывается EHPDFDeterministicReplayMismatch, а нестрогий режим сохраняет счётчик расхождений и диагностику и использует наблюдаемый результат

CompleteReplay завершается успешно, только когда все сохранённые события потреблены без расхождений и без потерянных при записи событий

Ограничения и производительность

EventLimit по умолчанию равен 100 000 событий, DroppedEventCount сообщает о переполнении, а хранилище событий растёт геометрически, так что добавление остаётся амортизированно константным по времени

Схема JSON — hotpdf-deterministic-replay-v1: 64-битные аргументы и целочисленные результаты кодируются десятичными строками, чтобы точные значения сохранялись в любых реализациях JSON

Связанные API