Детерминированное воспроизведение
THotPDF.DeterministicReplayLog фиксирует внешние решения, из-за которых операция может вести себя по-разному между запусками, а при воспроизведении подставляет записанные результаты
Фиксируемые решения
- Контрольные точки отмены записывают имя операции и то, запрашивалась ли отмена
- Пробы прогрессивного произвольного доступа записывают точное смещение в байтах, количество байт и результат доступности
- Boolean- и 64-битные целочисленные callback-хелперы записывают стабильное имя callback, два заданных вызывающим контекстных значения и возвращённый результат
- Фильтрация аннотаций и отмена tile-рендеринга автоматически используют журнал воспроизведения при записи или воспроизведении через
THotPDF
Запись и воспроизведение
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