На этой неделе я реализовал функции 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.