確定性重放
THotPDF.DeterministicReplayLog 擷取可能使作業在不同執行間行為不同的外部決策,然後在重放期間取代記錄的結果
擷取的決策
- 取消檢查點記錄作業名稱與是否已要求取消
- 漸進式隨機存取探查記錄確切的位元組偏移、位元組數與可用性結果
- 布林與 64 位元整數回呼輔助函式記錄穩定的回呼名稱、兩個呼叫端定義的上下文值與傳回的結果
- 透過
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 實作之間保留確切的值