提升 ASIO "A non-recoverable error occurred during database lookup"

boost asio "A non-recoverable error occurred during database lookup"

本文关键字:during database occurred lookup non-recoverable ASIO 提升 error      更新时间:2023-10-16

我目前正在对我的服务器进行压力测试。

有时我得到"一个不可恢复的错误发生在数据库查找"错误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()混合也很奇怪