Атомарная публикация файлов в 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; так граница публикации локализуется без приписывания причины ненаблюдаемому процессу

SaveToFile · Рабочие процессы подписания