Replay Deterministico
THotPDF.DeterministicReplayLog cattura le decisioni esterne che possono far comportare diversamente un'operazione tra esecuzioni diverse, poi sostituisce i risultati registrati durante il replay
Decisioni catturate
- I checkpoint di cancellazione registrano il nome dell'operazione e se la cancellazione è stata richiesta
- I probe random-access del rendering progressivo registrano l'offset esatto in byte, il numero di byte e il risultato di disponibilità
- Gli helper di callback booleani e a intero 64 bit registrano un nome di callback stabile, due valori di contesto definiti dal chiamante e il risultato restituito
- Il filtraggio delle annotazioni e la cancellazione del rendering a tile usano il replay log automaticamente durante registrazione o replay tramite
THotPDF
Registrazione e 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;
Ordinamento e validazione
Ogni evento porta un numero di sequenza monotono, un tipo di evento, un nome, due argomenti interi con segno a 64 bit e un risultato tipizzato
Il replay consuma gli eventi in ordine e valida la loro firma completa prima di restituire il risultato registrato; la modalità strict solleva EHPDFDeterministicReplayMismatch in caso di esaurimento o divergenza, mentre la modalità non strict mantiene un conteggio dei mismatch e una diagnostica e usa il risultato osservato
CompleteReplay ha successo solo dopo che ogni evento conservato è stato consumato senza mismatch né eventi di registrazione scartati
Limiti e prestazioni
EventLimit vale 100.000 eventi per default, DroppedEventCount riporta l'overflow, e lo storage degli eventi cresce geometricamente così che il costo di append resti ammortizzato costante
Lo schema JSON è hotpdf-deterministic-replay-v1; gli argomenti a 64 bit e i risultati interi sono codificati come stringhe decimali per preservare i valori esatti tra implementazioni JSON diverse