From f7f1e896690a37ddbf3848e4c9f9b8c4c799f7b1 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Tue, 14 Feb 2023 10:35:44 +0100 Subject: [PATCH] TCP Transport: enable NO_DELAY for clients (#822) --- .pinned | 16 ++++++++-------- libp2p/transports/tcptransport.nim | 8 +++++++- libp2p/utility.nim | 6 ++++++ libp2p/wire.nim | 13 ++++++++++--- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/.pinned b/.pinned index d54a1d4b3..a9b5e63f5 100644 --- a/.pinned +++ b/.pinned @@ -1,16 +1,16 @@ -bearssl;https://github.com/status-im/nim-bearssl@#a647994910904b0103a05db3a5ec1ecfc4d91a88 +bearssl;https://github.com/status-im/nim-bearssl@#acf9645e328bdcab481cfda1c158e07ecd46bd7b chronicles;https://github.com/status-im/nim-chronicles@#32ac8679680ea699f7dbc046e8e0131cac97d41a -chronos;https://github.com/status-im/nim-chronos@#75d030ff71264513fb9701c75a326cd36fcb4692 +chronos;https://github.com/status-im/nim-chronos@#5d3da66e563d21277b57a9b601744273c083a01b dnsclient;https://github.com/ba0f3/dnsclient.nim@#fcd7443634b950eaea574e5eaa00a628ae029823 -faststreams;https://github.com/status-im/nim-faststreams@#b42daf41d8eb4fbce40add6836bed838f8d85b6f +faststreams;https://github.com/status-im/nim-faststreams@#814f8927e1f356f39219f37f069b83066bcc893a httputils;https://github.com/status-im/nim-http-utils@#a85bd52ae0a956983ca6b3267c72961d2ec0245f json_serialization;https://github.com/status-im/nim-json-serialization@#a7d815ed92f200f490c95d3cfd722089cc923ce6 metrics;https://github.com/status-im/nim-metrics@#21e99a2e9d9f80e68bef65c80ef781613005fccb -nimcrypto;https://github.com/cheatfate/nimcrypto@#24e006df85927f64916e60511620583b11403178 +nimcrypto;https://github.com/cheatfate/nimcrypto@#4014ef939b51e02053c2e16dd3481d47bc9267dd secp256k1;https://github.com/status-im/nim-secp256k1@#fd173fdff863ce2e211cf64c9a03bc7539fe40b0 -serialization;https://github.com/status-im/nim-serialization@#d77417cba6896c26287a68e6a95762e45a1b87e5 -stew;https://github.com/status-im/nim-stew@#7184d2424dc3945657884646a72715d494917aad +serialization;https://github.com/status-im/nim-serialization@#5b7cea55efeb074daa8abd8146a03a34adb4521a +stew;https://github.com/status-im/nim-stew@#407a59883691d362db2fe8eab7f7c3b1f75112ff testutils;https://github.com/status-im/nim-testutils@#dfc4c1b39f9ded9baf6365014de2b4bfb4dafc34 unittest2;https://github.com/status-im/nim-unittest2@#da8398c45cafd5bd7772da1fc96e3924a18d3823 -websock;https://github.com/status-im/nim-websock@#691f069b209d372b1240d5ae1f57fb7bbafeaba7 -zlib;https://github.com/status-im/nim-zlib@#6a6670afba6b97b29b920340e2641978c05ab4d8 \ No newline at end of file +websock;https://github.com/status-im/nim-websock@#fea05cde8b123b38d1a0a8524b77efbc84daa848 +zlib;https://github.com/status-im/nim-zlib@#826e2fc013f55b4478802d4f2e39f187c50d520a \ No newline at end of file diff --git a/libp2p/transports/tcptransport.nim b/libp2p/transports/tcptransport.nim index 52638ee09..998d04337 100644 --- a/libp2p/transports/tcptransport.nim +++ b/libp2p/transports/tcptransport.nim @@ -42,6 +42,7 @@ type servers*: seq[StreamServer] clients: array[Direction, seq[StreamTransport]] flags: set[ServerFlags] + clientFlags: set[TransportFlags] acceptFuts: seq[Future[StreamTransport]] TcpTransportTracker* = ref object of TrackerBase @@ -131,6 +132,11 @@ proc new*( let transport = T( flags: flags, + clientFlags: + if ServerFlags.TcpNoDelay in flags: + {TransportFlags.TcpNoDelay} + else: + default(set[TransportFlags]), upgrader: upgrade) return transport @@ -253,7 +259,7 @@ method dial*( trace "Dialing remote peer", address = $address - let transp = await connect(address) + let transp = await connect(address, flags = self.clientFlags) try: let observedAddr = await getObservedAddr(transp) return await self.connHandler(transp, Opt.some(observedAddr), Direction.Out) diff --git a/libp2p/utility.nim b/libp2p/utility.nim index 3a02a25d3..1000394ae 100644 --- a/libp2p/utility.nim +++ b/libp2p/utility.nim @@ -19,6 +19,12 @@ template public* {.pragma.} const ShortDumpMax = 12 +template compilesOr*(a, b: untyped): untyped = + when compiles(a): + a + else: + b + func shortLog*(item: openArray[byte]): string = if item.len <= ShortDumpMax: result = item.toHex() diff --git a/libp2p/wire.nim b/libp2p/wire.nim index 4b5b65039..6c3671f2d 100644 --- a/libp2p/wire.nim +++ b/libp2p/wire.nim @@ -14,7 +14,7 @@ else: ## This module implements wire network connection procedures. import chronos, stew/endians2 -import multiaddress, multicodec, errors +import multiaddress, multicodec, errors, utility when defined(windows): import winlean @@ -76,7 +76,8 @@ proc initTAddress*(ma: MultiAddress): MaResult[TransportAddress] = proc connect*( ma: MultiAddress, bufferSize = DefaultStreamBufferSize, - child: StreamTransport = nil): Future[StreamTransport] + child: StreamTransport = nil, + flags = default(set[TransportFlags])): Future[StreamTransport] {.raises: [Defect, LPError, MaInvalidAddress].} = ## Open new connection to remote peer with address ``ma`` and create ## new transport object ``StreamTransport`` for established connection. @@ -86,7 +87,13 @@ proc connect*( if not(RTRANSPMA.match(ma)): raise newException(MaInvalidAddress, "Incorrect or unsupported address!") - return connect(initTAddress(ma).tryGet(), bufferSize, child) + let transportAddress = initTAddress(ma).tryGet() + + compilesOr: + return connect(transportAddress, bufferSize, child, flags) + do: + # support for older chronos versions + return connect(transportAddress, bufferSize, child) proc createStreamServer*[T](ma: MultiAddress, cbproc: StreamCallback,