提升 ASIO "A non-recoverable error occurred during database lookup"
boost asio "A non-recoverable error occurred during database lookup"
我目前正在对我的服务器进行压力测试。
有时我得到"一个不可恢复的错误发生在数据库查找"错误error.message()
错误被boost::asio::placeholders::error发送到我的处理函数,调用async_read方法。
我不知道这个错误意味着什么,我不能故意重现这个错误,它只是偶尔发生,似乎是随机的(当然它不是,但似乎)
有人收到过这个错误信息吗?如果有,知道它是从哪里来的吗?
编辑1
下面是我在boost库中发现的错误:
no_recovery = BOOST_ASIO_NETDB_ERROR(no_recovery)
But can't figure out this is…
编辑2
为了让你知道我的问题,这里是设计:
我只有一个io_service。每次用户连接时,都会启动async_read,等待要读取的内容。当它读取一些东西时,大多数时候,它是在线程(来自池)上做一些工作,然后同步地将一些东西写回给用户。(使用boost写)。即使boost 1.37声称同步写是线程安全的,我还是很担心它来自于这个事实。
如果用户发送不同的消息非常快,可能会发生async_read和write同时被调用,这有什么害处吗?
3
编辑这是Dave S问我的部分代码:
void TCPConnection::listenForCMD() {
boost::asio::async_read(m_socket,
boost::asio::buffer(m_inbound_data, 3),
boost::asio::transfer_at_least(3),
boost::bind(&TCPConnection::handle_cmd,
shared_from_this(),
boost::asio::placeholders::error)
);
}
void TCPConnection::handle_cmd(const boost::system::error_code& error) {
if (error) {
std::cout << "ERROR READING : " << error.message() << std::endl;
return;
}
std::string str1(m_inbound_data);
std::string str = str1.substr(0,3);
std::cout << "COMMAND FUNCTION: " << str << std::endl;
a_fact func = CommandFactory::getInstance()->getFunction(str);
if (func == NULL) {
std::cout << "command doesn't exist: " << str << std::endl;
return;
}
protocol::in::Command::pointer cmd = func(m_socket, client);
cmd->setCallback(boost::bind(&TCPConnection::command_is_done,
shared_from_this()));
cmd->parse();
}
m_inbound_data是一个char[3]
一旦cmd->parse()完成,它将调用回调command_is_done
void TCPConnection::command_is_done() {
m_inbound_data[0] = '0';
m_inbound_data[1] = '0';
m_inbound_data[2] = '0';
listenForCMD();
}
handle_cmd在第一行检查错误时出现错误。
如前所述,cmd->parse()将解析它刚刚得到的命令,有时会在来自池的线程中启动阻塞代码。在这个线程中,它通过同步写将数据发送回客户端。
重要事项:回调command_is_done将始终在上述线程启动之前被调用。这意味着当线程可能在同步写中向客户端发送一些东西时,已经调用了listenForCMD。
我强调了一下,这是不正确的。单个当它读取一些东西时,大多数时候,它正在a上做一些工作线程(来自池),并同步回写一些内容用户。(使用boost写)。即使boost 1.37声明同步写是线程安全的,我真的很担心这个事实它来自于这个
boost::asio::tcp::socket
不是线程安全的,文档非常清楚
线程安全
不同对象: Safe.
共享对象:不安全。
将async_read()
与阻塞的write()
混合也很奇怪
- error_stack during regex_match
- 为什么日食总是发生错误"An internal error occurred during: "通知选择侦听器". java.lang.StackOverflowError"
- JNI 失败并显示'Error occurred during initialization of VM'
- 为什么 clang++ 报告与 "value stored to '...' during its initialization is never read" 的结构化绑定?
- MySQL 异常"connection lost during query"、"MySQL server has gone away"和"command out of sync"
- raspbian (rasp pi 3) connection to database (mysql / mariadb
- mysql driver for qt database fedora
- IPlugEffect (Audio Unit target) "SysError 0 during open of " resource.h " "
- Oracle NoSQL Database - 使用它进行开发
- 限制数据类型属性冲突-ODBC with Access Database
- Light Sql Database
- SQLite总是回复"database table is locked"
- Netbeans 8.0.2 返回"During startup program exited with code 0xc0000135"
- Writing SQlite Database in Qt
- Accessing Websql database with Qt
- How to write Sqlite DataBase in Qt
- C++ QT libXL 错误:"During Startup program exited with code 0xc0000135"
- 提升 ASIO "A non-recoverable error occurred during database lookup"