fs.write ();fs.flush ();Когда это действительно записано на диск?Что делать, если ядро ​​вызывает панику или отключение питания? - PullRequest
0 голосов
/ 17 июня 2011

Мне нужно реализовать некоторые атомарные записи во вторичное хранилище. Как я могу сделать это доказательство дурака?

Если я открою дескриптор файла C # с помощью File.Open, я получу дескриптор. Я могу написать некоторые данные к нему. Промойте и закройте. Но у меня все еще есть некоторые вопросы. Я полагаю, что приведенные ниже утверждения верны?

  • Данные могут быть не записаны на диск, а скорее существуют в кэше диска Windows

  • Данные могут быть не записаны на диск, а существуют в кеше жесткого диска

И это приведет к следующим проблемам:

  • Отключение питания приведет к отмене изменений в файле, который я сделал (на транзакционной ФС, такой как NTFS)

  • Из-за паники ядра изменения в файле, которые я сделал, будут отменены (на транзакционной ФС, такой как NTFS)

Я прав в своих предположениях? Если так, как я могу сделать запись на диск? Я немного заглянул в NoSQL и подумал, что может быть сервер nosql, который может взаимодействовать с системой ближе к аппаратному обеспечению и не возвращать мне программное обеспечение, пока не сможет гарантировать запись байтов на диск.

Все идеи и мысли приветствуются

Jens

[править] Может быть, я могу подождать некоторое время, прежде чем быть уверенным, что все изменения записаны на физический диск?

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Единственный способ сделать операцию полностью защищенной от ошибок - это поставить в очередь, запустить операцию и подтвердить.Вещи остаются в очереди и могут быть запущены снова, пока не будет подтверждено, или если подтверждение отрицательное «откат».

Окно времени, о котором вы говорите, при условии, что вы не задействуете сеть (все локально), очень маленький.Тем не менее, если вы хотите обеспечить вещи, вы ставите их в очередь.MSMQ является одним из вариантов.Если данные поступают с SQL Server, вы можете рассмотреть его механизм организации очередей Service Broker (не рекомендует это направление, но это один из способов).

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

0 голосов
/ 17 июня 2011

Я не специалист по внутренним компонентам Windows, но я верю, что вы правы.Я не тестировал его очень подробно, но смог использовать MSMQ как довольно надежное место для хранения данных, с другим процессом, который контролировал очередь для окончательной обработки.

...