предохранитель python: требуемый тип возвращаемого значения для функции readdir?

Я пишу файловую систему предохранителя, используя python, которая должна взаимодействовать с amazon S3 (в основном рассматривать корзины S3 как файловые системы) и сталкиваюсь с некоторыми проблемами с моей реализацией readdir.

Прежде всего, я хотел бы упомянуть, что я относительно новичок в python и предохранителе (больше java-парня, использующего python здесь из-за простоты привязки предохранителя..), так что все это может быть просто глупой ошибкой новичка ..

Вот что у меня есть на данный момент:

    def readdir(self, path, fh):
    s3Path = S3fsUtils.toS3Path(path) # removes prefixed slash - boto3 can't handle that in key names
    print("Reading dir: " + str(path))
    retVal = [".", ".."]
    for s3Obj in self.bucket.objects.all(): # for now list all objects in bucket
        tmp = str(s3Obj.key)
        if tmp.startswith(s3Path): # only return things below current path
            print("READDIR: appending to output: " + tmp)
            retVal.append(tmp)
    return retVal # return directory contents as a list of strings

Вот что происходит при запуске «ls -l» (файловая система монтируется в «/tmp/fusetest»):

root@michael-dev:/tmp/fusetest# ls -l
ls: reading directory .: Input/output error
total 0
root@michael-dev:/tmp/fusetest# 

... и вот консольный вывод файловой системы: (найденные записи - это несколько "каталогов", то есть ключи S3 без данных за ними)

Reading dir: /
READDIR: appending to output: blabla/
READDIR: appending to output: blablubb/
READDIR: appending to output: haha/
READDIR: appending to output: hahaha/
READDIR: appending to output: huhu/
READDIR: appending to output: new_folder/
Releasing dir: /

Я предполагаю, что проблема в том, что я возвращаю список строк, а не что-то более похожее на C-структуру... Я нашел этот вопрос, который также касается проблем с readdir, там используется класс "fuse.Direntry". Однако в моем fuse.py (версия fusepy = 2.0.2) я не могу найти подобный класс, самым близким по имени, которое я нашел, было «fuse_file_info», которое на самом деле не выглядит полезным для стоящей задачи.

Так что же должен вернуть readdir и откуда берется ошибка ввода-вывода?


person Michael Langowski    schedule 26.01.2016    source источник


Ответы (1)


Хорошо, это оказалось именно то, что я ожидал - глупая ошибка...

Поскольку Amazon S3 представляет папки как пустые файлы, имена которых заканчиваются косой чертой, в моих списках файлов было много записей со косой чертой в конце. Оказалось, fuse не справляется с этим, что приводит к сбою операции readdir.

Удаление косой черты из имен файлов помогает.

person Michael Langowski    schedule 03.02.2016