Клиент AFP, кэширующийся
В этой главе описываются как клиент AFP в OS X v10.2 и более поздние данные кэшей прежде, чем отправить его в сервер AFP.
Во-первых, некоторые условия и определения:
Universal Buffer Cache (UBC) — Кэш страницы, включающий кэширование данных файла, поддержку I/O с отображенной памятью, и т.д. Буферный кэш, как говорят, объединен, потому что он существует как часть нормальной виртуальной памяти физическое множество свободных страниц, а не как отдельно управляемый буфер.
Грязные данные файла — Данные, измененные в UBC, но это еще не было выписано к постоянному хранению (к диску или файловому серверу).
Непротиворечивость кэша — Непротиворечивость между данными клиента в UBC и данными по серверу.
ubc_clean— Подпрограмма, выставляющая к хранению любые грязные данные файла в виртуальной памяти и это выпускает любые буферы в UBC, связанном с допустимыми чистыми страницами. Дополнительно, страницы в виртуальной памяти могут быть отброшены.Кластерные подпрограммы —
cluster_read,cluster_write, и т.д. Маленькое чтение и запись группы этих подпрограмм вызывают в большее, выровненное страницей чтение и вызовы записи, использующие в своих интересах UBC. Если запрошенные данные уже находятся в UBC, вызов завершается с помощью локальных данных.
Кэширование данных файла
По умолчанию клиент AFP использует UBC для данных файла кэша за следующими исключениями:
Файлы, для которых установлены блокировки диапазона байта
Файлы, которые являются символьными ссылками
Клиент AFP проверяет непротиворечивость кэша во время следующих операций:
Открывается — Когда клиент AFP закрывает файл на сервере, это сохраняет дату последнего изменения файла. В следующий раз, когда клиент открывает файл, он сравнивает текущую дату последнего изменения файла с датой последнего изменения, которую сохранил клиент. Если даты не соответствуют, клиент предполагает, что другой клиент изменил файл и вызовы
ubc_cleanотбрасывать текущие кэшированные данные.Чтения и записи — клиент AFP реализуют частично как Виртуальная файловая система и таким образом могут вызвать процессы ядра, а также пользовательские процессы. Процессы ядра могут сделать чтение и записать вызовы без первого создания открытого. Когда вызвано процессом ядра, клиент делает прослушивание прежде, чем сделать операцию чтения или операцию записи. Прежде чем прослушивание сделано, клиент сравнивает текущую дату модификации файла на сервере с сохраненной датой модификации клиента. Если даты не соответствуют, клиент предполагает, что другой клиент изменил файл и вызовы
ubc_cleanотбрасывать текущие кэшированные данные.Попытки получить доступ к файлу на сервере после сервера отправили пакет Внимания Изменения Объема, когда DenyWrite не установлен для файла — текущая дата модификации файла на сервере по сравнению с сохраненной датой модификации клиента. Если текущие данные модификации сервера отличаются от сохраненной даты модификации клиента, клиентских вызовов
ubc_cleanотбрасывать текущие кэшированные данные. Если сервер не поддерживает пакет Внимания Изменения Объема, клиент AFP должен опросить сервер в максимальном интервале десяти секунд для проверки на изменения.
Кэширование метаданных файла
Метаданные каждого файла сохраняются в vnode структуре для того файла. Клиент AFP должен проверить метаданные файла на когерентность с сервером, когда клиент AFP получает доступ к vnode после того, как сервер отправил пакет Внимания Изменения Объема. Каждый vnode содержит метку времени последнего пакета Внимания Изменения Объема, заставившего этот vnode быть обновленным. Если метка времени последнего Внимания Изменения полученной громкости отличается от метки времени в этом vnode, метаданные файла этого vnode должны быть устаревшими, и клиент AFP должен отправить запрос для последней информации к серверу.
Каждый раз, когда клиент AFP должен использовать дату Модификации файла или информацию о размере ветвления, это должно попросить у сервера текущей информации. Чтобы препятствовать тому, чтобы сервер был лавинно разослан запросами, клиенты AFP должны ограничить свои запросы на метаданные к одному запросу в секунду.
Кроме того, метаданные файла в кэшах AFP имеют максимальное значение Времени жизни (TTL). Когда у двух клиентов есть файл, открытый одновременно, этот TTL предназначается для помощи. Без этого таймера, если бы один клиент пишет в файл, но никогда не закрывает его, тогда пакет внимания изменения объема никогда не отправлялся бы сервером, таким образом, второй клиент никогда не будет видеть, что изменяется EOF.
Из-за таймера TTL, когда второй клиент проверяет EOF, если никакой пакет внимания изменения объема не был получен, но истек таймер TTL, клиент запрашивает последнюю информацию от сервера так или иначе. Это действительно не опрашивает, по сути, потому что только происходит, когда к vnode получают доступ. Если к vnode никогда не получают доступ, TTL не имеет никакого значения.
Недавно измененные файлы, как предполагается, более вероятно, изменяются, чем файлы, не изменившиеся в некоторое время. Поэтому TTL определяется путем занимания количества времени, так как файл был в последний раз изменен, деля значение 10, и ограничив минимальные и максимальные значения.
Например, со значениями TTL по умолчанию 5 и 60 секунд:
Метаданные для файла изменили, меньше чем 50 секунд назад имеет TTL 5 секунд (минимальный TTL).
Метаданные для файла, измененного между 50 и 600 секундами (10 минут) назад, имеют TTL времени начиная с последнего изменения, разделенного на 10 (другими словами, 5–60 секунд).
Метаданные для файла изменили больше чем 600 секунд (10 минут) имеют TTL 60 секунд (максимальный TTL).
Этот алгоритм основывается на кэшировании метаданных NFS.
Управление кэшированием
Существует два способа отключить данные, кэширующиеся в клиенте AFP и получить доступ к текущим данным по серверу:
Используйте noCacheMask флаг. Посмотрите Техническое примечание FL16 для получения дополнительной информации о том, как использовать noCacheMask флаг.
Используйте fcntl обратитесь к дескриптору файла, как в следующих примерах:
(void) fcntl(fd, F_NOCACHE, 1); /* turn off data caching */ |
(void) fcntl(fd, F_NOCACHE, 0); /* turn on data caching */ |
Обратите внимание на то, что даже при том, что данные, кэширующиеся в клиенте AFP, могут быть отключены, Углерод может все еще кэшировать информацию о ветвлении как продолжительность ветвления и текущая позиция ветвления.