Yes, we are running it with Valgrind. But must do it more. Will have it working with Valgrind for long time and let's see.
On Wed, 23 Oct 2019 at 08:50, Santiago Gimeno <santiago.gim...@gmail.com> wrote: > > Hi, > > I haven't looked at the code, but as an idea, have you run the code with > valgrind? It might provide some hints. > > Cheers, > > Santi > > El mié., 23 oct. 2019 a las 3:15, Iñaki Baz Castillo (<i...@aliax.net>) > escribió: >> >> Hi, >> >> Although I've never been able to reproduce it (neither in Linux nor in >> OSX) it seems that there is a bug in my libuv based C++ app related to >> TCP. I'm a little desperate because I've spent a lot of days trying to >> figure out where the issue is with no luck. >> >> A user of my software (who runs it on Linux) is experimenting TCP >> related crashes. It's not even always the same coredump, but it seems >> to always be related to TCP. >> >> Could anyone tell me if there is something wrong here? >> >> ------------------------------------------------- >> void TcpConnection::Close() >> { >> MS_TRACE(); >> >> if (this->closed) >> return; >> >> int err; >> >> this->closed = true; >> >> // Tell the UV handle that the TcpConnection has been closed. >> this->uvHandle->data = nullptr; >> >> // Don't read more. >> err = uv_read_stop(reinterpret_cast<uv_stream_t*>(this->uvHandle)); >> >> if (err != 0) >> MS_ABORT("uv_read_stop() failed: %s", uv_strerror(err)); >> >> // If there is no error and the peer didn't close its connection >> side then close gracefully. >> if (!this->hasError && !this->isClosedByPeer) >> { >> // Use uv_shutdown() so pending data to be written will be sent to the >> peer >> // before closing. >> auto req = new uv_shutdown_t; >> req->data = static_cast<void*>(this); >> err = uv_shutdown( >> req, reinterpret_cast<uv_stream_t*>(this->uvHandle), >> static_cast<uv_shutdown_cb>(onShutdown)); >> >> if (err != 0) >> MS_ABORT("uv_shutdown() failed: %s", uv_strerror(err)); >> } >> // Otherwise directly close the socket. >> else >> { >> uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), >> static_cast<uv_close_cb>(onClose)); >> } >> } >> ------------------------------------------------- >> >> This is, I do uv_shutdown() if the connection is still open and within >> the uv_shutdown_cb I call uv_close(). Otherwise, if the remote peer >> closed its TCP side I directly call to uv_close(): >> >> --------------------------------------------------- >> inline static void onClose(uv_handle_t* handle) >> { >> delete handle; >> } >> >> inline static void onShutdown(uv_shutdown_t* req, int /*status*/) >> { >> auto* handle = req->handle; >> >> delete req; >> >> // Now do close the handle. >> uv_close(reinterpret_cast<uv_handle_t*>(handle), >> static_cast<uv_close_cb>(onClose)); >> } >> --------------------------------------------------- >> >> Both this->hasError and this->isClosedByPeer are booleans set to true >> if there is an error in the uv_read_cb: >> >> ------------------------------------------------ >> inline void TcpConnection::OnUvRead(ssize_t nread, const uv_buf_t* /*buf*/) >> { >> MS_TRACE(); >> >> if (nread == 0) >> return; >> >> // Data received. >> if (nread > 0) >> { >> // Update received bytes. >> this->recvBytes += nread; >> >> // Update the buffer data length. >> this->bufferDataLen += static_cast<size_t>(nread); >> >> // Notify the subclass. >> UserOnTcpConnectionRead(); >> } >> // Client disconneted. >> else if (nread == UV_EOF || nread == UV_ECONNRESET) >> { >> MS_DEBUG_DEV("connection closed by peer, closing server side"); >> >> this->isClosedByPeer = true; >> >> // Close server side of the connection. >> Close(); >> >> // Notify the listener. >> this->listener->OnTcpConnectionClosed(this); >> } >> // Some error. >> else >> { >> MS_WARN_DEV("read error, closing the connection: %s", >> uv_strerror(nread)); >> >> this->hasError = true; >> >> // Close server side of the connection. >> Close(); >> >> // Notify the listener. >> this->listener->OnTcpConnectionClosed(this); >> } >> } >> ------------------------------------------------ >> >> >> The whole code is here: >> >> - >> https://github.com/versatica/mediasoup/blob/tcp-crash-wip/worker/src/handles/TcpConnection.cpp?ts=2 >> - >> https://github.com/versatica/mediasoup/blob/tcp-crash-wip/worker/include/handles/TcpConnection.hpp?ts=2 >> >> And an example coredump is here: >> >> https://mediasoup.discourse.group/t/error-worker-worker-process-died-unexpectedly/268/84?u=ibc >> >> >> I'm pretty sure everything is ok in the code above. Could anyone >> identify an issue into it? >> >> Really thanks a lot. >> >> >> -- >> Iñaki Baz Castillo >> <i...@aliax.net> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "libuv" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to libuv+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/libuv/CALiegf%3DhsERWve0k0O4Yut4SU9QPBXzbWuRS9s4une5xbyKwJw%40mail.gmail.com. > > -- > You received this message because you are subscribed to the Google Groups > "libuv" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to libuv+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/libuv/CAAJY-XOOau8SJbWTArW8Y5EdAJCw5g8mGeyrZNTf_0RH%2Bf8ifQ%40mail.gmail.com. -- Iñaki Baz Castillo <i...@aliax.net> -- You received this message because you are subscribed to the Google Groups "libuv" group. To unsubscribe from this group and stop receiving emails from it, send an email to libuv+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/libuv/CALiegfnhEO3aXiu8zHa2B6yhM%2BDfO99Oc80VJyCgTeB42k%2BVtA%40mail.gmail.com.