Обратные вызовы Fuse зависают навсегда при некоторых вызовах Azure API

#c #linux #azure #fuse #azure-blob-storage

#c #linux #azure #fuse #azure-blob-хранилище

Вопрос:

Я пытаюсь использовать fuse с azure-storage-cpp на сервере Ubuntu 18.04.

Проблема, с которой я сталкиваюсь, заключается в том, что вызов azure::storage::cloud_blob::download_attributes заставляет обратные вызовы зависать навсегда.

Я создал минимальный код для его воспроизведения

 #include <fuse.h>
#include <string>
#include <was/blob.h>
#include <was/storage_account.h>
#include <cpprest/filestream.h>
#include <cpprest/containerstream.h>

// Global context
static struct fuse_operations azure_fuse;
static std::shared_ptr<azure::storage::cloud_storage_account> azure_client;

// Initialize azure client
void* init_azf(struct fuse_conn_info *conn)
{
    const std::string connection_str(loadConnectionString());
    const utility::string_t storage_connection_string(connection_str);
    azure_client = std::make_shared<azure::storage::cloud_storage_account>(azure::storage::cloud_storage_account::parse(storage_connection_string));

    return nullptr;
}

// Example of callback 
int getattr_azf(const char *path, struct stat *stbuf)
{
    // root -> directory
    if (strlen(path) == 1)
    {
        // Stuff
        return 0;
    }

    std::string blobNameStr(amp;(path[1]));

    // Retrieve blob
    azure::storage::cloud_blob_client blob_client = azure_client->create_cloud_blob_client();
    azure::storage::cloud_blob_container container(blob_client.get_container_reference(container_name));
    azure::storage::cloud_blob blob(container.get_blob_reference(blobNameStr));

    // Get properties
    /* Stuck here */
    blob.download_attributes();

    // Stuff
}

void set_up_callbacks(struct fuse_operations* operations)
{
    operations->init = init_azf;
    operations->getattr = getattr_azf;
    operations->open = open_azf;
    operations->read = read_azf;
}

int main(int argc, char *argv[])
{
    set_up_callbacks(amp;azure_fuse);

    return fuse_main(argc, argv, amp;azure_fuse, NULL);
}
  

И когда я пытаюсь открыть существующий файл, он зависает при вызове blob.download_attributes() in getattr_azf .

Странно то, что если я создаю это в main функции, это работает. Это потому, что blob.download_attributes() использует асинхронные механизмы, которые портят работу с fuse? Или я просто что-то пропустил с моими статическими инициализациями?

Спасибо

Комментарии:

1. Попробуйте смонтировать fuse с debug аргументом, чтобы точно увидеть, в каком вызове зависает fuse

2. Большое вам спасибо @Oren Kishon, я проверю это.

3. Код работает, когда я монтирую с опцией -f для запуска fuse на переднем плане, я действительно в замешательстве