Pubblicazione atomica dei file su Windows

Il salvataggio dei documenti headless prepara e scarica un file di staging esclusivo nella directory di destinazione prima di pubblicarne i byte completi tramite sostituzione atomica

Su Windows, i fallimenti transitori ERROR_ACCESS_DENIED, ERROR_SHARING_VIOLATION e ERROR_LOCK_VIOLATION consentono al massimo otto tentativi di MoveFileEx con MOVEFILE_REPLACE_EXISTING e MOVEFILE_WRITE_THROUGH

Le attese tra i tentativi sono di 1, 2, 4, 8, 16, 16 e 16 millisecondi, per un totale di al massimo 63 millisecondi di attese richieste; la schedulazione del sistema operativo e la durata delle syscall determinano il tempo effettivamente trascorso

La cancellazione viene osservata prima di ogni tentativo e prima e dopo ogni attesa; una sostituzione atomica completata con successo è il confine della pubblicazione

Blocchi permanenti o restrizioni di accesso preservano la destinazione originale e riportano l'ultimo errore Windows catturato; gli altri errori del sistema operativo falliscono immediatamente

I salvataggi dei documenti falliti ripuliscono i loro file di staging; la pubblicazione non elimina una destinazione esistente né ripiega su una copia parziale

Lo stesso percorso privato pubblica salvataggi ordinari, PDF firmati e timestamp di documento autonomi; Linux continua a usare il suo percorso fsync e rename

Acceptance reale

I test trattengono veri handle Windows che negano la cancellazione, rilasciano un blocco transitorio su un altro thread, trattengono blocchi permanenti, cancellano durante il retry e tentano la sostituzione su file di sola lettura

Ogni target Windows esegue anche 500 sostituzioni atomiche complete e 50 salvataggi reali di documenti con ricaricamento nativo, preservando i byte della sorgente e controllando la pulizia dei file di staging

Una sonda separata solo WinAPI riproduce l'originale fallimento intermittente access-denied senza HotPDF o Cairo; questo identifica il confine della pubblicazione senza attribuire la causa a un processo non osservato

SaveToFile · Workflow di firma