
664 Глава 10. Распределенные файловые системы
После явного определения метаданных выяснить ход сеанса достаточно про-
сто.
Начнем с рассмотрения серий одновременных сеансов, происходящих в од-
ном разделе сети. Для простоты предположим, что этот раздел расположен на
одном сервере. Когда клиент начинает сеанс, процесс Venus на клиентской ма-
шине получает от сервера все данные, содержащиеся в наборах операций чтения
и записи, в предположении, что правила совместного использования файлов, опи-
санные ранее, не нарушены. Для этого он устанавливает необходимые блокиров-
ки чтения и записи.
В этом месте необходимо сделать два важных замечания. Во-первых, посколь-
ку Coda может автоматически определять тип сеанса по системному вызову (пер-
вому),
который делает приложение, и знает, какие метаданные можно читать и
модифицировать в каждом типе сеанса, процесс Venus догадывается, какие дан-
ные будут получены с сервера в начале сеанса. В результате он может установить
необходимые блокировки в самом начале сеанса.
Второе замечание состоит в том, что раз уж семантика разделения файлов на
практике выглядит как предварительная установка всех необходимых блоки-
ровок, то используемый при этом подход практически аналогичен технологии
двухфазной блокировки (2PL), которую мы разбирали в главе 5. Важным свой-
ством 2PL является возможность упорядочения всех запланированных операций
чтения и записи в параллельных сеансах.
Обсудим теперь выполнение сеансов при наличии разделов. Основная про-
блема состоит в том, что теперь необходимо разрешать конфликты между разде-
лами. С этой целью Coda использует простую схему версий. Каждый файл имеет
соответствующий ему номер версии, который показывает, сколько раз в него вно-
сились изменения с тех пор, как он был создан. Как и в предыдущем случае, когда
клиент начинает сеанс, на машину клиента копируются все данные, связанные
с этим сеансом, включая номер версии, соответствующий каждому из элементов
данных.
Предположим, пока клиент выполняет один или более сеансов, происходит раз-
деление сети, при котором клиент и сервер отсоединяются друг от друга. Venus
позволяет клиенту продолжить и закончить выполнение данного сеанса, как
будто ничего не случилось, в соответствии с описанной ранее транзакционной
семантикой для одного раздела. Позднее, после того как соединение с сервером
будет восстановлено, изменения будут переданы на сервер в том же порядке, в ко-
тором они происходили на клиенте.
Когда изменения, сделанные в файле /, передаются на сервер, мы априори
считаем, что другие процессы за то время, пока клиент был отсоединен от серве-
ра, не изменяли информацию в файле /. Конфликт подобного рода может быть
легко обнаружен путем сравнения номеров версий. Пусть
Vdient —
номер версии
/, полученной с сервера при передаче файла клиенту. Пусть
Nupdates
— число
изменений за прошедший сеанс, переданных клиентом и принятых сервером по-
сле повторного подключения. И наконец, пусть
Vnow —
текущий номер версии /,
находящейся на сервере. В этом случае следующее обновление / в ходе сеанса
с клиентом будет принято только в том случае, если выполняется условие:
^now "*" i ~ ^client ' ^updates •