Атомарная публикация файлов в Windows
Сохранение headless-документа готовит и сбрасывает на диск монопольный staging-файл в каталоге назначения, прежде чем опубликовать его полные байты через атомарную замену
В Windows преходящие сбои ERROR_ACCESS_DENIED, ERROR_SHARING_VIOLATION и ERROR_LOCK_VIOLATION допускают не более восьми попыток MoveFileEx с MOVEFILE_REPLACE_EXISTING и MOVEFILE_WRITE_THROUGH
Паузы между попытками — 1, 2, 4, 8, 16, 16 и 16 миллисекунд, суммарно не более 63 миллисекунд запрошенных ожиданий; реальное время определяют планировщик ОС и длительность syscall
Отмена проверяется перед каждой попыткой и до и после каждой паузы; граница публикации — завершившаяся успешная атомарная замена
Постоянная блокировка или ограничения доступа сохраняют исходное назначение и сообщают последнюю захваченную ошибку Windows; прочие ошибки ОС завершаются сразу
Неудачные сохранения документа убирают свои staging-файлы; публикация не удаляет существующее назначение и не откатывается к частичной копии
Тем же приватным путём публикуются обычные сохранения, подписанные PDF и автономные метки времени документа; Linux продолжает использовать свой путь с fsync и rename
Реальная приёмка
Тесты держат настоящие дескрипторы файлов Windows, запрещающие удаление, снимают преходящую блокировку в другом потоке, удерживают постоянные блокировки, отменяют операцию во время повтора и пробуют замену файла, доступного только для чтения
Каждый Windows-таргет также выполняет 500 полных атомарных замен и 50 реальных сохранений документа с нативной перезагрузкой, проверяя сохранность исходных байтов и уборку staging-файлов
Отдельный зонд только на WinAPI воспроизводит исходный перемежающийся сбой access denied без HotPDF и Cairo; так граница публикации локализуется без приписывания причины ненаблюдаемому процессу