Я пытаюсь использовать 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()
использует асинхронные механизмы, которые портятся с предохранителем? Или я что-то пропустил с инициализацией статики?
Спасибо