Ошибки отложенной записи - PullRequest
1 голос
/ 21 июля 2011

В течение последних нескольких месяцев мы теряли данные из-за ошибок отложенной записи. Я столкнулся с ошибкой как с пользовательским кодом, так и с приложениями для сжатия. Например, приведенное ниже сообщение об ошибке пришло из Visual Studio 2008 при создании решения

Windows - Ошибка отложенной записи: Windows не удалось сохранить все данные для файла \ Vital \ Source \ Other \ OCHSHP \ Done07 \ LHFTInstaller \ Release \ LHFAI.CAB. данные были потеряны. Эта ошибка может быть вызвана отказом вашего компьютерное оборудование или сетевое подключение. Пожалуйста, попробуйте сохранить этот файл в другом месте.

Когда это происходит, например, в Adobe, Visual Studio или Word, никакого вреда не причиняется. Основная проблема возникает, когда это происходит с нашими пользовательскими приложениями (обычные приложения C, которые записывают данные в файлы dBase на общий сетевой ресурс).

С точки зрения программы запись успешна. Он удаляет исходные данные и переходит к следующей записи. Через несколько минут в Windows появляется сообщение об ошибке, в котором говорится, что произошла отложенная запись и данные были потеряны.

У меня вопрос: что мы можем сделать, чтобы help наши сетевые / серверные команды изолировали и исправили проблему (прочитайте, убедите их, что проблема реальна. Просто скажи им много, много раз до сих пор их не убедили) и есть ли у вас какие-либо предложения о том, как мы можем написать, чтобы избежать потери данных?

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Записи в Windows, как и в любой современной операционной системе, на самом деле не отправляются на диск до тех пор, пока ОС не получит доступ к нему.Это большой выигрыш в производительности, но проблема (как вы обнаружили) заключается в том, что вы не можете обнаружить ошибки во время записи.

Каждая операционная система, которая выполняет асинхронную запись, также предоставляет механизмы для принудительного переноса данных на диск.,В Windows функция FlushFileBuffers или _commit поможет.(Один для HANDLE с, другой для файловых дескрипторов.)

Обратите внимание, что необходимо проверить возвращаемое значение каждой записи на диск, и возвратзначение этих синхронизирующих функций, чтобы быть уверенным, что данные попали на диск.Также обратите внимание, что эти функции блокируют и ждут, пока данные попадут на диск - даже если вы выполняете запись на сетевой сервер - поэтому они могут работать медленно.Не вызывайте их до тех пор, пока вам действительно не потребуется отправить данные в стабильное хранилище.

Подробнее см. fsync () на разных платформах .

1 голос
/ 21 июля 2011

У вас поврежденная файловая система или сбой жесткого диска. Сетевая / серверная группа должна сканировать диск, чтобы исправить первое и обнаружить второе. Также проверьте журнал ошибок, чтобы увидеть, говорит ли он вам что-нибудь. Если в журнале ошибок указана ошибка записи на аппаратное обеспечение, необходимо заменить диск.

...