В некоторых вызовах API-интерфейса Azure функции обратного вызова предохранителей навсегда - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь использовать 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(&(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(&azure_fuse);

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

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

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

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...