From 99c3c7f2457327d843c7f8d1e1b5adcb2f826373 Mon Sep 17 00:00:00 2001 From: Jelte Jansen Date: Wed, 12 Dec 2012 10:40:46 +0100 Subject: [PATCH 1/2] [2494] Use non-throwing version of send_to Also update log message and description --- src/lib/asiodns/asiodns_messages.mes | 11 +++++++++++ src/lib/asiodns/sync_udp_server.cc | 8 +++++++- src/lib/asiodns/udp_server.cc | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/lib/asiodns/asiodns_messages.mes b/src/lib/asiodns/asiodns_messages.mes index 8fbafdd9c7..e4d0ead4f7 100644 --- a/src/lib/asiodns/asiodns_messages.mes +++ b/src/lib/asiodns/asiodns_messages.mes @@ -53,6 +53,17 @@ The asynchronous I/O code encountered an error when trying to send data to the specified address on the given protocol. The number of the system error that caused the problem is given in the message. +% ASIODNS_UDP_SYNC_SEND_FAIL Error sending UDP packet to %1: %2 +The low-level ASIO library reported an error when trying to send a UDP +packet in synchronous UDP mode. This can be any error reported by send_to(), +and can indicate problems such as too high a load on the network, or a +problem in the underlying library or system. +This packet is dropped and will not be sent, but service should resume +normally. +If you see a single occurrence of this message, it probably does not +indicate any significant problem, but if it is logged often, it is probably +a good idea to inspect your network traffic. + % ASIODNS_UNKNOWN_ORIGIN unknown origin for ASIO error code %1 (protocol: %2, address %3) An internal consistency check on the origin of a message from the asynchronous I/O module failed. This may indicate an internal error; diff --git a/src/lib/asiodns/sync_udp_server.cc b/src/lib/asiodns/sync_udp_server.cc index 0c577f2474..95e1c723db 100644 --- a/src/lib/asiodns/sync_udp_server.cc +++ b/src/lib/asiodns/sync_udp_server.cc @@ -148,9 +148,15 @@ SyncUDPServer::handleRead(const asio::error_code& ec, const size_t length) { return; } + asio::error_code ec; socket_->send_to(asio::buffer(output_buffer_->getData(), output_buffer_->getLength()), - sender_); + sender_, 0, ec); + if (ec) { + LOG_ERROR(logger, ASIODNS_UDP_SYNC_SEND_FAIL). + arg(sender_.address().to_string()). + arg(ec.message()); + } } // And schedule handling another socket. diff --git a/src/lib/asiodns/udp_server.cc b/src/lib/asiodns/udp_server.cc index 0f5456b3d1..8695e60083 100644 --- a/src/lib/asiodns/udp_server.cc +++ b/src/lib/asiodns/udp_server.cc @@ -299,7 +299,8 @@ UDPServer::operator()(asio::error_code ec, size_t length) { // Begin an asynchronous send, and then yield. When the // send completes, we will resume immediately after this point // (though we have nothing further to do, so the coroutine - // will simply exit at that time). + // will simply exit at that time, after reporting an error if + // there was one). CORO_YIELD data_->socket_->async_send_to( buffer(data_->respbuf_->getData(), data_->respbuf_->getLength()), *data_->sender_, *this); From 259634a0145c978f78f87cf84724553473e109fc Mon Sep 17 00:00:00 2001 From: Jelte Jansen Date: Thu, 13 Dec 2012 23:07:00 +0100 Subject: [PATCH 2/2] [2494] Add error log for async mode too --- src/lib/asiodns/asiodns_messages.mes | 13 +++++++++---- src/lib/asiodns/udp_server.cc | 5 +++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lib/asiodns/asiodns_messages.mes b/src/lib/asiodns/asiodns_messages.mes index e4d0ead4f7..db2902ec65 100644 --- a/src/lib/asiodns/asiodns_messages.mes +++ b/src/lib/asiodns/asiodns_messages.mes @@ -53,17 +53,22 @@ The asynchronous I/O code encountered an error when trying to send data to the specified address on the given protocol. The number of the system error that caused the problem is given in the message. -% ASIODNS_UDP_SYNC_SEND_FAIL Error sending UDP packet to %1: %2 +% ASIODNS_UDP_ASYNC_SEND_FAIL Error sending UDP packet to %1: %2 The low-level ASIO library reported an error when trying to send a UDP -packet in synchronous UDP mode. This can be any error reported by send_to(), -and can indicate problems such as too high a load on the network, or a -problem in the underlying library or system. +packet in asynchronous UDP mode. This can be any error reported by +send_to(), and can indicate problems such as too high a load on the network, +or a problem in the underlying library or system. This packet is dropped and will not be sent, but service should resume normally. If you see a single occurrence of this message, it probably does not indicate any significant problem, but if it is logged often, it is probably a good idea to inspect your network traffic. +% ASIODNS_UDP_SYNC_SEND_FAIL Error sending UDP packet to %1: %2 +The low-level ASIO library reported an error when trying to send a UDP +packet in synchronous UDP mode. See ASIODNS_UDP_ASYNC_SEND_FAIL for +more information. + % ASIODNS_UNKNOWN_ORIGIN unknown origin for ASIO error code %1 (protocol: %2, address %3) An internal consistency check on the origin of a message from the asynchronous I/O module failed. This may indicate an internal error; diff --git a/src/lib/asiodns/udp_server.cc b/src/lib/asiodns/udp_server.cc index 8695e60083..bdf79a7325 100644 --- a/src/lib/asiodns/udp_server.cc +++ b/src/lib/asiodns/udp_server.cc @@ -304,6 +304,11 @@ UDPServer::operator()(asio::error_code ec, size_t length) { CORO_YIELD data_->socket_->async_send_to( buffer(data_->respbuf_->getData(), data_->respbuf_->getLength()), *data_->sender_, *this); + if (ec) { + LOG_ERROR(logger, ASIODNS_UDP_ASYNC_SEND_FAIL). + arg(data_->sender_->address().to_string()). + arg(ec.message()); + } } }