Основная таблица поиска предлагает доступ к единому концептуальному дереву из узлов. Для этого он перечисляет все пути имен к узлам. Некоторые узлы являются каталогами. Единственные данные принадлежат конечным узлам, не относящимся к каталогу. Например, эти пути:
/a/b/foo
/a/b/c/bar
/a/baz/
опишите это дерево:
\
a/--b/--foo
| \
| c/--bar
baz/
Каждый путь идентифицирует узел. Узлы, являющиеся потомками узла, — это те, чьи пути в таблице поиска на одно имя длиннее. Чтобы перечислить дочерние узлы узла, нужно перечислить все пути в таблице поиска, которые на одно имя длиннее, чем его путь. Под метаданными в документе подразумевается информация о том, заблокирован ли узел и каким образом, а также о том, где находятся его (неразделяемые) данные для конечного узла, не являющегося каталогом.
Нельзя перемещаться, посещая узлы каталогов, которые владеют данными, которые дают имена дочерних и родительских узлов и являются ли они каталогами, как в Unix/Linux. Копирование листа означает копирование его данных в другой лист, например Unix/Linux cat, а не cp. Я предполагаю, что можно скопировать поддерево, которое добавит новые пути в таблицу поиска и скопирует данные для листьев, не относящихся к каталогу.
Нельзя использовать такие технические термины, как «файл» или «каталог», как будто они означают одно и то же в обеих системах. Что можно сделать, так это рассмотреть, как GFS и Unix/Linux управляют одним и тем же деревом путей имен через узлы каталога к листьям каталога и листьям, не владеющим данными каталога. Но после этого другие части состояния файловой системы (метаданные и данные) и их операторы различаются. В уме поместите «GFS-» и «Unix/Linux-» перед каждым техническим термином, кроме тех, которые относятся к деревьям именованных узлов.
РЕДАКТИРОВАТЬ: Примеры.
1.
Предположим, что какой-то клиент GFS хочет просмотреть имена всех файлов в каталоге, например, ls. Как это возможно без итерации по всем узлам метаданных?
Список каталогов вернет пути в таблице поиска, которые расширяют путь к данному каталогу. GFS будет предлагать команды файлового сервера для выполнения таких действий или поддержки таких действий, скрывая свою реализацию. Было бы достаточно (но медленно), чтобы иметь возможность перебирать таблицу поиска. Например, лс /а/б:
/a/b/foo
/a/b/c/bar
2. Чтобы скопировать дочерние узлы исходного узла в дочерние узлы целевого: Для каждого пути, который расширяет исходный путь, добавьте в таблицу поиска путь, полученный путем замены этого префикса целевым путем. Предположительно команда копирования, создающая новые узлы, копирует связанные данные для не-каталогов. Например, копирование дочерних элементов /a/ в /a/b/c/ добавляет:
/a/b/c/b/foo
/a/b/c/b/c/bar
/a/b/c/baz/
давая:
\
a/--b/--foo
| \
| c/--bar
| |--b/--foo
| | \
| | c/--bar
| baz/
baz/
person
philipxy
schedule
31.05.2014