From 0c2a99af333811a74a91dfdf795831c1580efe8b Mon Sep 17 00:00:00 2001 From: Matteo Banerjee Date: Mon, 9 Sep 2024 15:08:18 -0400 Subject: [PATCH 1/2] Handle synchronous socket.send error in sendUsingDnsCache We are using UDP with DNS caching in production and noticed the occasional unhandled exception in our application when the datadog agent is unavailable. We tracked it down to the lookup branch of `sendUsingDnsCache` which calls `socket.send` within a callback. `socket.send` can throw a sync exception and not invoke `callback` as described here: https://nodejs.org/api/dgram.html#socketsendmsg-offset-length-port-address-callback. --- lib/transport.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/transport.js b/lib/transport.js index de5bb14..ea40edd 100644 --- a/lib/transport.js +++ b/lib/transport.js @@ -63,7 +63,11 @@ const createUdpTransport = args => { } dnsResolutionData.resolvedAddress = address; dnsResolutionData.timestamp = now; - socket.send(buf, 0, buf.length, args.port, dnsResolutionData.resolvedAddress, callback); + try { + socket.send(buf, 0, buf.length, args.port, dnsResolutionData.resolvedAddress, callback); + } catch (socketError) { + callback(socketError); + } }); } else { socket.send(buf, 0, buf.length, args.port, dnsResolutionData.resolvedAddress, callback); From c8a2f9c1641d129d92403db2b8f157e07ee4463f Mon Sep 17 00:00:00 2001 From: Matteo Banerjee Date: Wed, 11 Sep 2024 14:47:57 -0400 Subject: [PATCH 2/2] PR feedback --- lib/transport.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/transport.js b/lib/transport.js index ea40edd..ca71569 100644 --- a/lib/transport.js +++ b/lib/transport.js @@ -70,7 +70,11 @@ const createUdpTransport = args => { } }); } else { - socket.send(buf, 0, buf.length, args.port, dnsResolutionData.resolvedAddress, callback); + try { + socket.send(buf, 0, buf.length, args.port, dnsResolutionData.resolvedAddress, callback); + } catch (socketError) { + callback(socketError); + } } }; @@ -82,7 +86,11 @@ const createUdpTransport = args => { if (args.cacheDns) { sendUsingDnsCache(callback, buf); } else { - socket.send(buf, 0, buf.length, args.port, args.host, callback); + try { + socket.send(buf, 0, buf.length, args.port, args.host, callback); + } catch (socketError) { + callback(socketError); + } } }, close: socket.close.bind(socket),