Publication atomique de fichiers sous Windows
La sauvegarde des documents headless prépare et vide un fichier de staging exclusif dans le répertoire de destination avant de publier ses octets complets par remplacement atomique
Sous Windows, les échecs transitoires ERROR_ACCESS_DENIED, ERROR_SHARING_VIOLATION et ERROR_LOCK_VIOLATION autorisent au plus huit tentatives MoveFileEx avec MOVEFILE_REPLACE_EXISTING et MOVEFILE_WRITE_THROUGH
Les attentes entre tentatives sont de 1, 2, 4, 8, 16, 16 et 16 millisecondes, soit au plus 63 millisecondes d'attentes demandées ; l'ordonnancement du système d'exploitation et la durée des syscalls déterminent le temps réellement écoulé
L'annulation est observée avant chaque tentative et avant et après chaque attente ; un remplacement atomique réussi et terminé constitue la frontière de publication
Un verrouillage permanent ou des restrictions d'accès préservent la destination d'origine et signalent la dernière erreur Windows capturée ; les autres erreurs du système d'exploitation échouent immédiatement
Les sauvegardes de documents en échec nettoient leurs fichiers de staging ; la publication ne supprime pas une destination existante et ne retombe pas sur une copie partielle
Le même chemin privé publie les sauvegardes ordinaires, les PDF signés et les horodatages de documents autonomes ; Linux continue d'utiliser son chemin fsync et rename
Acceptation réelle
Les tests détiennent de vrais handles de fichiers Windows refusant la suppression, libèrent un verrou transitoire sur un autre thread, conservent des verrous permanents, annulent pendant les tentatives et essayent un remplacement en lecture seule
Chaque cible Windows effectue aussi 500 remplacements atomiques complets et 50 sauvegardes réelles de documents avec relecture native, en préservant les octets du source et en vérifiant le nettoyage des fichiers de staging
Une sonde séparée utilisant uniquement la WinAPI reproduit la panne d'origine intermittente d'accès refusé sans HotPDF ni Cairo ; cela identifie la frontière de publication sans attribuer la cause à un processus non observé