Fix IOCP error statuses.

GitOrigin-RevId: 8f5c5481c7d70b7d7795503bc69deff32fb5935c
This commit is contained in:
levlam 2018-12-17 19:12:47 +03:00
parent 500d809f51
commit 064619044b
4 changed files with 27 additions and 9 deletions

View File

@ -164,10 +164,11 @@ class ServerSocketFdImpl : private Iocp::Callback {
void on_iocp(Result<size_t> r_size, WSAOVERLAPPED *overlapped) override {
// called from other thread
if (dec_refcnt() || close_flag_) {
VLOG(fd) << "Ignore IOCP (server socket is closing)";
return;
}
if (r_size.is_error()) {
return on_error(r_size.move_as_error());
return on_error(get_socket_pending_error(get_native_fd(), overlapped, r_size.move_as_error()));
}
if (overlapped == nullptr) {

View File

@ -202,11 +202,11 @@ class SocketFdImpl : private Iocp::Callback {
void on_iocp(Result<size_t> r_size, WSAOVERLAPPED *overlapped) override {
// called from other thread
if (dec_refcnt() || close_flag_) {
VLOG(fd) << "ignore iocp (file is closing)";
VLOG(fd) << "Ignore IOCP (socket is closing)";
return;
}
if (r_size.is_error()) {
return on_error(r_size.move_as_error());
return on_error(get_socket_pending_error(get_native_fd(), overlapped, r_size.move_as_error()));
}
if (!is_connected_ && overlapped == &read_overlapped_) {
@ -446,6 +446,9 @@ void SocketFdImplDeleter::operator()(SocketFdImpl *impl) {
delete impl;
}
#endif
#if TD_PORT_POSIX
Status get_socket_pending_error(const NativeFd &fd) {
int error = 0;
socklen_t errlen = sizeof(error);
@ -453,13 +456,25 @@ Status get_socket_pending_error(const NativeFd &fd) {
if (error == 0) {
return Status::OK();
}
return Status::PosixError(error, PSLICE() << "Error on socket " << fd);
return Status::PosixError(error, PSLICE() << "Error on " << fd);
}
auto status = OS_SOCKET_ERROR(PSLICE() << "Can't load error on socket " << fd);
LOG(INFO) << "Can't load pending socket error: " << status;
return status;
}
#elif TD_PORT_WINDOWS
Status get_socket_pending_error(const NativeFd &fd, WSAOVERLAPPED *overlapped, Status iocp_error) {
// We need to call WSAGetOverlappedResult() just so WSAGetLastError() will return the correct error. See
// https://stackoverflow.com/questions/28925003/calling-wsagetlasterror-from-an-iocp-thread-return-incorrect-result
DWORD num_bytes = 0;
DWORD flags = 0;
bool success = WSAGetOverlappedResult(fd.socket(), overlapped, &num_bytes, false, &flags);
if (success) {
LOG(ERROR) << "WSAGetOverlappedResult succeded after " << iocp_error;
return iocp_error;
}
return OS_SOCKET_ERROR(PSLICE() << "Error on " << fd);
}
#endif
Status init_socket_options(NativeFd &native_fd) {

View File

@ -56,10 +56,12 @@ class SocketFd {
explicit SocketFd(unique_ptr<detail::SocketFdImpl> impl);
};
#if TD_PORT_POSIX
namespace detail {
#if TD_PORT_POSIX
Status get_socket_pending_error(const NativeFd &fd);
} // namespace detail
#elif TD_PORT_WINDOWS
Status get_socket_pending_error(const NativeFd &fd, WSAOVERLAPPED *overlapped, Status iocp_error);
#endif
} // namespace detail
} // namespace td

View File

@ -242,11 +242,11 @@ class UdpSocketFdImpl : private Iocp::Callback {
void on_iocp(Result<size_t> r_size, WSAOVERLAPPED *overlapped) override {
// called from other thread
if (dec_refcnt() || close_flag_) {
VLOG(fd) << "ignore iocp (file is closing)";
VLOG(fd) << "Ignore IOCP (UDP socket is closing)";
return;
}
if (r_size.is_error()) {
return on_error(r_size.move_as_error());
return on_error(get_socket_pending_error(get_native_fd(), overlapped, r_size.move_as_error()));
}
if (!is_connected_ && overlapped == &receive_overlapped_) {