Mongodb C ++ 11 API ошибочное вмешательство

Похоже, что многие функции mongodb c ++ 11 изменяют код ошибки системы на 11 (EWOULDBLOCK / EAGAIN). В настоящее время это мешает остальной части моей программы. У меня есть пара вопросов:

  • По какой причине mongodb изменяет значение ошибки на 11?
  • Есть ли способ обойти ошибку после каждого вызова различных функций mongodb?

Ниже приведен пример, показывающий, насколько распространенным является изменение в errno. Пример адаптирован из: https://www.mongodb.com/blog/post/introducing-new-c-driver?jmp=docs&_ga = 1.90709144.367237569.1438109079

#include <iostream>

#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>

#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>

int main(int, char**) {
errno = 0;
int counter(0);
std::string str;

mongocxx::instance inst{};
mongocxx::client conn{};

bsoncxx::builder::stream::document document{};

auto collection = conn["testdb"]["testcollection"];
document << "hello" << "world";

printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
collection.insert_one(document.view());
printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
errno = 0;

printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
collection.insert_one(document.view());
printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
errno = 0;

auto cursor = collection.find({});

printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
for (auto&& doc : cursor) {
if (errno) {
printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
errno = 0;
}

str = bsoncxx::to_json(doc);
//std::cout << str << std::endl;
printf("counter: %i\n",counter++);
}

printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
collection.drop();
printf("errno %i ... %s:%i\n", errno, __FILE__, __LINE__);
}

Результаты в следующем выводе:

errno 0 ... hellomongo.cpp:22
errno 11 ... hellomongo.cpp:24
errno 0 ... hellomongo.cpp:27
errno 11 ... hellomongo.cpp:29
errno 0 ... hellomongo.cpp:34
errno 11 ... hellomongo.cpp:37
counter: 0
counter: 1
errno 0 ... hellomongo.cpp:46
errno 11 ... hellomongo.cpp:48

1

Решение

В общем, вы должны ожидать, что почти любой вызов почти любой библиотеки может привести к ошибочному изменению.

Внутренне драйвер C ++ 11 построен над драйвером C, который выполняет вызовы в подсистему socket (7), которая устанавливает errno. В частности, библиотека драйвера C делает неблокирующие вызовы ввода-вывода сокета, что объясняет значения EWOULDBLOCK / EAGAIN, которые вы наблюдаете в errno.

В общем, хорошая практика с errno требует, чтобы вы зафиксировали значение errno немедленно после вызова функции, для которой вы хотите извлечь подробную информацию об ошибке. Промежуточные звонки могут его сбросить.

0

Другие решения


По вопросам рекламы [email protected]