На этой неделе я реализовал функции lookup
и readdir
в library_cvmfs.js
.
поиск
Прототип этой функции — function (parent, name)
, где parent
— объект FSNode
, возвращенный предыдущим вызовом lookup
, а name
— строка имени потенциального дочернего узла parent
. В CernVM-FS хеш MD5 пути дочернего элемента индексируется в таблице каталога, поэтому мы выполняем следующий запрос:
SELECT flags FROM catalog WHERE md5path_1="..." AND md5path_2="..."
где md5path_1
— биты старшего порядка хеша MD5, а md5path_2
— младшие полубиты.
Мы извлекаем столбец flags
, так как нам нужно установить соответствующий режим POSIX для дочернего узла, например S_IFREG
или S_IFDIR
.
Если возвращается noflags
, мы выбрасываем исключение FS.ErrnoError(ERRNO_CODES.ENOSYS)
, что приводит к установке errno
в соответствии с программой C/C++.
каталог чтения
Прототип этой функции — function (node)
, где node
— объект FSNode
, возвращенный предыдущим вызовом lookup
. Он будет вызываться только для узлов, чей атрибут mode
равен S_IFDIR
.
В CernVM-FS хэш MD5 родительского пути узла также индексируется в таблице каталога, поэтому мы выполняем следующий запрос:
SELECT names FROM catalog WHERE parent_1="..." AND parent_2="..."
где parent_1
— биты старшего порядка хеша MD5, а parent_2
— младшие полубиты.
Эти имена также кэшируются в самом объекте node
как cvmfs_entries
и используются для последующих вызовов readdir
. Это позволяет избежать многократного выполнения дорогостоящих SQL-запросов для одних и тех же данных.
Эта функция тестируется программой tests/cpp/readdir.cpp
, которая проверяет записи каталогов /tests
и /tests/subdir
, хранящихся в репозитории http://hepvm.cern.ch/cvmfs/emscripten.cvmfs.io
.