From 20c02a5f23e8ba0dcfbd3a2ca00a79c656179f4c Mon Sep 17 00:00:00 2001 From: Miran Date: Tue, 2 Aug 2022 19:07:08 +0200 Subject: [PATCH 1/3] ci: test Nim 1.6 branch (#747) * ci: test Nim 1.6 branch * drop `devel` from testing Co-authored-by: Tanguy --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 685bd8eac6..493973db5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: cpu: amd64 #- os: windows #cpu: i386 - branch: [version-1-2, devel] + branch: [version-1-2, version-1-6] include: - target: os: linux From 2fbe82bf9def7236fb0d8e412e82d078b6fa8327 Mon Sep 17 00:00:00 2001 From: Miran Date: Wed, 3 Aug 2022 13:33:19 +0200 Subject: [PATCH 2/3] make it more Nim 1.4+ compatible (#742) --- config.nims | 2 -- libp2p/builders.nim | 5 ++++- libp2p/cid.nim | 5 ++++- libp2p/connmanager.nim | 5 ++++- libp2p/crypto/chacha20poly1305.nim | 5 ++++- libp2p/crypto/crypto.nim | 5 ++++- libp2p/crypto/curve25519.nim | 5 ++++- libp2p/crypto/ecnist.nim | 5 ++++- libp2p/crypto/ed25519/ed25519.nim | 5 ++++- libp2p/crypto/hkdf.nim | 5 ++++- libp2p/crypto/minasn1.nim | 5 ++++- libp2p/crypto/rsa.nim | 6 +++++- libp2p/crypto/secp.nim | 5 ++++- libp2p/daemon/daemonapi.nim | 5 ++++- libp2p/daemon/transpool.nim | 5 ++++- libp2p/dial.nim | 5 ++++- libp2p/multiaddress.nim | 5 ++++- libp2p/multibase.nim | 5 ++++- libp2p/multicodec.nim | 5 ++++- libp2p/multihash.nim | 5 ++++- libp2p/multistream.nim | 5 ++++- libp2p/muxers/mplex/coder.nim | 5 ++++- libp2p/muxers/mplex/lpchannel.nim | 7 +++++-- libp2p/muxers/mplex/mplex.nim | 5 ++++- libp2p/muxers/muxer.nim | 5 ++++- libp2p/muxers/yamux/yamux.nim | 5 ++++- libp2p/nameresolving/dnsresolver.nim | 5 ++++- libp2p/nameresolving/mockresolver.nim | 5 ++++- libp2p/nameresolving/nameresolver.nim | 5 ++++- libp2p/peerid.nim | 5 ++++- libp2p/peerinfo.nim | 5 ++++- libp2p/peerstore.nim | 5 ++++- libp2p/protobuf/minprotobuf.nim | 5 ++++- libp2p/protocols/identify.nim | 5 ++++- libp2p/protocols/ping.nim | 5 ++++- libp2p/protocols/protocol.nim | 5 ++++- libp2p/protocols/pubsub/floodsub.nim | 5 ++++- libp2p/protocols/pubsub/gossipsub.nim | 5 ++++- libp2p/protocols/pubsub/gossipsub/behavior.nim | 5 ++++- libp2p/protocols/pubsub/gossipsub/scoring.nim | 6 ++++-- libp2p/protocols/pubsub/gossipsub/types.nim | 5 ++++- libp2p/protocols/pubsub/mcache.nim | 5 ++++- libp2p/protocols/pubsub/peertable.nim | 5 ++++- libp2p/protocols/pubsub/pubsub.nim | 5 ++++- libp2p/protocols/pubsub/pubsubpeer.nim | 5 ++++- libp2p/protocols/pubsub/rpc/message.nim | 5 ++++- libp2p/protocols/pubsub/rpc/messages.nim | 5 ++++- libp2p/protocols/pubsub/rpc/protobuf.nim | 6 ++++-- libp2p/protocols/pubsub/timedcache.nim | 5 ++++- libp2p/protocols/relay/client.nim | 5 ++++- libp2p/protocols/relay/messages.nim | 5 ++++- libp2p/protocols/relay/rconn.nim | 5 ++++- libp2p/protocols/relay/relay.nim | 5 ++++- libp2p/protocols/relay/rtransport.nim | 5 ++++- libp2p/protocols/relay/utils.nim | 5 ++++- libp2p/protocols/secure/noise.nim | 5 ++++- libp2p/protocols/secure/plaintext.nim | 5 ++++- libp2p/protocols/secure/secio.nim | 5 ++++- libp2p/protocols/secure/secure.nim | 5 ++++- libp2p/routing_record.nim | 5 ++++- libp2p/signed_envelope.nim | 5 ++++- libp2p/stream/bufferstream.nim | 7 +++++-- libp2p/stream/chronosstream.nim | 5 ++++- libp2p/stream/connection.nim | 5 ++++- libp2p/stream/lpstream.nim | 5 ++++- libp2p/stream/streamseq.nim | 5 ++++- libp2p/switch.nim | 5 ++++- libp2p/transports/tcptransport.nim | 5 ++++- libp2p/transports/transport.nim | 5 ++++- libp2p/transports/wstransport.nim | 5 ++++- libp2p/upgrademngrs/muxedupgrade.nim | 5 ++++- libp2p/upgrademngrs/upgrade.nim | 5 ++++- libp2p/utility.nim | 5 ++++- libp2p/utils/heartbeat.nim | 5 ++++- libp2p/utils/semaphore.nim | 5 ++++- libp2p/varint.nim | 5 ++++- libp2p/vbuffer.nim | 5 ++++- libp2p/wire.nim | 5 ++++- tests/helpers.nim | 6 ++++-- tests/testmultistream.nim | 7 +++++-- tests/testnoise.nim | 10 +++++++++- 81 files changed, 329 insertions(+), 88 deletions(-) diff --git a/config.nims b/config.nims index 23bf10e377..0a5c80dbc8 100644 --- a/config.nims +++ b/config.nims @@ -2,8 +2,6 @@ if dirExists("nimbledeps/pkgs"): switch("NimblePath", "nimbledeps/pkgs") -when (NimMajor, NimMinor) > (1, 2): - switch("hint", "XCannotRaiseY:off") # begin Nimble config (version 1) when fileExists("nimble.paths"): include "nimble.paths" diff --git a/libp2p/builders.nim b/libp2p/builders.nim index 30d8a05dbe..b459a9a9c4 100644 --- a/libp2p/builders.nim +++ b/libp2p/builders.nim @@ -16,7 +16,10 @@ runnableExamples: # etc .build() -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options, tables, chronos, chronicles, sequtils, diff --git a/libp2p/cid.nim b/libp2p/cid.nim index f12c4d814b..1f18f82014 100644 --- a/libp2p/cid.nim +++ b/libp2p/cid.nim @@ -9,7 +9,10 @@ ## This module implementes CID (Content IDentifier). -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import tables, hashes import multibase, multicodec, multihash, vbuffer, varint diff --git a/libp2p/connmanager.nim b/libp2p/connmanager.nim index e3cb2e8e90..e64947e510 100644 --- a/libp2p/connmanager.nim +++ b/libp2p/connmanager.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[options, tables, sequtils, sets] import pkg/[chronos, chronicles, metrics] diff --git a/libp2p/crypto/chacha20poly1305.nim b/libp2p/crypto/chacha20poly1305.nim index c3eeca776d..8482897d86 100644 --- a/libp2p/crypto/chacha20poly1305.nim +++ b/libp2p/crypto/chacha20poly1305.nim @@ -15,7 +15,10 @@ # RFC @ https://tools.ietf.org/html/rfc7539 -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import bearssl/blockx from stew/assign2 import assign diff --git a/libp2p/crypto/crypto.nim b/libp2p/crypto/crypto.nim index 99bf5849b1..1ccf8386fa 100644 --- a/libp2p/crypto/crypto.nim +++ b/libp2p/crypto/crypto.nim @@ -8,7 +8,10 @@ # those terms. ## This module implements Public Key and Private Key interface for libp2p. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} from strutils import split, strip, cmpIgnoreCase diff --git a/libp2p/crypto/curve25519.nim b/libp2p/crypto/curve25519.nim index ad14ec6f86..d4b476bc74 100644 --- a/libp2p/crypto/curve25519.nim +++ b/libp2p/crypto/curve25519.nim @@ -15,7 +15,10 @@ # RFC @ https://tools.ietf.org/html/rfc7748 -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import bearssl/[ec, rand, hash] import stew/results diff --git a/libp2p/crypto/ecnist.nim b/libp2p/crypto/ecnist.nim index e6874613a4..51786f3b1a 100644 --- a/libp2p/crypto/ecnist.nim +++ b/libp2p/crypto/ecnist.nim @@ -14,7 +14,10 @@ ## BearSSL library ## Copyright(C) 2018 Thomas Pornin . -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import bearssl/[ec, rand, hash] # We use `ncrutils` for constant-time hexadecimal encoding/decoding procedures. diff --git a/libp2p/crypto/ed25519/ed25519.nim b/libp2p/crypto/ed25519/ed25519.nim index e6e1996942..c906113a90 100644 --- a/libp2p/crypto/ed25519/ed25519.nim +++ b/libp2p/crypto/ed25519/ed25519.nim @@ -11,7 +11,10 @@ ## This code is a port of the public domain, "ref10" implementation of ed25519 ## from SUPERCOP. -{.push raises: Defect.} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import bearssl/rand import constants diff --git a/libp2p/crypto/hkdf.nim b/libp2p/crypto/hkdf.nim index 4159867c5e..88ad17a8fa 100644 --- a/libp2p/crypto/hkdf.nim +++ b/libp2p/crypto/hkdf.nim @@ -9,7 +9,10 @@ # https://tools.ietf.org/html/rfc5869 -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import nimcrypto import bearssl/[kdf, rand, hash] diff --git a/libp2p/crypto/minasn1.nim b/libp2p/crypto/minasn1.nim index c23b0e35d2..cb30b662da 100644 --- a/libp2p/crypto/minasn1.nim +++ b/libp2p/crypto/minasn1.nim @@ -9,7 +9,10 @@ ## This module implements minimal ASN.1 encoding/decoding primitives. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import stew/[endians2, results, ctops] export results diff --git a/libp2p/crypto/rsa.nim b/libp2p/crypto/rsa.nim index 2b95a4452d..5fe82ee065 100644 --- a/libp2p/crypto/rsa.nim +++ b/libp2p/crypto/rsa.nim @@ -13,7 +13,11 @@ ## BearSSL library ## Copyright(C) 2018 Thomas Pornin . -{.push raises: Defect.} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} + import bearssl/[rsa, rand, hash] import minasn1 import stew/[results, ctops] diff --git a/libp2p/crypto/secp.nim b/libp2p/crypto/secp.nim index bff6b518a3..20daa13ef5 100644 --- a/libp2p/crypto/secp.nim +++ b/libp2p/crypto/secp.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import bearssl/rand import diff --git a/libp2p/daemon/daemonapi.nim b/libp2p/daemon/daemonapi.nim index 2c330db241..4e802c4340 100644 --- a/libp2p/daemon/daemonapi.nim +++ b/libp2p/daemon/daemonapi.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} ## This module implementes API for `go-libp2p-daemon`. import std/[os, osproc, strutils, tables, strtabs, sequtils] diff --git a/libp2p/daemon/transpool.nim b/libp2p/daemon/transpool.nim index 381f827447..c1c07c16de 100644 --- a/libp2p/daemon/transpool.nim +++ b/libp2p/daemon/transpool.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} ## This module implements Pool of StreamTransport. import chronos diff --git a/libp2p/dial.nim b/libp2p/dial.nim index 9f16c89cea..46843e56f0 100644 --- a/libp2p/dial.nim +++ b/libp2p/dial.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos import peerid, diff --git a/libp2p/multiaddress.nim b/libp2p/multiaddress.nim index 4405973fec..9485488149 100644 --- a/libp2p/multiaddress.nim +++ b/libp2p/multiaddress.nim @@ -9,7 +9,10 @@ ## This module implements MultiAddress. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} {.push public.} import pkg/chronos diff --git a/libp2p/multibase.nim b/libp2p/multibase.nim index 19ca75f876..61430f3b58 100644 --- a/libp2p/multibase.nim +++ b/libp2p/multibase.nim @@ -13,7 +13,10 @@ ## 1. base32z ## -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import tables import stew/[base32, base58, base64, results] diff --git a/libp2p/multicodec.nim b/libp2p/multicodec.nim index 6abfbcae0c..0cfc4c5585 100644 --- a/libp2p/multicodec.nim +++ b/libp2p/multicodec.nim @@ -9,7 +9,10 @@ ## This module implements MultiCodec. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import tables, hashes import varint, vbuffer diff --git a/libp2p/multihash.nim b/libp2p/multihash.nim index f449bbd3a8..f991b02ba4 100644 --- a/libp2p/multihash.nim +++ b/libp2p/multihash.nim @@ -21,7 +21,10 @@ ## 1. SKEIN ## 2. MURMUR -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import tables import nimcrypto/[sha, sha2, keccak, blake2, hash, utils] diff --git a/libp2p/multistream.nim b/libp2p/multistream.nim index c44f9564dc..e2797a6a36 100644 --- a/libp2p/multistream.nim +++ b/libp2p/multistream.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[strutils, sequtils] import chronos, chronicles, stew/byteutils diff --git a/libp2p/muxers/mplex/coder.nim b/libp2p/muxers/mplex/coder.nim index e1ba5bf773..f2cce3fcec 100644 --- a/libp2p/muxers/mplex/coder.nim +++ b/libp2p/muxers/mplex/coder.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import pkg/[chronos, nimcrypto/utils, chronicles, stew/byteutils] import ../../stream/connection, diff --git a/libp2p/muxers/mplex/lpchannel.nim b/libp2p/muxers/mplex/lpchannel.nim index a151915016..54d0da5dae 100644 --- a/libp2p/muxers/mplex/lpchannel.nim +++ b/libp2p/muxers/mplex/lpchannel.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[oids, strformat] import pkg/[chronos, chronicles, metrics, nimcrypto/utils] @@ -84,7 +87,7 @@ proc open*(s: LPChannel) {.async, gcsafe.} = await s.conn.close() raise exc -method closed*(s: LPChannel): bool {.raises: [Defect].} = +method closed*(s: LPChannel): bool = s.closedLocal proc closeUnderlying(s: LPChannel): Future[void] {.async.} = diff --git a/libp2p/muxers/mplex/mplex.nim b/libp2p/muxers/mplex/mplex.nim index e2d54a16b9..90838120d7 100644 --- a/libp2p/muxers/mplex/mplex.nim +++ b/libp2p/muxers/mplex/mplex.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import tables, sequtils, oids import chronos, chronicles, stew/byteutils, metrics diff --git a/libp2p/muxers/muxer.nim b/libp2p/muxers/muxer.nim index eda79c019a..69e57e131b 100644 --- a/libp2p/muxers/muxer.nim +++ b/libp2p/muxers/muxer.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos, chronicles import ../protocols/protocol, diff --git a/libp2p/muxers/yamux/yamux.nim b/libp2p/muxers/yamux/yamux.nim index 02e96f7cee..83deb1009a 100644 --- a/libp2p/muxers/yamux/yamux.nim +++ b/libp2p/muxers/yamux/yamux.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import sequtils, std/[tables] import chronos, chronicles, metrics, stew/[endians2, byteutils, objects] diff --git a/libp2p/nameresolving/dnsresolver.nim b/libp2p/nameresolving/dnsresolver.nim index 2bda23c726..51be45624d 100644 --- a/libp2p/nameresolving/dnsresolver.nim +++ b/libp2p/nameresolving/dnsresolver.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[streams, strutils, sets, sequtils], diff --git a/libp2p/nameresolving/mockresolver.nim b/libp2p/nameresolving/mockresolver.nim index e1d84488e5..4d9a0617b0 100644 --- a/libp2p/nameresolving/mockresolver.nim +++ b/libp2p/nameresolving/mockresolver.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[streams, strutils, tables], diff --git a/libp2p/nameresolving/nameresolver.nim b/libp2p/nameresolving/nameresolver.nim index ad87af13e9..0fdd6a0292 100644 --- a/libp2p/nameresolving/nameresolver.nim +++ b/libp2p/nameresolving/nameresolver.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sugar, sets, sequtils, strutils] import diff --git a/libp2p/peerid.nim b/libp2p/peerid.nim index efc43cfc41..dc7a4aee01 100644 --- a/libp2p/peerid.nim +++ b/libp2p/peerid.nim @@ -9,7 +9,10 @@ ## This module implementes API for libp2p peer. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} {.push public.} import diff --git a/libp2p/peerinfo.nim b/libp2p/peerinfo.nim index 2834211fde..59fbe74e7b 100644 --- a/libp2p/peerinfo.nim +++ b/libp2p/peerinfo.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} {.push public.} import std/[options, sequtils] diff --git a/libp2p/peerstore.nim b/libp2p/peerstore.nim index efe38a6a91..88f2ec4001 100644 --- a/libp2p/peerstore.nim +++ b/libp2p/peerstore.nim @@ -22,7 +22,10 @@ runnableExamples: peerStore[MoodBook][somePeerId] = "Happy" doAssert peerStore[MoodBook][somePeerId] == "Happy" -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sets, options, macros], diff --git a/libp2p/protobuf/minprotobuf.nim b/libp2p/protobuf/minprotobuf.nim index a7144e21dc..e1e36bd61c 100644 --- a/libp2p/protobuf/minprotobuf.nim +++ b/libp2p/protobuf/minprotobuf.nim @@ -9,7 +9,10 @@ ## This module implements minimal Google's ProtoBuf primitives. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import ../varint, ../utility, stew/[endians2, results] export results, utility diff --git a/libp2p/protocols/identify.nim b/libp2p/protocols/identify.nim index 9fce0e1505..975126ff81 100644 --- a/libp2p/protocols/identify.nim +++ b/libp2p/protocols/identify.nim @@ -10,7 +10,10 @@ ## `Identify `_ and ## `Push Identify `_ implementation -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sequtils, options, strutils, sugar] import chronos, chronicles diff --git a/libp2p/protocols/ping.nim b/libp2p/protocols/ping.nim index 648a60d7c5..9c31c8935f 100644 --- a/libp2p/protocols/ping.nim +++ b/libp2p/protocols/ping.nim @@ -9,7 +9,10 @@ ## `Ping `_ protocol implementation -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos, chronicles import bearssl/[rand, hash] diff --git a/libp2p/protocols/protocol.nim b/libp2p/protocols/protocol.nim index adafe89d48..ee3c39a625 100644 --- a/libp2p/protocols/protocol.nim +++ b/libp2p/protocols/protocol.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos import ../stream/connection diff --git a/libp2p/protocols/pubsub/floodsub.nim b/libp2p/protocols/pubsub/floodsub.nim index 56c08094f1..0bbf093996 100644 --- a/libp2p/protocols/pubsub/floodsub.nim +++ b/libp2p/protocols/pubsub/floodsub.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sequtils, sets, hashes, tables] import chronos, chronicles, metrics diff --git a/libp2p/protocols/pubsub/gossipsub.nim b/libp2p/protocols/pubsub/gossipsub.nim index 72beab51de..9d816795eb 100644 --- a/libp2p/protocols/pubsub/gossipsub.nim +++ b/libp2p/protocols/pubsub/gossipsub.nim @@ -9,7 +9,10 @@ ## Gossip based publishing -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sets, options, sequtils] import chronos, chronicles, metrics diff --git a/libp2p/protocols/pubsub/gossipsub/behavior.nim b/libp2p/protocols/pubsub/gossipsub/behavior.nim index 5351e464e1..b3b1f4cada 100644 --- a/libp2p/protocols/pubsub/gossipsub/behavior.nim +++ b/libp2p/protocols/pubsub/gossipsub/behavior.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sequtils, sets, algorithm] import chronos, chronicles, metrics diff --git a/libp2p/protocols/pubsub/gossipsub/scoring.nim b/libp2p/protocols/pubsub/gossipsub/scoring.nim index 28ae245a57..801134d2ff 100644 --- a/libp2p/protocols/pubsub/gossipsub/scoring.nim +++ b/libp2p/protocols/pubsub/gossipsub/scoring.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sets, options] import chronos, chronicles, metrics @@ -101,7 +104,6 @@ proc disconnectPeer(g: GossipSub, peer: PubSubPeer) {.async.} = except CatchableError as exc: # Never cancelled trace "Failed to close connection", peer, error = exc.name, msg = exc.msg -{.push raises: [Defect].} proc updateScores*(g: GossipSub) = # avoid async ## https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#the-score-function diff --git a/libp2p/protocols/pubsub/gossipsub/types.nim b/libp2p/protocols/pubsub/gossipsub/types.nim index 89107a7ee7..5142aef9c9 100644 --- a/libp2p/protocols/pubsub/gossipsub/types.nim +++ b/libp2p/protocols/pubsub/gossipsub/types.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos import std/[tables, sets] diff --git a/libp2p/protocols/pubsub/mcache.nim b/libp2p/protocols/pubsub/mcache.nim index ef7c8d03ba..edb5fe4add 100644 --- a/libp2p/protocols/pubsub/mcache.nim +++ b/libp2p/protocols/pubsub/mcache.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sets, tables, options] import rpc/[messages] diff --git a/libp2p/protocols/pubsub/peertable.nim b/libp2p/protocols/pubsub/peertable.nim index c8eb86c2a1..22034010bc 100644 --- a/libp2p/protocols/pubsub/peertable.nim +++ b/libp2p/protocols/pubsub/peertable.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sets] import ./pubsubpeer, ../../peerid diff --git a/libp2p/protocols/pubsub/pubsub.nim b/libp2p/protocols/pubsub/pubsub.nim index 75ab36370c..823d792cbb 100644 --- a/libp2p/protocols/pubsub/pubsub.nim +++ b/libp2p/protocols/pubsub/pubsub.nim @@ -13,7 +13,10 @@ ## `publish<#publish.e%2CPubSub%2Cstring%2Cseq%5Bbyte%5D>`_ something on it, ## and eventually `unsubscribe<#unsubscribe%2CPubSub%2Cstring%2CTopicHandler>`_ from it. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sequtils, sets, strutils] import chronos, chronicles, metrics diff --git a/libp2p/protocols/pubsub/pubsubpeer.nim b/libp2p/protocols/pubsub/pubsubpeer.nim index f2dd144f41..89f5733dae 100644 --- a/libp2p/protocols/pubsub/pubsubpeer.nim +++ b/libp2p/protocols/pubsub/pubsubpeer.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sequtils, strutils, tables, hashes] import chronos, chronicles, nimcrypto/sha2, metrics diff --git a/libp2p/protocols/pubsub/rpc/message.nim b/libp2p/protocols/pubsub/rpc/message.nim index 8303a71b99..e0c322bc77 100644 --- a/libp2p/protocols/pubsub/rpc/message.nim +++ b/libp2p/protocols/pubsub/rpc/message.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import hashes import chronicles, metrics, stew/[byteutils, endians2] diff --git a/libp2p/protocols/pubsub/rpc/messages.nim b/libp2p/protocols/pubsub/rpc/messages.nim index e6a906c92b..b12f453161 100644 --- a/libp2p/protocols/pubsub/rpc/messages.nim +++ b/libp2p/protocols/pubsub/rpc/messages.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options, sequtils import "../../.."/[ diff --git a/libp2p/protocols/pubsub/rpc/protobuf.nim b/libp2p/protocols/pubsub/rpc/protobuf.nim index a32af070ae..1b4cd22682 100644 --- a/libp2p/protocols/pubsub/rpc/protobuf.nim +++ b/libp2p/protocols/pubsub/rpc/protobuf.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options import stew/assign2 @@ -17,7 +20,6 @@ import messages, ../../../utility, ../../../protobuf/minprotobuf -{.push raises: [Defect].} logScope: topics = "pubsubprotobuf" diff --git a/libp2p/protocols/pubsub/timedcache.nim b/libp2p/protocols/pubsub/timedcache.nim index 7cdf26b70b..83bb08c63e 100644 --- a/libp2p/protocols/pubsub/timedcache.nim +++ b/libp2p/protocols/pubsub/timedcache.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables] diff --git a/libp2p/protocols/relay/client.nim b/libp2p/protocols/relay/client.nim index 87811a89b6..8f03881aeb 100644 --- a/libp2p/protocols/relay/client.nim +++ b/libp2p/protocols/relay/client.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import times, options diff --git a/libp2p/protocols/relay/messages.nim b/libp2p/protocols/relay/messages.nim index af55c88748..62e2aaa0f9 100644 --- a/libp2p/protocols/relay/messages.nim +++ b/libp2p/protocols/relay/messages.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options, macros, sequtils import stew/objects diff --git a/libp2p/protocols/relay/rconn.nim b/libp2p/protocols/relay/rconn.nim index c407cd535a..44dbb1445c 100644 --- a/libp2p/protocols/relay/rconn.nim +++ b/libp2p/protocols/relay/rconn.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos diff --git a/libp2p/protocols/relay/relay.nim b/libp2p/protocols/relay/relay.nim index 394e4bde80..10288eb344 100644 --- a/libp2p/protocols/relay/relay.nim +++ b/libp2p/protocols/relay/relay.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options, sequtils, tables, sugar diff --git a/libp2p/protocols/relay/rtransport.nim b/libp2p/protocols/relay/rtransport.nim index 15edd4f7e1..d84f43355d 100644 --- a/libp2p/protocols/relay/rtransport.nim +++ b/libp2p/protocols/relay/rtransport.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import sequtils, strutils diff --git a/libp2p/protocols/relay/utils.nim b/libp2p/protocols/relay/utils.nim index 2466762036..efa9744bad 100644 --- a/libp2p/protocols/relay/utils.nim +++ b/libp2p/protocols/relay/utils.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import options diff --git a/libp2p/protocols/secure/noise.nim b/libp2p/protocols/secure/noise.nim index 4051f09c8e..6e613ea422 100644 --- a/libp2p/protocols/secure/noise.nim +++ b/libp2p/protocols/secure/noise.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[oids, strformat] import chronos diff --git a/libp2p/protocols/secure/plaintext.nim b/libp2p/protocols/secure/plaintext.nim index c7e44a5ee0..151c7e6b01 100644 --- a/libp2p/protocols/secure/plaintext.nim +++ b/libp2p/protocols/secure/plaintext.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos import secure, ../../stream/connection diff --git a/libp2p/protocols/secure/secio.nim b/libp2p/protocols/secure/secio.nim index f963a795d4..46a05c71cf 100644 --- a/libp2p/protocols/secure/secio.nim +++ b/libp2p/protocols/secure/secio.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[oids, strformat] import bearssl/rand diff --git a/libp2p/protocols/secure/secure.nim b/libp2p/protocols/secure/secure.nim index 58bfc9f123..f841a5d046 100644 --- a/libp2p/protocols/secure/secure.nim +++ b/libp2p/protocols/secure/secure.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[strformat] import chronos, chronicles diff --git a/libp2p/routing_record.nim b/libp2p/routing_record.nim index 10b584864d..cde43c33b8 100644 --- a/libp2p/routing_record.nim +++ b/libp2p/routing_record.nim @@ -9,7 +9,10 @@ ## This module implements Routing Records. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sequtils, times] import pkg/stew/results diff --git a/libp2p/signed_envelope.nim b/libp2p/signed_envelope.nim index ac680d2c78..7d4e3dec12 100644 --- a/libp2p/signed_envelope.nim +++ b/libp2p/signed_envelope.nim @@ -9,7 +9,10 @@ ## This module implements Signed Envelope. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/sugar import pkg/stew/[results, byteutils] diff --git a/libp2p/stream/bufferstream.nim b/libp2p/stream/bufferstream.nim index cc3471a492..6eb83ed0cb 100644 --- a/libp2p/stream/bufferstream.nim +++ b/libp2p/stream/bufferstream.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/strformat import stew/byteutils @@ -108,7 +111,7 @@ method pushEof*(s: BufferStream) {.base, async.} = finally: s.pushing = false -method atEof*(s: BufferStream): bool {.raises: [Defect].} = +method atEof*(s: BufferStream): bool = s.isEof and s.readBuf.len == 0 method readOnce*(s: BufferStream, diff --git a/libp2p/stream/chronosstream.nim b/libp2p/stream/chronosstream.nim index 5ada270e94..2b676d4682 100644 --- a/libp2p/stream/chronosstream.nim +++ b/libp2p/stream/chronosstream.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[oids, strformat] import chronos, chronicles, metrics diff --git a/libp2p/stream/connection.nim b/libp2p/stream/connection.nim index 5216990c91..43f58af669 100644 --- a/libp2p/stream/connection.nim +++ b/libp2p/stream/connection.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[hashes, oids, strformat] import chronicles, chronos, metrics diff --git a/libp2p/stream/lpstream.nim b/libp2p/stream/lpstream.nim index ec3a7b28db..6857da3f4b 100644 --- a/libp2p/stream/lpstream.nim +++ b/libp2p/stream/lpstream.nim @@ -9,7 +9,10 @@ ## Length Prefixed stream implementation -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/oids import stew/byteutils diff --git a/libp2p/stream/streamseq.nim b/libp2p/stream/streamseq.nim index 13ac060710..f91b9bdf70 100644 --- a/libp2p/stream/streamseq.nim +++ b/libp2p/stream/streamseq.nim @@ -1,4 +1,7 @@ -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import stew/bitops2 diff --git a/libp2p/switch.nim b/libp2p/switch.nim index cfa7dc82df..6a6cf6979c 100644 --- a/libp2p/switch.nim +++ b/libp2p/switch.nim @@ -11,7 +11,10 @@ ## transports, the connection manager, the upgrader and other ## parts to allow programs to use libp2p -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, options, diff --git a/libp2p/transports/tcptransport.nim b/libp2p/transports/tcptransport.nim index 589854c51d..24f63f6af7 100644 --- a/libp2p/transports/tcptransport.nim +++ b/libp2p/transports/tcptransport.nim @@ -9,7 +9,10 @@ ## TCP transport implementation -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[oids, sequtils] import chronos, chronicles diff --git a/libp2p/transports/transport.nim b/libp2p/transports/transport.nim index d377a961dc..951f8bf834 100644 --- a/libp2p/transports/transport.nim +++ b/libp2p/transports/transport.nim @@ -8,7 +8,10 @@ # those terms. ## -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import sequtils import chronos, chronicles diff --git a/libp2p/transports/wstransport.nim b/libp2p/transports/wstransport.nim index 15fb5be830..50eb7c3333 100644 --- a/libp2p/transports/wstransport.nim +++ b/libp2p/transports/wstransport.nim @@ -9,7 +9,10 @@ ## WebSocket & WebSocket Secure transport implementation -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[sequtils] import chronos, chronicles diff --git a/libp2p/upgrademngrs/muxedupgrade.nim b/libp2p/upgrademngrs/muxedupgrade.nim index 867d060d55..f60d0c1591 100644 --- a/libp2p/upgrademngrs/muxedupgrade.nim +++ b/libp2p/upgrademngrs/muxedupgrade.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[tables, sequtils] import pkg/[chronos, chronicles, metrics] diff --git a/libp2p/upgrademngrs/upgrade.nim b/libp2p/upgrademngrs/upgrade.nim index 758cc9ae31..781a074bc7 100644 --- a/libp2p/upgrademngrs/upgrade.nim +++ b/libp2p/upgrademngrs/upgrade.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import std/[options, sequtils, strutils] import pkg/[chronos, chronicles, metrics] diff --git a/libp2p/utility.nim b/libp2p/utility.nim index 8cb7a7b220..dd499b5bb3 100644 --- a/libp2p/utility.nim +++ b/libp2p/utility.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import stew/byteutils diff --git a/libp2p/utils/heartbeat.nim b/libp2p/utils/heartbeat.nim index 3fad818a0a..6756b16259 100644 --- a/libp2p/utils/heartbeat.nim +++ b/libp2p/utils/heartbeat.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import sequtils import chronos, chronicles diff --git a/libp2p/utils/semaphore.nim b/libp2p/utils/semaphore.nim index 4fc114ddf7..12f4a4dafe 100644 --- a/libp2p/utils/semaphore.nim +++ b/libp2p/utils/semaphore.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import sequtils import chronos, chronicles diff --git a/libp2p/varint.nim b/libp2p/varint.nim index 328ab51de3..e881a317a0 100644 --- a/libp2p/varint.nim +++ b/libp2p/varint.nim @@ -16,7 +16,10 @@ ## maximum size of encoded value is 9 octets (bytes). ## https://github.com/multiformats/unsigned-varint -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import stew/[byteutils, leb128, results] export leb128, results diff --git a/libp2p/vbuffer.nim b/libp2p/vbuffer.nim index 3f318e0f73..7a834ad234 100644 --- a/libp2p/vbuffer.nim +++ b/libp2p/vbuffer.nim @@ -9,7 +9,10 @@ ## This module implements variable buffer. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import varint, strutils diff --git a/libp2p/wire.nim b/libp2p/wire.nim index f8f9d18e49..61c0010af5 100644 --- a/libp2p/wire.nim +++ b/libp2p/wire.nim @@ -7,7 +7,10 @@ # This file may not be copied, modified, or distributed except according to # those terms. -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} ## This module implements wire network connection procedures. import chronos, stew/endians2 diff --git a/tests/helpers.nim b/tests/helpers.nim index 7be83da8fa..b82011f7c6 100644 --- a/tests/helpers.nim +++ b/tests/helpers.nim @@ -1,4 +1,7 @@ -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import chronos @@ -13,7 +16,6 @@ import ../libp2p/protocols/secure/secure import ./asyncunit export asyncunit -{.push raises: [Defect].} const StreamTransportTrackerName = "stream.transport" diff --git a/tests/testmultistream.nim b/tests/testmultistream.nim index 6b07fcc720..6bdf1aa40a 100644 --- a/tests/testmultistream.nim +++ b/tests/testmultistream.nim @@ -11,7 +11,10 @@ import ../libp2p/errors, ../libp2p/upgrademngrs/upgrade -{.push raises: [Defect].} +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} import ./helpers @@ -56,7 +59,7 @@ method readOnce*(s: TestSelectStream, method write*(s: TestSelectStream, msg: seq[byte]) {.async, gcsafe.} = discard -method close(s: TestSelectStream) {.async, gcsafe, raises: [Defect].} = +method close(s: TestSelectStream) {.async, gcsafe.} = s.isClosed = true s.isEof = true diff --git a/tests/testnoise.nim b/tests/testnoise.nim index 156d5da69c..eabe56b586 100644 --- a/tests/testnoise.nim +++ b/tests/testnoise.nim @@ -39,7 +39,12 @@ const type TestProto = ref object of LPProtocol -method init(p: TestProto) {.gcsafe, raises: [Defect].} = +when (NimMajor, NimMinor) < (1, 4): + {.push raises: [Defect].} +else: + {.push raises: [].} + +method init(p: TestProto) {.gcsafe.} = proc handle(conn: Connection, proto: string) {.async, gcsafe.} = let msg = string.fromBytes(await conn.readLp(1024)) check "Hello!" == msg @@ -49,6 +54,9 @@ method init(p: TestProto) {.gcsafe, raises: [Defect].} = p.codec = TestCodec p.handler = handle +{.pop.} + + proc createSwitch(ma: MultiAddress; outgoing: bool, secio: bool = false): (Switch, PeerInfo) = var privateKey = PrivateKey.random(ECDSA, rng[]).get() From 2d864633eafaed727817da2b530a7c923467bf4d Mon Sep 17 00:00:00 2001 From: Tanguy Date: Wed, 3 Aug 2022 16:48:19 +0200 Subject: [PATCH 3/3] ConnManager connection tracking refacto (#749) --- libp2p/connmanager.nim | 106 ++++++--------------- libp2p/dialer.nim | 31 +++--- libp2p/switch.nim | 12 ++- tests/testconnmngr.nim | 208 +++++++++-------------------------------- tests/testswitch.nim | 16 ++++ 5 files changed, 107 insertions(+), 266 deletions(-) diff --git a/libp2p/connmanager.nim b/libp2p/connmanager.nim index e64947e510..b7ac3d87aa 100644 --- a/libp2p/connmanager.nim +++ b/libp2p/connmanager.nim @@ -33,9 +33,6 @@ const type TooManyConnectionsError* = object of LPError - ConnProvider* = proc(): Future[Connection] - {.gcsafe, closure, raises: [Defect].} - ConnEventKind* {.pure.} = enum Connected, # A connection was made and securely upgraded - there may be # more than one concurrent connection thus more than one upgrade @@ -84,6 +81,10 @@ type peerEvents: array[PeerEventKind, OrderedSet[PeerEventHandler]] peerStore*: PeerStore + ConnectionSlot* = object + connManager: ConnManager + direction: Direction + proc newTooManyConnectionsError(): ref TooManyConnectionsError {.inline.} = result = newException(TooManyConnectionsError, "Too many connections") @@ -404,90 +405,39 @@ proc storeConn*(c: ConnManager, conn: Connection) trace "Stored connection", conn, direction = $conn.dir, connections = c.conns.len -proc trackConn(c: ConnManager, - provider: ConnProvider, - sema: AsyncSemaphore): - Future[Connection] {.async.} = - var conn: Connection - try: - conn = await provider() - - if isNil(conn): - return - - trace "Got connection", conn - - proc semaphoreMonitor() {.async.} = - try: - await conn.join() - except CatchableError as exc: - trace "Exception in semaphore monitor, ignoring", exc = exc.msg - - sema.release() - - asyncSpawn semaphoreMonitor() - except CatchableError as exc: - trace "Exception tracking connection", exc = exc.msg - if not isNil(conn): - await conn.close() - - raise exc - - return conn - -proc trackIncomingConn*(c: ConnManager, - provider: ConnProvider): - Future[Connection] {.async.} = - ## await for a connection slot before attempting - ## to call the connection provider - ## - - var conn: Connection - try: - trace "Tracking incoming connection" - await c.inSema.acquire() - conn = await c.trackConn(provider, c.inSema) - if isNil(conn): - trace "Couldn't acquire connection, releasing semaphore slot", dir = $Direction.In - c.inSema.release() - - return conn - except CatchableError as exc: - trace "Exception tracking connection", exc = exc.msg - c.inSema.release() - raise exc - -proc trackOutgoingConn*(c: ConnManager, - provider: ConnProvider, - forceDial = false): - Future[Connection] {.async.} = - ## try acquiring a connection if all slots - ## are already taken, raise TooManyConnectionsError - ## exception - ## - - trace "Tracking outgoing connection", count = c.outSema.count, - max = c.outSema.size +proc getIncomingSlot*(c: ConnManager): Future[ConnectionSlot] {.async.} = + await c.inSema.acquire() + return ConnectionSlot(connManager: c, direction: In) +proc getOutgoingSlot*(c: ConnManager, forceDial = false): Future[ConnectionSlot] {.async.} = if forceDial: c.outSema.forceAcquire() elif not c.outSema.tryAcquire(): trace "Too many outgoing connections!", count = c.outSema.count, max = c.outSema.size raise newTooManyConnectionsError() + return ConnectionSlot(connManager: c, direction: Out) - var conn: Connection - try: - conn = await c.trackConn(provider, c.outSema) - if isNil(conn): - trace "Couldn't acquire connection, releasing semaphore slot", dir = $Direction.Out - c.outSema.release() +proc release*(cs: ConnectionSlot) = + if cs.direction == In: + cs.connManager.inSema.release() + else: + cs.connManager.outSema.release() - return conn - except CatchableError as exc: - trace "Exception tracking connection", exc = exc.msg - c.outSema.release() - raise exc +proc trackConnection*(cs: ConnectionSlot, conn: Connection) = + if isNil(conn): + cs.release() + return + + proc semaphoreMonitor() {.async.} = + try: + await conn.join() + except CatchableError as exc: + trace "Exception in semaphore monitor, ignoring", exc = exc.msg + + cs.release() + + asyncSpawn semaphoreMonitor() proc storeMuxer*(c: ConnManager, muxer: Muxer, diff --git a/libp2p/dialer.nim b/libp2p/dialer.nim index 9d50cb5474..ece835af70 100644 --- a/libp2p/dialer.nim +++ b/libp2p/dialer.nim @@ -47,8 +47,7 @@ type proc dialAndUpgrade( self: Dialer, peerId: PeerId, - addrs: seq[MultiAddress], - forceDial: bool): + addrs: seq[MultiAddress]): Future[Connection] {.async.} = debug "Dialing peer", peerId @@ -65,20 +64,7 @@ proc dialAndUpgrade( trace "Dialing address", address = $a, peerId, hostname let dialed = try: libp2p_total_dial_attempts.inc() - # await a connection slot when the total - # connection count is equal to `maxConns` - # - # Need to copy to avoid "cannot be captured" errors in Nim-1.4.x. - let - transportCopy = transport - addressCopy = a - await self.connManager.trackOutgoingConn( - () => transportCopy.dial(hostname, addressCopy), - forceDial - ) - except TooManyConnectionsError as exc: - trace "Connection limit reached!" - raise exc + await transport.dial(hostname, a) except CancelledError as exc: debug "Dialing canceled", msg = exc.msg, peerId raise exc @@ -101,6 +87,7 @@ proc dialAndUpgrade( except CatchableError as exc: # If we failed to establish the connection through one transport, # we won't succeeded through another - no use in trying again + # TODO we should try another address though await dialed.close() debug "Upgrade failed", msg = exc.msg, peerId if exc isnot CancelledError: @@ -139,12 +126,18 @@ proc internalConnect( trace "Reusing existing connection", conn, direction = $conn.dir return conn - conn = await self.dialAndUpgrade(peerId, addrs, forceDial) + let slot = await self.connManager.getOutgoingSlot(forceDial) + conn = + try: + await self.dialAndUpgrade(peerId, addrs) + except CatchableError as exc: + slot.release() + raise exc + slot.trackConnection(conn) if isNil(conn): # None of the addresses connected raise newException(DialFailedError, "Unable to establish outgoing link") - # We already check for this in Connection manager - # but a disconnect could have happened right after + # A disconnect could have happened right after # we've added the connection so we check again # to prevent races due to that. if conn.closed() or conn.atEof(): diff --git a/libp2p/switch.nim b/libp2p/switch.nim index 6a6cf6979c..f6f292510a 100644 --- a/libp2p/switch.nim +++ b/libp2p/switch.nim @@ -214,10 +214,14 @@ proc accept(s: Switch, transport: Transport) {.async.} = # noraises # the upgrade succeeds or fails, this is # currently done by the `upgradeMonitor` await upgrades.acquire() # first wait for an upgrade slot to become available - conn = await s.connManager # next attempt to get an incoming connection - .trackIncomingConn( - () => transport.accept() - ) + let slot = await s.connManager.getIncomingSlot() + conn = + try: + await transport.accept() + except CatchableError as exc: + slot.release() + raise exc + slot.trackConnection(conn) if isNil(conn): # A nil connection means that we might have hit a # file-handle limit (or another non-fatal error), diff --git a/tests/testconnmngr.nim b/tests/testconnmngr.nim index 6aaa4edb00..5c705bf36e 100644 --- a/tests/testconnmngr.nim +++ b/tests/testconnmngr.nim @@ -243,253 +243,131 @@ suite "Connection Manager": asyncTest "track total incoming connection limits": let connMngr = ConnManager.new(maxConnections = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check await conn.withTimeout(10.millis) - conns.add(await conn) + check await connMngr.getIncomingSlot().withTimeout(10.millis) # should timeout adding a connection over the limit - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check not(await conn.withTimeout(10.millis)) + check not(await connMngr.getIncomingSlot().withTimeout(10.millis)) await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track total outgoing connection limits": let connMngr = ConnManager.new(maxConnections = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - conns.add(conn) + check await connMngr.getOutgoingSlot().withTimeout(10.millis) # should throw adding a connection over the limit expect TooManyConnectionsError: - discard await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) + discard await connMngr.getOutgoingSlot() await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track both incoming and outgoing total connections limits - fail on incoming": let connMngr = ConnManager.new(maxConnections = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - conns.add(conn) + check await connMngr.getOutgoingSlot().withTimeout(10.millis) # should timeout adding a connection over the limit - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check not(await conn.withTimeout(10.millis)) + check not(await connMngr.getIncomingSlot().withTimeout(10.millis)) await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track both incoming and outgoing total connections limits - fail on outgoing": let connMngr = ConnManager.new(maxConnections = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check await conn.withTimeout(10.millis) - conns.add(await conn) + check await connMngr.getIncomingSlot().withTimeout(10.millis) # should throw adding a connection over the limit expect TooManyConnectionsError: - discard await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) + discard await connMngr.getOutgoingSlot() await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track max incoming connection limits": let connMngr = ConnManager.new(maxIn = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) + check await connMngr.getIncomingSlot().withTimeout(10.millis) - check await conn.withTimeout(10.millis) - conns.add(await conn) - - # should timeout adding a connection over the limit - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check not(await conn.withTimeout(10.millis)) + check not(await connMngr.getIncomingSlot().withTimeout(10.millis)) await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track max outgoing connection limits": let connMngr = ConnManager.new(maxOut = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - conns.add(conn) + check await connMngr.getOutgoingSlot().withTimeout(10.millis) # should throw adding a connection over the limit expect TooManyConnectionsError: - discard await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) + discard await connMngr.getOutgoingSlot() await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track incoming max connections limits - fail on incoming": let connMngr = ConnManager.new(maxOut = 3) - var conns: seq[Connection] for i in 0..<3: - let conn = await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - conns.add(conn) + check await connMngr.getOutgoingSlot().withTimeout(10.millis) # should timeout adding a connection over the limit - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check not(await conn.withTimeout(10.millis)) + check not(await connMngr.getIncomingSlot().withTimeout(10.millis)) await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "track incoming max connections limits - fail on outgoing": let connMngr = ConnManager.new(maxIn = 3) var conns: seq[Connection] for i in 0..<3: - let conn = connMngr.trackIncomingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) - - check await conn.withTimeout(10.millis) - conns.add(await conn) + check await connMngr.getIncomingSlot().withTimeout(10.millis) # should throw adding a connection over the limit expect TooManyConnectionsError: - discard await connMngr.trackOutgoingConn( - proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ) + discard await connMngr.getOutgoingSlot() await connMngr.close() - await allFuturesThrowing( - allFutures(conns.mapIt( it.close() ))) asyncTest "allow force dial": let connMngr = ConnManager.new(maxConnections = 2) var conns: seq[Connection] for i in 0..<3: - let conn = connMngr.trackOutgoingConn( - (proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ), true - ) - - check await conn.withTimeout(10.millis) - conns.add(await conn) + check await connMngr.getOutgoingSlot(true).withTimeout(10.millis) # should throw adding a connection over the limit expect TooManyConnectionsError: - discard await connMngr.trackOutgoingConn( - (proc(): Future[Connection] {.async.} = - return Connection.new( - PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), - Direction.In) - ), false - ) + discard await connMngr.getOutgoingSlot(false) await connMngr.close() + + asyncTest "release slot on connection end": + let connMngr = ConnManager.new(maxConnections = 3) + + var conns: seq[Connection] + for i in 0..<3: + let slot = await ((connMngr.getOutgoingSlot()).wait(10.millis)) + + let conn = + Connection.new( + PeerId.init(PrivateKey.random(ECDSA, (newRng())[]).tryGet()).tryGet(), + Direction.In) + + slot.trackConnection(conn) + conns.add(conn) + + # should be full now + let incomingSlot = connMngr.getIncomingSlot() + + check (await incomingSlot.withTimeout(10.millis)) == false + await allFuturesThrowing( allFutures(conns.mapIt( it.close() ))) + + check await incomingSlot.withTimeout(10.millis) + + await connMngr.close() diff --git a/tests/testswitch.nim b/tests/testswitch.nim index fc64a21f76..daaa0f0880 100644 --- a/tests/testswitch.nim +++ b/tests/testswitch.nim @@ -21,6 +21,7 @@ import ../libp2p/[errors, nameresolving/nameresolver, nameresolving/mockresolver, stream/chronosstream, + utils/semaphore, transports/tcptransport, transports/wstransport] import ./helpers @@ -206,6 +207,12 @@ suite "Switch": await switch1.start() await switch2.start() + let startCounts = + @[ + switch1.connManager.inSema.count, switch1.connManager.outSema.count, + switch2.connManager.inSema.count, switch2.connManager.outSema.count + ] + await switch2.connect(switch1.peerInfo.peerId, switch1.peerInfo.addrs) check switch1.isConnected(switch2.peerInfo.peerId) @@ -219,6 +226,15 @@ suite "Switch": checkTracker(LPChannelTrackerName) checkTracker(SecureConnTrackerName) + await sleepAsync(1.seconds) + + check: + startCounts == + @[ + switch1.connManager.inSema.count, switch1.connManager.outSema.count, + switch2.connManager.inSema.count, switch2.connManager.outSema.count + ] + await allFuturesThrowing( switch1.stop(), switch2.stop())