
Проход анализа
Во время прохода анализа (analysis pass) NTFS просматривает журнал транзакций в прямом направлении, начиная с последней операции контрольной точки, с тем, чтобы найти записи модификации и обновить скопированные ранее в память таблицы транзакций и измененных страниц. Обратите внимание (рис. 4-5), что операция контрольной точки помещает в журнал транзакций три записи, между которыми могут оказаться записи модификации. NTFS должна начать сканирование с начала операции контрольной точки.
Рис. 4-5. Проход анализа.
Каждая запись модификации, расположенная в журнале после начала операции контрольной точки, представляет собой изменение либо таблицы транзакций, либо таблицы измененных страниц. Например, если запись модификации — это запись "подтверждение транзакции", то та транзакция, которую представляет данная запись, должна быть удалена из таблицы транзакций. Аналогично, если запись модификации — это запись "обновление страницы", которая изменяет структуру данных ФС, то необходимо внести соответствующую поправку в таблицу измененных страниц.
После того как таблицы в памяти приведены в актуальное состояние, NTFS просматривает их, чтобы определить LSN самой старой записи модификации, регистрирующей операцию, которая не была выполнена над диском. Таблица транзакций содержит LSN неподтвержденных (незавершенных) транзакций, а таблица измененных страниц — LSN записей, соответствующих модификациям кэша, которые не были переписаны на диск. LSN самой старой записи, найденной NTFS в этих двух таблицах, определяет, откуда начнется проход повтора. Однако если последняя запись контрольной точки окажется более ранней, то NTFS начинает проход повтора с нее.
Проход повтора
На проходе повтора (redo pass) NTFS сканирует журнал транзакций в прямом направлении, начиная с LSN самой старой записи, которая была обнаружена на проходе анализа (рис. 4-6). Она ищет записи "обновление страницы", содержащие модификации тома, которые были запротоколированы до сбоя системы, но не сброшены из кэша на диск. NTFS повторяет эти обновления в кэше.
Когда NTFS достигает конца журнала транзакций, она уже обновила кэш необходимыми модификациями тома, и средство отложенной записи диспетчера КЭШа может начать переписывать содержимое КЭШа на диск в фоновом режиме.
Рис. 4-6. Проход повтора.
Проход отмены
Завершив проход повтора, NTFS начинает проход отмены (undo pass), откатывая все транзакции, не подтвержденные к моменту сбоя системы. На рис. 4-7 показаны две транзакции в журнале; транзакция 1 была подтверждена до сбоя системы, а транзакция 2 — нет. NTFS должна отменить транзакцию 2.
Рис. 4-7. Проход отмены.
Предположим, что транзакция 2 создавала файл. Эта операция состоит из трех подопераций, и каждая из них имеет свою запись модификации. Записи модификации, относящиеся к одной транзакции, связаны в журнале при помощи указателей назад, поскольку они обычно не следуют непосредственно одна за другой.
В таблице транзакций NTFS для каждой незавершенной транзакции хранится LSN записи модификации, которая была помещена в журнал последней. В данном примере таблица транзакций указывает, что для транзакции 2 это запись с LSN 4049. NTFS выполняет откат транзакции 2, как показано на рис. 4-8 (справа налево).
Рис. 4-8. Отмена транзакции.
Каждая запись модификации содержит информацию двух видов: как повторить подоперацию и как отменить ее. После обнаружения LSN 4049 NTFS находит информацию отмены и выполняет отмену, очищая биты с 3 своей битовой карте. Затем NTFS переходит по указателю назад к LSN ИИ который указывает ей удалить новое имя файла из индекса имен файлов. Наконец, NTFS переходит по последнему указателю и освобождает файловую запись MFT, зарезервированную для данного файла, в соответствии с информацией из записи модификации с LSN 4046. На этом откат транзакции 2 закончен. Если имеются другие незавершенные транзакции, то NTFS повторяете же процедуру для их отката. Поскольку отмена транзакций изменяет структуру ФС на томе, NTFS должна протоколировать операцию отмены в журнале транзакций. В конце концов, во время восстановления может снова произойти сбой питания, и NTFS придется выполнить повтор операций отмены.
Когда проход отмены завершен, целостность тома восстановлена. В этот момент NTFS сбрасывает на диск изменения кэша, чтобы гарантировать правильность содержимого тома. Далее NTFS записывает пустую область рестарта. указывающую, что том находится в нормальном состоянии и что, если система сразу же потерпит еще одну аварию, никакого восстановления не потребуется. На этом восстановление завершается.
NTFS не только применяет журнал транзакций для восстановления том„ но также использует те преимущества, которые дает протоколирование транзакций. ФС обязательно содержат большое количество кода для обработки ошибок, возникающих в процессе нормального ввода-вывода. Поскольку NTFS протоколирует каждую транзакцию, модифицирующую структуру тома, она может использовать журнал транзакций для восстановления после ошибок ФС и, таким образом, существенно упростить код обработки ошибок. Ошибка "переполнение журнала транзакций", описанная в разд. 4.2.2.2, — это один из примеров использования протоколирования транзакций для обработки ошибок.
Обратите внимание, что большинство ошибок ввода-вывода, получаемых программой, не являются ошибками ФС и, таким образом, NTFS не может их исправить самостоятельно. Например, получив запрос на создание файла NTFS может начать с создания файловой записи в MFT, после чего ввести им файла в индекс каталога. Однако при попытке выделить по своей битовой карте пространство для нового файла она может обнаружить, что диск переполнен, и запрос на создание файла не удается успешно завершить. В этом случае NTFS использует информацию журнала транзакций для отмены уже выполненной части операции и освобождения структур данных, зарезервированных ею для файла. Затем ошибка "диск переполнен" возвращается вызывающей программе, которая и должна предпринять соответствующие действия.