#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
аргументом, чтобы точно увидеть, в каком вызове зависает fuse2. Большое вам спасибо @Oren Kishon, я проверю это.
3. Код работает, когда я монтирую с опцией -f для запуска fuse на переднем плане, я действительно в замешательстве