Клиент AFP, кэширующийся

В этой главе описываются как клиент AFP в OS X v10.2 и более поздние данные кэшей прежде, чем отправить его в сервер AFP.

Во-первых, некоторые условия и определения:

Кэширование данных файла

По умолчанию клиент AFP использует UBC для данных файла кэша за следующими исключениями:

Клиент 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 секунд:

Этот алгоритм основывается на кэшировании метаданных 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, могут быть отключены, Углерод может все еще кэшировать информацию о ветвлении как продолжительность ветвления и текущая позиция ветвления.