From d0c345734342a49caea8dcc95f4a4382226708ea Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Aug 2022 11:40:50 +0200 Subject: [PATCH] Documentation of v0.35 p2p layer: peer manager (#8982) * Doc: documentation of new p2p layer, first commit * Doc: p2p peer manager abstraction, first commit * Doc: life cycle of a peer, first part * Doc: life cycle of a p2p peer, picture added * typos * Doc: life cycle of a p2p peer picture updated * Doc: life cycle of a p2p peer section refactored * Doc: p2p connection policy and connection slots * Doc: peer manager defines the connection policy * Doc: peer manager connection slots upgrading * Doc: peer manager eviction procedure introduced * Doc: several corrections in peer manager documentation * Doc: peer ranking mechanism documented * Doc: EvictNext peer manager transition documented * Doc: concept of candidate peer added to peer manager * Doc: peer manager documentation, aesthetic changes * Apply suggestions from code review (again) Co-authored-by: Sergio Mena * Spec of v0.35 p2p layer moved to spec/p2p/v0.35 * Spec: p2p markdown links fixed * Spec: addressing more issues on peer manager spec * Spec: p2p peer manager DialNext algorithm * Spec: p2p peer manager Dial and Accepted algorithms * Spec: p2p router dialing peers thread * Spec: p2p router accept peers threads * Spec: p2p router evict peers routine * Spec: p2p router routing messages routines * Spec: p2p v0.35 readme points to other documents * Spec: fixing markdown links * Apply suggestions from Josef's code review * They state that this is a work in progress, that has been interrupted to focus on the specification of the p2p layer adopted by Tendermint v0.34. Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> * Spc: p2p v0.35 spec mentions new p2p layer Co-authored-by: Jasmina Malicevic Co-authored-by: Sergio Mena Co-authored-by: Josef Widder <44643235+josef-widder@users.noreply.github.com> Co-authored-by: Daniel Cason --- spec/p2p/v0.35/README.md | 14 + spec/p2p/v0.35/peer_manager.md | 473 ++++++++++++++++++ spec/p2p/v0.35/pics/p2p-v0.35-peermanager.png | Bin 0 -> 100073 bytes spec/p2p/v0.35/router.md | 128 +++++ 4 files changed, 615 insertions(+) create mode 100644 spec/p2p/v0.35/README.md create mode 100644 spec/p2p/v0.35/peer_manager.md create mode 100644 spec/p2p/v0.35/pics/p2p-v0.35-peermanager.png create mode 100644 spec/p2p/v0.35/router.md diff --git a/spec/p2p/v0.35/README.md b/spec/p2p/v0.35/README.md new file mode 100644 index 000000000..c183f999c --- /dev/null +++ b/spec/p2p/v0.35/README.md @@ -0,0 +1,14 @@ +# Peer-to-peer communication substrate - WIP + +This document details the operation of the [`p2p`][p2p-package] package of +Tendermint, refactored in the `v0.35` release. + +**This is a work in progress** ([#8935][issue]). The following files represent the current (unfinished) state of this documentation. It has been decided not to finish the documents at this point in time, but to publish them here in the current form for future reference. + +- [Peer manager](./peer_manager.md): determines when a node should connect to a + new peer, and which peer is preferred for establishing connections. +- [Router](./router.md): implements the actions instructed by the peer manager, + and route messages between the local reactors and the remote peers. + +[issue]: https://github.com/tendermint/tendermint/issues/8935 +[p2p-package]: https://github.com/tendermint/tendermint/tree/v0.35.x/internal/p2p diff --git a/spec/p2p/v0.35/peer_manager.md b/spec/p2p/v0.35/peer_manager.md new file mode 100644 index 000000000..b18133af6 --- /dev/null +++ b/spec/p2p/v0.35/peer_manager.md @@ -0,0 +1,473 @@ +# Peer manager - WIP + +The peer manager is the component of the *new* p2p layer that implements +the connection policy for the node, based on the +configuration provided by the operators, the current state of the connections +reported by the [`Router`](./router.md), and the set of known candidate peers. + +This document uses *candidate peer* to refer to the information about a node in +the network, namely its unique identifier and one or more network addresses. +This information can be manually configured by the node operator (e.g., via +`PersistentPeers` parameter) or can be obtained via the Peer-Exchange Protocol +(PEX), which feeds the peer manager with discovered peers' information. + +## Connection policy + +The connection policy defines: + +1. When the node should establish new connections to peers, and +1. The next peer to which the router should try to establish a connection. + +The first definition is made based on the concept of [connection slots](#connection-slots). +In short, the peer manager will try to fill every connection slot with a peer. +If all the connection slots are full but there is the possibility to connect to +a peer that is higher-[ranked](#peer-ranking) than one of the connecting peers, +the peer manager may attempt to [upgrade a connection slot](#slot-upgrades). +Details of these operations are provided in the following. + +### Connection slots + +The number of connection slots is defined by the `MaxConnected` parameter. + +While there are available connection slots, the peer manager will provide +candidate peers to the router, which will try to establish +new connections to them. +When the peer manager provides a candidate peer to +the router, a connection slot becomes _virtually_ occupied by the peer, as the +router should be dialing it. + +When the router establishes a connection to a peer, either +because it [accepted a connection](#accepted-transition) from a peer, +or because it [successfully dialed](#dialed-transition) a candidate peer, +the peer manager should find a slot for this connection. + +If there is an available connection slot, and this is the first connection +established with that peer, the slot is filled by the new connection and +the peer becomes a [connected peer](#connected-peer). +The peer manager does not allow two slots to be filled with connections to the +same peer. + +If all `MaxConnected` connection slots are full, the node should _a priori_ +reject the connection established with or accepted from the peer. +However, it is possible that the new connection is with a peer whose score is +better than the score of a peer occupying one of the connection slots. +In this case, the peer manager will try to [upgrade the slot](#slot-upgrades) +to make room to the new connection, by evicting the peer currently occupying +this slot. + +> Although not advisable, the `MaxConnected` parameter can be set to `0`, which +> means no limit. +> +> In this case, the node will accept all connections established by peers, and +> will try to establish connections (dial) to every candidate peer it knows. + +### Outgoing connections + +The peer manager distinguishes *incoming* from *outgoing* connections. +A connection is *incoming* when the router has [accepted](#accepted-transition) +it from a peer. +A connection is *outgoing* when the router has successfully +[dialed](#dialed-transition) a peer. + +If the `MaxOutgoingConnections` parameter is set (i.e., it is greater than zero), it +defines the maximum number of *outgoing* connections the node should maintain. +More precisely, it determines that the node should not attempt to dial new +peers when the router already has established outgoing connections to +`MaxOutgoingConnections` peers. +This parameter cannot be set to a value larger than `MaxConnected`. + +> The previous version of the `p2p` explicitly distinguished incoming and +> outgoing peers. Configuring the `MaxOutgoingConnections` parameters should +> therefore make the connection policy similar to the one adopted in the +> previous version. (TODO: check) + +### Slot upgrades + +The rationale behind this concept is that the node may try to establish or +accept connections even when all the connection slots are full, provided that +the peer in the other side of the new connection is better-ranked than a peer +that is occupying a connection slot. +A slot can therefore be upgraded, meaning that the lower-ranked peer +occupying the slot will be replaced by a higher-ranked peer. + +The upgrading of connection slots is determined by the `MaxConnectedUpgrade` +parameter, which defines the number of connections that the peer manager can +use for upgrading connection slots. + +If `MaxConnectedUpgrade` is set to zero, the upgrading of connection slots is +disabled. +This means, in particular, that `MaxConnected` is the hard limit of peers that +can be in the [connected state](#connected-peer). + +If `MaxConnectedUpgrade` is larger than zero, the upgrading of connection slots +is enabled. +As a result, the hard limit for the number of peers that can be in the +[connected state](#connected-peer) becomes `MaxConnected + MaxConnectedUpgrade`. +Some of these peers, however, will not remain in this state as they should be +[evicted](#evictnext-transition) by the router. + +### Peer ranking + +The peer manager should rank peers based on user-provided parameters and on the +current state of the peer. + +The ranking is established by ordering all known peers by its score. +This mechanism is currently very basic. + +> The code contains a number of potential replacements for this ranking +> mechanism. Therefore, improving this mechanism is a work in progress. + +Peers configured as `PersistentPeers` have _always_ `PeerScorePersistent`, +which is the maximum allowed peer score. + +The remaining peers have a `MutableScore`, initialized to `0` when the peer is +added to the peer manager. +When the peer is reported as a `PeerStatusGood`, its score is incremented. +When the peer is reported as a `PeerStatusBad`, its score is decremented. + +> The mechanisms based on the "reputation" of the peer according to reactors, +> however, appears not to be fully implemented. +> A peer is never `PeerStatusGood`, and is only reported as `PeerStatusBad` a +> reactor interacting with the peer reports an error to the router, and the +> error is not "fatal". +> If the error is fatal, the peer is reported as [errored](#errored-transition). + +This score can also be _temporarily_ decremented due to connection errors. +When the router fails to dial to a peer, it increments the peer's +`DialFailures` counter. +This counter is reset when the router successfully dials the peer, establishing +a connection to it. +During this period, between dial failures and succeeding to dial the peer, the +peer score is decremented by the `DialFailures` counter. + +> `DialFailures` actually refers to a peer address. A peer may have multiple +> addresses, and all associated counters are considered for decrementing the +> peer's score. Also, all counters are reset when the router succeeds dialing +> the peer. + +## Peer life cycle + +For implementing the connection policy, the peer manager keeps track of the +state of peers and manages their life-cycle. +The life cycle of a peer is summarized in the picture below. +The circles represent _states_ of a peer and the rectangles represent +_transitions_. +All transitions are performed by the `Router`, by invoking methods of the peer +manager with corresponding names. +Normal transitions are represented by green arrows, while red arrows represent +alternative transitions taken in case of errors. + +peer life cycle + +### Candidate peer + +The initial state of a peer in the peer manager. + +A `Candidate` peer may become an actual peer, to which the node is connected. +We do not use candidate to refer to a peer to which we are connected, nor to +a peer we are attempting to connect. + +Candidate peers from which the router recently disconnected or failed to dial +are, during a certain period, not eligible for establishing connections. +This scenario is represented by the `Frozen Candidate` state. + +### DialNext transition + +This state transition produces candidate peers the node should dial to, which +are consumed by the [dialing routine](./router.md#dialing-peers) of the router. + +The transition is performed when the [connection policy](#connection-policy) +determines that the node should try to establish a connection with a peer. + +The algorithm controlling this state transition can be synthesized as follows: + +1. Wait until there are peers in `Candidate` state +1. Select the best-ranked `peer` in `Candidate` state +1. If `|Candidate + Dialing| < MaxConnected`, returns the selected `peer` +1. Else if `|Candidate + Dialing| < MaxConnected + MaxConnectedUpgrade`, try to + find a connection `slot` to upgrade to give room to the selected `peer` + 1. If a connection `slot` to upgrade is found, set the peer in the slot to + the `Upgrading` sub-state and returns the selected `peer` + +The peer manager selects the [best-ranked](#peer-ranking) peer which is in the +[`Candidate`](#candidate-peer) state and provides it to the router. +As the router is supposed to dial the peer, the peer manager sets the peer to +the [dialing](#dialing-peer) state. + +Dialing a candidate peer may have become possible because the peer manager +has found a [connection slot to upgrade](#slot-upgrades) to given room to the +selected candidate peer. +If this is the case, the peer occupying this connection slot is set to the +[upgrading state](#upgrading-peer), and will be evicted once the +connection to the candidate peer is successfully established. + +### Dialing peer + +A peer that has been returned to the router as the next peer to dial. +The router should be attempting to connect to this peer. + +A peer in `Dialing` state is not considered as a candidate peer. + +### Dialed transition + +This transition is performed when the node establishes an outgoing connection +with a peer. +This means that the peer manager has provided this peer to the router as the +[next peer to dial](#dialnext-transition), and the router has dialed and +successfully established a connection with the peer. +The peer is thus expected to be in the `Dialing` state. + +It may occur, however, that when this transition is invoked the peer is already +in the `Connected` state. +The most likely reason is that the router, while dialing this peer, has also +accepted an incoming connection from the same peer. +In this case, the transition fails, indicating to the router that is should +close the newly established connection. + +It may also occur that the node is already connected to `MaxConnected` peers, +which means that all connection slots are full. +In this case, the peer manager tries to find a connection slot that can be +[upgraded](#slot-upgrades) to give room for the new established connection. +If no suitable connection slot is found, the transitions fails. +This logic considered in this step is synthesized by the following algorithm: + +1. If `|Connected| < MaxConnected`, the transition succeeds + 1. The established connection occupies one of the available connection slots +1. If a connected peer was put in the `Upgrading` sub-state to give room to this peer + 1. Let `slot` be the connection slot occupied by this peer +1. If `|Connected| < MaxConnected + MaxConnectedUpgrade` + 1. Let `slot` be a connection slot that can be upgraded to give room to + the established connection, if any +1. If `slot` is set to a valid connection slot, the transition succeeds + 1. Set the peer occupying `slot` to the `Evict` sub-state + 1. The established connection occupies one of the connection slots reserved for upgrades +1. Else the transition fails and the connection is refused + +Notice that, in order to dial this peer, the peer manager may have put another +lower-ranked peer in the [upgrading sub-state](#upgrading-peer) to give room +to this connection. +In this case, as illustrated above, the slot for the established connection was +*reserved*, and this transition will not fail. + +If the transition succeeds, the peer is set to the +[`Connected`](#connected-peer) state as an _outgoing_ peer. +The peer's `LastConnected` and the dialed address' `LastDialSuccess` times are +set, and dialed address' `DialFailures` counter is reset. + +> If the peer is `Inactive`, it is set as active. +> This action has no effect apart from producing metrics. + +If a connection slot was upgraded to give room for the established connection, the +peer on that slot transitions to the [evict sub-state](#evict-peer). + +#### Errors + +The transition fails if: + +- the node dialed itself +- the peer is already in the `Connected` state +- the node is connected to `MaxConnected` peers, and no slot is suitable for upgrading + +Errors are also returned if: + +- the dialed peer was pruned from the peer store (because it had more than `MaxPeers` stored) +- the updated peer information is invalid +- there is an error when saving the peer state to the peer store + +### DialFailed transition + +This transition informs of a failure when establishing an outgoing connection to +a peer. + +The dialed address's `LastDialFailure` time is set, and its `DialFailures` +counter is increased. +This information is used to compute the [retry delay](#retry-delay) for the +dialed address. + +The peer manager then spawns a routine that after the computed retry delay +notifies the next peer to dial routine about the availability of this peer. +Until then, the peer is the `Frozen Candidate` state. + +#### Retry delay + +The retry delay is the minimum time, from the latest failed dialing attempt, we +should wait until dialing a peer address again. + +The default delay is defined by `MinRetryTime` parameter. +If it is set to zero, we *never* retry dialing a peer address. + +Upon each failed dial attempt, we increase the delay by `MinRetryTime`, plus an +optional random jitter of up to `RetryTimeJitter`. + +The retry delay should not be longer than the `MaxRetryTime` parameter, +or `MaxRetryTimePersistent` parameter in the case of persistent peers. + +#### Errors + +Errors are also returned if: + +- the updated peer information is invalid +- there is an error when saving the peer state to the peer store + +### Accepted transition + +This transition is performed when the node establishes an *incoming* connection +with a peer. +This means that the router has received a connection attempt from this peer and +successfully established a connection with it. + +It may occur, however, that when this transition is invoked the peer is already +in the [`Connected`](#connected-peer) state. +The most likely reason is that the router was simultaneously dialing the same +peer, and has successfully [established a connection](#dialed-transition) with +it. +In this case, the transition fails, indicating to the router that it should +close the accepted connection. + +It may also occur that the node is already connected to `MaxConnected` peers, +which means that all connection slots are full. +In this case, the peer manager tries to find a connection slot that can be +[upgraded](#slot-upgrades) to give room for the accepted connection. +If no suitable connection slot is found, the transitions fails. +This logic considered in this step is synthesized by the following algorithm: + +1. If `|Connected| < MaxConnected`, the transition succeeds + 1. The established connection occupies one of the available connection slots +1. Let `slot` be a connection slot that can be upgraded to give room to the + established connection, if any +1. If `|Connected| < MaxConnected + MaxConnectedUpgrade` and `slot` is set to a + valid connection slot, the transition succeeds + 1. Set the peer occupying `slot` to the `Evict` sub-state + 1. The established connection occupies one of the connection slots reserved for upgrades +1. Else the transition fails and the connection is refused + +If the transition succeeds, the peer is set to the +[`Connected`](#connected-peer) state as an *incoming* peer. + +The accepted peer might not be known by the peer manager. +In this case the peer is registered in the peer store, without any associated +address (as the connection remote address usually _is not_ the peer's listen address). +The peer's `LastConnected` time is set and the `DialFailures` counter is reset +for all addresses associated to the peer. + +> If the peer is `Inactive`, it is set as active. +> This action has not effect apart from producing metrics. + +If a connection slot was upgraded to give room for the accepted connection, the +peer on that slot transitions to the [evict sub-state](#evict-peer). + +#### Errors + +The transition fails if: + +- the node accepted itself +- the peer is already in the `Connected` state +- the node is connected to `MaxConnected` peers, and no slot is suitable for upgrading + +Errors are also returned if: + +- the updated peer information is invalid +- there is an error when saving the peer state to the peer store + +### Connected peer + +A peer to which the node is connected. +A peer in this state is not considered a candidate peer. + +The peer manager distinguishes *incoming* from *outgoing* connections. +Incoming connections are established through the [`Accepted`](#accepted-transition) transition. +Outgoing connections are established through the [`Dialed`](#dialed-transition) transition. + +### Ready transition + +By invoking this transition, the router notifies the peer manager that it is +ready to exchange messages with a peer. + +The router invokes this transition just after successfully performing the +[`Dialed`](#dialed-transition) or [`Accepted`](#accepted-transition) transitions, +providing to the peer manager a list of channels supported by the peer. +This information is broadcast to all reactors in a `PeerUpdate` message that +informs the new state (up) of the peer. + +This transition is not represented in the picture because it does not change +the state of the peer, which should be in the [`Connected`](#connected-peer) state. + +### Disconnected transition + +This transition is performed when the node disconnects from a peer. +It is invoked by the router when an error is returned by the routines used to +exchange messages with the peer. + +The peer is expected to be in the [`Connected`](#connected-peer) state. +If the [`Ready`](#ready-transition) transition has been performed, the peer manager broadcasts a +`PeerUpdate` to all reactors notifying the new status (down) of this peer. + +If the peer is still present in the peer store, its `LastDisconnected` time is +set and the peer manager spawns a routine that after `DisconnectCooldownPeriod` +notifies the next peer to dial routine about the availability of this peer. +Until then, the peer is the `Frozen Candidate` state. + +### Errored transition + +This transition is performed when a reactor interacting with the peer reports +an error to the router. + +The peer is expected to be in the [`Connected`](#connected-peer) state. +If so, the peer transitions to the [`Evict`](#evict-peer) sub-state, which +should lead the router to disconnect from the peer, and the next peer to evict +routine is notified. + +### Upgrading peer + +A [connected peer](#connected-peer) which should be evicted to give room to a +higher-ranked peer the router is dialing to. + +The `Upgrading` sub-state is part of the procedure to [upgrade connection slots](#slot-upgrades). +When a connection with the higher-ranked peer that should take the connection +slot from this peer is [established](#dialed-transition), the +[eviction](#evict-peer) of this peer is scheduled. + +### Evict peer + +A peer whose eviction was scheduled, for either of the following reasons: + +1. to give room to a higher-ranked peer the router is connected to, as part of + the procedure to [upgrade connection slots](#slot-upgrades), +2. or because this peer was reported as [errored](#errored-transition) by a + reactor interacting with this peer. + +This peer is a [connected peer](#connected-peer). +`Evict` is the first sub-state of the procedure that should lead the node to +[disconnect](#disconnected-transition) from a peer. + +### EvictNext transition + +This transition returns a peer to the router to evict. + +The state transition is performed whenever the peer manager has scheduled the +eviction of a peer, i.e., whenever there is a peer on `Evict` sub-state. +The peer to evict must be a peer in the `Connected` state. + +The peer to evict is randomly picked from the possible multiple peers with +eviction scheduled. + +> This transition is invoked when the next to evict routine is notified by +> another routine. +> In some cases, the transition is processed when no peer should be evicted. In +> this case, if the connections slots are not full, or there are enough peers +> in the `Evicting` state so to respect the `MaxConnected` parameter, the +> transition is not taken. +> Otherwise, the peer with the lowest rank is evicted. This should not occur, +> from comments in the code, but this is something to check. + +### Evicting peer + +A peer whose eviction is in progress. +A peer transitions to this sub-state when it is returned to the router by the +[next peer to evict](#evictnext-transition) transition. + +This peer is still a [connected peer](#connected-peer). +`Evicting` is the second and last sub-state of the procedure for +[disconnecting](#disconnected-transition) from a peer. + +[peermanager.go]: https://github.com/tendermint/tendermint/blob/v0.35.x/internal/p2p/peermanager.go diff --git a/spec/p2p/v0.35/pics/p2p-v0.35-peermanager.png b/spec/p2p/v0.35/pics/p2p-v0.35-peermanager.png new file mode 100644 index 0000000000000000000000000000000000000000..a99806220d29a9a4607f693fb7e6c6361268f73a GIT binary patch literal 100073 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%0DmU$ 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𔯣QgB5p*J5rOq_yYBaVVwB_B8<($Gz!x4Ke zm;$jiR1*9-`alb}?m9e$jaNNWtyt$%M_HG&3(X%s>^~eh96TI49A4}}iSJe|?es3D zbt@$??owrO!^hG4vl8iTU!D_FajOHny2r^~Y7mDuQR}WOQZBaJVesXe z`J4jf*iKI|6yIQ3dEInXas4au_N{c2orrez^l$oeX5292Wium4=Qc-y3sO&LY%W;2 z+zmd@g4t!(LR9bjXn7;W?j9j~OjQq~#MfRW8R2ryL8`ZMJM1c9o7s9SRqV<<%)6uk zIn+)Gj)Tfu!_n}~Cl2t-Dk6t3W{QyF9+DCTiADu?3hovt6{r@d7ibmKY@v~oyFR-0p`*%(Jj+s=Lnz4be6i#t+_ib^Eg@luq1}gmqp5i7zH8 zJ|m5#bB8h*;qTp72Q#o22gnB0@6>5?=1|*q@*}bmQe^5JQ?U7};&bYL6Xx=>TXP>% zuwEWh%PCmVa!TZ|0Ox>Fh9UQD^|V%3*9#-Cf_YwvR#Rh_sY@o-j|`nzcxwg8b3blu zpIKtRmYUL%Hnp|+#69x!q!eNDxuv+2CI#<<)OLC$??cCSMP?F$o~QxUR(ff)UC ziAT){YqmNbzQ;h|oA{dbJaN73XSaKth>ZX}t12)#NaKiD!3A7bIu@`PqJ+z0?;| z0s@cN+Q0?TUhmV?0v4AnO`O3h1-HQ}33oetq|=~BltUHv8~D$i{>6$w{;XK;gIeWM zx_#lFKf9FX+Im~A3r5nzo?v>J`O6CfrzMNs7^D@~i7E_?k>9`+@na?eH7RH*a<%(Po96{ER}_73Jj*eH>d5Y~C#!=1E|*`io)`5U2!}MI zks%Vq1j*dVfyBO=QEZwVBeEfUjzo{ZgZ1DC(JZFkhr{B3en7p$=V$~((Q_QAIU(Ss z;Oe;0EZdkbrXgQ+*R>TJ0YIVQA(nhZY)m|A+QtCngK6-(+PqaImpgtw_5$To?yA!i}wKHhxcgak{B+pK5`uu(DaTAGx_g2pz0MvJpx zwg4d5lsVizOf?o(h{qjx7>~!7K~vez=(z?ZVGOmU3DTG&m3#A_->a{JP6Yrj-Y0(I z<Jm;0Hk*hTb7HS*;WSs*FitcyuZ>UW#WxC!}BA$xp2kz zp~!P+;1s+6R{P!ckfgYASQOb|(;W!l<7^bJh;+C^oPvN@+S{^D)wU%JdQMknrAf6= z5|i`m1O8!k!(jhm<-K5PbTl!cvK{amdsR7Kv$TDP2v7cP@9h0zN7qmG{vY0=w+{1+ zAUSx}T;&zVG-dYuvNCVPG5?1}Z%4$0vR*k-JdRn;s8o zJ(HNHvxpYvV|8CA5PcZ0=MKNdk;XmaTn1*4d_`~7du?I@7|p9`SkHUgu%Qg@S-hB( z$Qj2Nyj}n?-P*5lN?NBpfl-dt=d_K=y9;z*J`k;qaK7vElQWyjd8)8ZJQ89V1j~6* z;*>88pKiD;Pff58qrqKetdC89(GzcKkVR9gZ`J@;I4>cmrGO+3@sb#B-sEER6S0>y z>OJC`q$IX&AifsCrVTG79ex4+e>n{r{T4m;)DGC{E~+@{VfKu)=K389}_kY?cwhtN9^c6PjVGoo(tw7nqNeqZ(BVV`o+sdt>8Z8aEz(6vP#J`0l&PU6azd?6`O+Oqg?AwVI$2xlEBf%!bDV~Zn$)k#)3N|6SmpqAX9kQn9?xz$fRkbUW{p$9v@78m%SdFU zacJq^CS_#_}bSFwQ9f?5Pi^ zkPTBD{X%y_6fyg*c~Vk92n5N}l7hJUJIO{2fY}gs`n?AP5o|gEBWc#$fCs^ul==HD z01kp`IPVPPVjM6_1pI;1C4yWmfNQFN)k$-g2u@f=I)7BI9zp`cOt=#AWA#watE(Nj zkMVPWte%Vh61Mu-HvzY$A`pFb&;Wu!{)X7MUg`YH9+Dz0z;d3*ACIE|Z zJBVS=GPJ#AodDQK(><=qL-Y;bm;CMMP~~ch9YEcsl_)@6OB&SE9Z(mg-!ltXAWLq< zMcY&DJ$WY?p7~RKjZQpx%che7+Eilzw>f3KpOfQ0+xu%qqBk(P+_?8(E?=r9Cyvw% z&y%~1NQ3I|{T2eVK3VH@<=PMU{fU>?tB;=W(Iw<0qzvk%2aE*4Wq+c)z^S%7x~(z1 zrp%OO*z;mjS$;R0-Z*W)yN)CMbl+n}i>)In-&35pI)Id#4SSiqul$U|hV7ijUFsc! zDqKSR3Sj2r=4T2F+Oml0OL(}Kdg9;3U z0FV*zoa8;~30_K&NPGXpkNnpu+OCh9*@n8H+~q=#OR>xAU-y{vyzuvjc)LvC$8#wA ztz~_dx$j=F^soDbwa_wYL2=M9qXcnvaIV3npBK;sSq}#e9VzVn=Y-)z1isRN)3O|? zQfq)l#wTZrV!v{zmbyeH+T7b7?Q34mn$r&V`-e*Q2*Zhr+(5}D0LaHDO@t?dmu$uV zrBkIZ%JwmJ0o;w;iAkqM=I6~?^!09ID;uH$>P3d1@>1Y*w5F{6#{W#YmLs?|)?u2w z`elsv*Q&2KAGP(gMN&&p5D@rZ^mhbOX}+VYDEQ^#&$X;ykr-_eJkV|W@2E6-ms;d3 z{vZK%4_^Hza=YmN@P&Rkh^-avEE^Iu92GH};`!n)b8dS)jEce)vU(`vDHS=>M5`%V zF#8`$BN8o`;@lGEd3)YJSwHpb>UO*@1f7hWt#AWsM}CKVSeFXJMrnC<^rGKSQI&=4 z${Lln4>L0p87L0r|6;Vt#kx$#ToyRku)vOGQrQr^^!`6$=jx+2cpOzQ2!Iy(hsd4S z-IpH}pbu7>aM502;P_R~)BG%swzpvCt!CuuTfYD$rl5N3I)ykhdh5$pPo2!4Io*{# zqz~VtpSc$S)u=xiIL*wF8om3Uk%0$SANnlt_LTiuUtDxEx-11zx}}7?yPZK)X|^FXZ4gavBaURs;-}c*RZSc8~reM1f^ex;I3s@{Un$x3!|m zIDUT3)-b~Gi%I+9J#SPf1kJLLm?G-Q$1c zCm*ugyu;2?hV|sbqqORxzjJONwC_K&U6fc#OG`|S@tvII?cw_)3r5a9YJ}y9UE6kE zJfV)#-YNfKjcV**V)s31aoBy$Gg6GrNF{Q}KefGs2VPL0}Oh#IRm((TF2LBj+&G);$)KRJ* z*o^ru*Bsls^=F-9${vkdVc2SYSpL%RkQ`ja~QR!CT~{ryCeoN?_~G40h7xf7yB?jYJH_PwL5gp!=UGYZO#VlW2SP z<=?y}Ca|F7^@4-VRQw;l3Ra|%cxY_D?vq_(1tYKgC00RoyI6Sh%!R51U{!C21Wq$> zq>fK5KK%_l{77`Ia{yd5D^isB9EL|IojpcS8qT0n&g!A`?;1N#$2wiL z=T>fJ4qu}f;r=@kSO(2|l3FVj^Za;$(4B4K27BDdzle3b)dP=(OkAmdA zZ$?ulMeD-6Kl~syXxfV-6~6K>f2uA?d>Iuyr`G~t_s1X)-RtwSxA!hDSAaDDye79a zKl=!BU;d-ZI(eZ( zeFPk@C6xbwPBVfTb#k=?aZhCn0NsL!cLIPl=U<=?kuP_Vu_awoZnX=GA1#CbQIerk zeSY~#M@CuQ9}t`P!PLA*oxw|T|4I`-_;BpWnmU+N_0Oc)X(amB+>?-_?CyB{L@*>4 zvwBGWE0eHyPHiV5!#}W@qH#~c{SyBeN?naUqC}e$rCf5T=XjwAo^9Is47LKJNs2!v zo$>ne8_)4qYf8*S-qL?21&BOMMh-v!u}6Yob83WnHO zsBSjGu+x-~;4w|0@l}pg+|0i-Pb;_zkF%MvfSEb|%q*bf;cKsL#OVs$eFO|wO|-{@ zmw;HA{@5=;cC}4U8=1XB{2>zh_o&O4CWd(H)r(#Q{&oTa`3MHVQdYDKr6tLqo%Xcc zDKE2a1R&V4T|=A#{pJt7m#YD%yMovk;&aU|sQwc3 zW+F;4E<*@H$_kR?HguH;yKxmCdGVuKZ5zULv6;blg_o4TGL{ToyZg6%5iE?VXk_RZ zd_@(uRcHDX6GntTriZ<9$_Q_+^@WO56}BBCsJ}+t6aY@XgFhI%8)>g&|7k2)?gtUF>yPr$l|+IM^)O7Yd-m1Y85Cd`J4`@3px zyT&jBPtfkDEo&>?WoBGmn=dsw-{?0v@lv)sh1 zH6NidpV7=McDSs`V&_g#%k6h#rWmW%q+;j1-I}&|UC%_J{36Zr{Ac0Z-k0AnN=agm zT!+8u?qS!Z&KVW=G;SS9O?+tCuL%?Er&*?833n&V>!9RX$Mcag&^QARSKc3RP1kxf zE$A{)Id=RGqC~$QSuG{G^RjZOgFYnA?x4ZOKtXnN33+b1UULKV zqOik^mqU)ND?{N?q!gT*KBoGyzWpcHr~AvUjO$Ni)9OjvS*~`plz3gMifkhys26AT z?;gCjI9hQ>91pkq1(iF7M){{>^z06M$39rlI>2BUgpNLUb{@3{BH@87i^rN}nRC)X zqgIJCI>of{Rggnn1&l*)xN`+V@#WU#yonnNdV((7!b{e8BI)FI#VSVF^jtfc!iUNm zeP&9M3XoTWJu$&K&DI-UHn-y`*bmUI;i2rfg}yc3*fRCtCFdc?-FRVmnp;Czh54#v z-D0%WzQo!qzG7!gu4L5nNPuWvare*2UbSdu{jOP{XUu1thI0d_x_{#7r6`w8(C|$S zMjlnv{A-8L8pD|wTn=1>HDp~*>~rAIe&Gb8X0Ea*H*EREn$NZY!W*&<6_po$V5aXdZES zB7|&?RDIkZa$7hC%wo*L`+Om}nJaP@axgFSub>)pCE zgv|CI9u1AJYkR^(RUSZAeVF&ht?j~$j#^!3@4Ad}`q)I*&0qtV1)iknxlIiUwbkv3 zW$sl=)pQTfaC2AXmwRQh>gq|Cda1M=^=2ffhm39-#F?*FYt$vFy%|&>qr0DI7j-ME zq()`iZOIca@i(P`A6o3jxxGg@W}NwwV#|)!I(($>kW`N0>Zv?io=kZ-!h^j&GSr4}rbL+T8pb{>tp5Huw3Mt-VuAP}DnS_}c4!D^* z3`b3t&BH}j=GL}O3G@ysKHDAfW9k?Q6O>FkzbwVA>LW0uDmzQfXR9(JYr?~T2V~s! zROk3Ylh1oHH$G50-`_3ZhNTSc)9pJrKmVFz@A;(O+y6$Yv)k9Vv(hVm+_f8BYsl>G z{*jrj0IK`1rHFY=DvwCp+*kJnCt*ocI2gYhuRY$Eee7A5nW2^*6m+imFvAk6bhFCI_Fz?0+ugb1j0J|+C%zPD9 zvQzK|R<+$aMrWMxNWKH+)U$6sdAAKit9OzApbribJLpS>AiMoF!$Zm+Ay{3)+_rv7 zGO@KW?)!|r9`rfg~)Jf7ZyGqUp zM(B=2*&$*-kLBrVbuaRc?Y8stZOV3BGa9~86~WoV!~aVvW?P@8=%LsIoepA-RA+H# zhmmlf%z;F{l_(7_MCIz@Q%p~0UBuULDR3bg4TIz$;kx;$`m?^}9uP#ER1PLNd%nP6 z<8+x%QDwN#?VA(=eK9G#(%w+?S__?#i6(4CZWl^&L01pjzJOpXoEQv;qNg=x1Ez8c z5O*^M52t2LFnup8+Fp1UA3ob&M>-uR@O^XDAFfL!al_kH@QYK8k?5vp8L7Vtm%1Ug zZnl)&w(cTRZe~BPlP+xFR!0kmy}Mhzs4ZvDs7e`hM4({gUg2(W0Sgarc8ig#c|7Dr zRvEGlH{)7nHWrx+i}uEx(y4V3fsFgd4GdYkLQUKs%62rAvsuvF=Q{L0>UZY5@k zkGr~DkXM~I*WfE=i{HH;Q%XA*?kc6Dw-->uoFs6aDfbKKDHk2C)DVLe0Y&6tWs7;% z>?dynAyJ7ZQANcdnmy7=;+xVwrU4tXp~{=}rG+(R?8lVZ6te0Ls}J3xEnHbVawzpI z8;XXAzxSiK%&g=K`Ea-Of9D2i-Qor-`!G?pPB9Csh(yF{J7HECC5ooEEn zmP=s+FA}^iV2YnqZOI!t?Yzy4LBsl)jY7@!Q31e`C(;(k44KYL9Xt96iYd1-(X`yn^ttnd zkKOQASWr)vzUEOhx3w_1BZ5O!!MYjW0B_S+aPDE|HE!;GR$Zx=D=U<`f&&LUr9y83 z=N{ek@x4huWQM%#JLE}~$Kp|Tbl8RyuL;kY?4=bOi5U)8={}q*7M=d&qv&IHnS_ua znK5u$9^90^|2W=O>(DxQsE(cP4!`?B)Hrm=x}tjfxdA%++HvP&=V3`Xob7V8E_r*% z4Fonb%ELbvE_%dXMm9=(-h?XgVz-|Pa&RD)vdQVon3hlN8nkTlZOl*9P<3Z0wT7j)$ayJ+m)kCiR!<6 z`GuFdw=@NgQZ#stB-sInHqArAhXEZl-qX)J3ivO!hAbKBAGM9aw@KLJBam6!Z$GJi zr2WKazUtGm0dJxFVE53?lgi*iep*z@f%k-~eVHw%Ci~l6XUx*>DCYSzEDD`G_{C7I zL!5wMiOZz2J9w$($HD!+kly`wPLVg1!9(d4PqO$j>Gu2c9b2Bm-+S_C2-9!*^nGj? zC>oVJQn=|-#uaQq3&X~|X2CX_Tk#?eH`~lP8M6bq-V8DawP?oA@C}}8z*Lcia7xXy zR>z<|xT>;zooS=Q1oDgwZP@MDrU;6Rb7dKE8lESJ1(z?3Rf$}w%A-s-rZM%K;5$Pi z*Gk9BPuV9lN%OvL38D$$NY%I!jSz}&(KsF4wncr5jt*l|6*!bXjTLrO!<3si&!02` z0w*hjx(CdOMRHutI1ZL)XX18?{ATLn{#%!~KpC>%SoRk+c&KuFws4djtA4;fpcbmq zr!k?W$5MKq!lkw}r^JnZ>+<#L5LR8eR2R}=%~_GGwqcCCn(XSW8^NOsmy>`JSAz4! zdyL5B%$y0!#B_hz;kyv03gH?X_gk6Nm6oH275~TAmj^=GeUD2~iG)Oil&FMc&05)# zH9KPo*|+TL&}v^Q*>|!V`_53=l6_|e6SB=1V;h4p=J!Z%y`T5{d*AaYw`IVrGX*s^>SKq6qs|@7aAL3eA^=- zDVH_4P=oUjw`EBdpDgzlKpBb8paDOIBfa#1BO)z-y|d(E?171m*rhFnaVMZ?$xNssFa<>H>sP<564 zPzxFQf%@*ySd^DVKyt<{R=X)G;oedD3s$u}YRF1_dhBwobd+ZmcY~R`L~RL5o*5x@ zkN)SO)|6#vD-SiNPi|^7lx5&rGVq@tv6cR~XU?+qifwEZWlJ$XZ!F93rh&rQsOmGD z)%CE#`%53=npAB?oFKTVy0B=S0xulCmbuAp(_p2;V*NnHf zeJ5pLa)7ERL=}}lD*~m-b>ptwh`hmVVqPc8uD@G;-6D*quu!U=52{i`g{#hzMpVWkT#?X zUsEyji0^5Vk;B6+Hh9GV{KR>pd8(S<_6#uChGmQ(&Qwe zfJ28XcqT?iwr}gL$2)-C^Qu=bfCAn95=%VYZ(M7$#jTpzy(z9LvVhU=zqE5=J6B@f zC+MtEmiI-cOG|>=*a|WlyWrADVMdRH-FbXIHgWidaR+L*%pOK>)Rr?ESHfe|)H(tZ z8L#y)8rUFIhNX@|fX)WTV++;CHfof8@z3XPwubSnz9Q(UPpZ)kY+Tr!eb4V7;Q$5d z%?!%{259r#wV#vGPhL~ulGt>gvYy){$peBDdm}TU*4SoPL(cevLY@x)gnS?tGTUlg z-IDh zZ2wih%&Co7?1}1nYo4%SPCe$7*UC@`AY7BU;=vvo&j$9m9n4i`U7;R6N2#eY> zG|f;5>l;=pvU+^ESY>hZl=dgv2_=*5P?$NgzO#P+p>rk^OMsz7;B1&(0Po&Lo2^xa zPGh7uH?OBgQ)?*2{Ok$C#1$J)tF{2gJrOG-V$2Q1n3Z| z90sJcQrni81MSUS6{Arq ztEyJ#dcNCgC7q@sE9eY!fk*YiD2yY==C#Sg#!f&)QFi)h*44IW{HF(h*zJ7|>Pu{- zw>?uyVHgkqqtG<$eT4L%AIr1@p@K*Qs1o;W!WyMhhuw<^E7OTPHiNll1_AgG$I#9a z5A=2icO#H4YD=f1qP6ID%U5J#$B(4oZB?Ov)sjM>2H`EQLRH^E(6E2e7QX8(eF12A6+TW)Yyu-JW%83GUJ5`knAm~D{F z-t;eR(hsUzs4o~qathFbt`t3!VyAZP&Z`g8gLywAf1 zz&W{c$vuHCg1(16mBXL97pWGsb%_gV=Tr3?Pxb{=~C%1Vv_?Q51s=NmRA-Y^4 zTA;fdA1bVPKml`}W5rth(eKhze>V8Pja9$gs(%|VM zwfZaAegxIeRD3EDlKOZ?-kK{u;3JwJ1-Xw2{tj*bg0S#sY~c|5qwp+My5evDF<_fB z(6tbNI5O%#AW^0~jK)9yk7YE>7}Na9wCZom1rpTf*wMdpA^u62N0fFT8Zb1dGWvJWlqB(Y1c`}+#O(%uBOv?2B>rm| zQ*rLhzO}a=zoYd>{B)E{0E8TPuLbr2)^_-RE~8v?We>zUsQNo7aoqY(jsU=X*{y3} zpcU8pe=b7@gqu2LV1H67{;|s+82y3ByYPQ5^DLWwfEjSW|BeR#W0&J-TX=vhikbf; zYm^=h^uvGP%g!IJDCH!#Manw*uNc2+EiI+*Ct}|o+Pz0<5dS1BN1z2H*#DCZ>`##W z9~i%79Id{xM^0@c@;e;y559h2HV*hil_Wk+{Tm~l2{HBM&J0*(NB@oj|C5m(Qu^xC zfIkLRCjA>DvGZTDmfJeUI_UUsJN%~gStb2|FCYT`jr0t(EeSxX4dy=qi8G*q=Km)k zlK>#F{{&>MlzyPg>)!#1qiGrcu?d{@CDVVWi9BVP!7&0G^+l?G!`Py=^dS$`sN|KPQ7Mt?`Stw`28O#jA7UBNRN+?gVqZwG$I0sqNK@{}SV8fbM; zIQhRZ>>V?&?$9NR|A3W&re)^`u_!nd(em$fqv5~hNVX*{`BaNh++&32ygTn1Nbiv?Bnj>&+vo{$D$bX*q z+=v|CQzRteceZ*+NJz4jC^6+_I11`xc`dS3B$V`~tk_wtepT#O=q&NtPs*l7M7F`6xi3IO8q=Y4JcQ z#cw=-!Ai`YeE)Z_N0l><4ww>?9R7eXgE5z!c$!Q_uiY=r)l8RDH|H zTH)+@7l2H~m(zAGxT+5*Ff^Eso=Xd*4LtybgG^jdaW1BO}lslBebg$Js z^uJ!`Vm^`Fe_=Y}J)EoNEEeB)n((sHKd+;iYdC6zIeZoy%jVScL*W6z|ICNjFkP-1 zO6(ZH0K~PG8fTl=!K+tPX8&N$NwU{B8qTR}e=CVjiL>T3c4wZsYfGP(9vMYN0)61S zw;&SeLuA*jakmI)WN*LLd{17T_Fm=M#>N;d&~=LI-v>pJ2*p zDy&%r`KKa+_GEhpPGBqFHpiWLpCou7opp-*Ics_qxWeC0i?{&(YSif&H%rk=jm3)Z zgp$jdUWF=3iE; zHVSqdmwahV_flczpjMJH35^!v(2b{;WF`bZGyK|dM>3T+B9o{odz{2gjNhJxJhG0# z`_!j<2I7yo8H+Zv@263ehw)l}5rj*KrjLN#wIR0`o_jc*!F&$JPGir;ei56*9E6G00l@=vD+LI@D{GL;P zeUo?LZG2Gkndmgt)$^9Pj+-P^ZB@z@a$7zb({Yk;y#qo!qAgVna1r~fmdJsZwj<)X zm{9)A5s zrJ$COA>SRJyk;q=NQ6^cygUsRN&j+dDTq;Y!FK;x{BcN9Ud+YfV4Y+7_8HgvM<>iO zb9qL{V0Y3j5@jLU2E3I@Cj7^Ib3c&my696 z9f=@g9Ox0MRgDQHsCWyY`KYhAolRZ;+yzjME;kRNs%&NYcIg@ejJ|xF^p5%WnI2(^>g&{j)er4zq*$UjE0ro|tLD9L3$hRXkZ;N< zE0S0rboS|WdH_zTRuxT@wVh&n)CKIc8ZQrb)*N4Dlf=8moU-nk^YrH%y!%S$N&0&# zbDTzXtgzHbkRNs0%gm@<4IBN2(4`6o?-$#p13r>YFFdk`%8x(l`gV)nlDM`P*j`>B z=eE1sWyp#|dGhiMd8J#34O`#dGOkJmO1aX9LS}|n7}7wd*2%NR zg;t}pEd-dm{7|2sSZioq>JrYSbEoehzd+{dJv$#Q?ffXO1o(3O#I516<&)1}0@3Cv zVA1YVSZrI=sd}d}A@hOuJGs|qt;StQmMnp7U;xLRRl7)m?Fb!+dPjx^LaF7D&;7BM zkTF74QYD2yOH-DGSm&JjQioETU*o#x$Q2*rVELUk_6NSPv67>D3%(EOtuGDv97-Qm zuE4IAPy9GZKn1)VRUS?TmUnq)m@_^LGB!EiCRVue?AAr{w99wfHqX;#ZnWCXT*-S~ zeaUWW(NE57NZn*inZ{^(&{)2MJ9ezOX}!jS$V!2}P#k};`VvWf!su2{+-o1=+6|M( znd3aWec2WOv|SA{aRbFaofovjj+UOw)hppI-g&X9E%!D9 zSAYe|*GN)SDFpyHb%PQ}yI=f*)2#5toLpt~!}AR&h}MaoV=9xOi#%y0?Yr)I9p~ko z0e&YPw{fR|8rkSyb=2!KTkT`&l#Z??o|yr-1!k5;p|^Y$9e zEOERwD2WbU?$C^2Z==o=i)vFhWJ2XgVVQ*f{K`3monN`1-xC?7J7Jjg)8J^Qg?$m#Z-wb+|Re`fv}#JEEtvz+$?+cT=vi7EsA~ z_$8>Vvp70liB*0hER1ifd!NRD1R-QHsk}m7G zxlHOCX`hsIW%|oM_v#Q5ZZ`yMUfEl3cX80?1tRzc7(%>9nGUfSJ3rN-U3vkWW|k}? z115B<^R1j=wY`ONbqc4h!0YK(1&@mAG)f`n4LcMW(tu*epP(<8e)lS5Q#=-!aYWuq zPN}x46zv^H8YGBOaF;t&gQZLN(s9Vtt|Lzy%1gQpCDz@hXkB^D2P)sV^y7+wRX)#Z zuHuBJ3>c8^{bI|oW+s%S;Owz<25Tckk&<(lq%YEO`s=Qe<|CCwZI8Tu4l&vb`c5WWx()G=`)XDay6xm^!q!e$gr zw^K#;9&71p>fIdf3nWChyAVj$dgc8-(*TN#x$2FtL0;5xUEx@I&_LmZ0j8wTDVTfP zNoZX5dk`mvqN0RHq86@bS?}$Xx?CGaBm2p+>MQBYgsWu zPvT|3XB-n$c{AVmGm5fzPn&7wjcMCM>e7GSKit6;+qJts@kYZjBh;aYv&X~6NYRl+ zJmd3T1W1%jU~f(i;)1H;b5Mu^*K-Ws5sbc(U*|{9aLs5 z4_-D8_+$~gw04+v#+b;}AAQ&-dD5{5YDcg>QwLx@>%K&DFJx3@_?tCqd7G+ADB~XJ zPNjVvaKM=Z_x8qiL&;IE_sRyO&tgN8J=BI>soqrUFs#F{YH==)Utp9^RhX0wwpmDL3ey4dnDPXbvy2PCuQbTAE{L*$k*C(OC89dw|2-03lM? z*T3EtbS>&MwrOtU_!XB*(6&@YlaK+}rYvb2X}Z*;Oqgeok!-4!4c-HId8+cl^m2LHe0b*B&gKZkQn}Ms zV88U6KUYT-Ltk&DZW->)=vtvi!IkuEz{Nd=(cg9s(ys8_)S3WPu7_1ye$C))fKh46 zRdQyL^mG5Tiz?F?EyukI3%N-skJDADE`Ctwd+(mfrT~%)HD{{IK0)F`_S34`rfX4V zb_#>$kt~n^_L)Ukl_L z*DF-IM;Z>);{)pDA^WW@CAXVJhY;J`J6gW{ndG>cmt_Es5Bt!dTNCE@@7@qx7X5(MlCzK>l zJhA@Y!IJjLlAr(2VA1aOi4vbvpZfo1jlvWtt>B^!PyoKaS)=LT)-_#bE5rgjiA=QG zFt5!m8QE6v#cQ1#5x^~mBwf38O^w;=uz8G(W?GT+Tzdp_O>Yy+%#;XVzIT)HH%_*X zTSc1#SXi6wWC~qzoUC=88}+U^1H}WD{9z%6kV81MMTTTSnebq)PhVyhm_fub#l4}m z!3mfm{*0Mdb3_?~*Qrly!)I(9-lawc2eZs{KixgN?2`0Tn2mR|j{_B!z}WhT{Z_L> z?N0)^9GK-0PIwsv{JvLn|K~_nv)Zri@jtHZ{c?erf^!pAH8q_ksL!N&d#q?PEbluhaZ|eUz>xN4Uv&=I84Xf4%Ne zv5q|fl*R+58qfp)m;l@QEIy*dWc?g4+mihCOyH4$8s*~n&ffih3`>eAAuj%XwphmY zYiU*M?ljZ@Xn)OD)w*WD3}V~-IiJqae1M;%vJCs^Xg;911h8z?kGLAKX_-S5Kp8(# z;Njo@+CBDOqx6zLN&0ITP0I(MsDBQ5rgK*U zI6WlwzyE(zxOjU0C(J!Z6o_Q3u6D*69)S}06BPH>(vpb6ARoZ71Ke1ScIav#or58v z^5?=LKqWq~u$WoxX#0o_&?*RU3sC~s9Tu&MG!ns9N`lO{ zF@3c+Ila9WbjZu({1TRP3*1LgyRK-T)fwq;}(G@jFCX`%lhW=qumAWm9O^{ z)fU`__T=`9fyY2a?5l_jZm*y4it|reA8$f9ZZ!Z;fErytplWY!G2s22NXZ44V+z#U=vQ!Zr2$ZTnnC_{|=2^ZsQ#%U|LtU5F{s_ z@uLS`qr6Xf5=d#&|4A@oj=&M7S47*UL*Rj;)=fyT@z@cBAv3v6hoo7!M;R4IvBdEH zjMu}GO}+k(=fMyyz>Nwq_jAerk@TLKqsFP$#KmVL{>OUfCLl^Zmp^t!m!vv1b&dgY z_26K4A!+NoUo@vQM@J+J9`SY&bxU&v5jMU)$915BOA~c&V&3v{+21)Gms_j!eo;78 zt*>x#40YW&+BnU4Q6uA^{@9aK?coGu#6wIIZa?F8GfCCD^|x~7 zW1rHMA0lDhL+|0&n&0mGZ-fJlvW%iRNvRJzCn558z@{(q&qy7Fw#DthU7YmRf41mK z84~u#$pFbyngX8V-hEunr9}29e?o%-)N4nvIkY3$-?0a1gUOK!G$T5`KR2ajxhobQ zx`{`whjxr^F70kL`uIc7LRq1_fP+L8Y7BM!*>#BxTGIZvrb{IKQBQY+epTRpV4QXW zaxv6b#mlK#e}&qX%r7V(n7F`y#J%r`V3t1E04QYJwYI6r;MZxc#8WW|wrh5Hl>h=S znd2}`n1d)bm*Gx6R$>@pBy_CM5zNt5=BQC(f|0=}V3aUw7)^{W281z5dnH8;=H2sS zN{g1_1HMwTPvR4E%j#FrZ!B%gXC2vqNtwMDE3Xue3NK0ap36M|>n<2YOEZc%PRh-7 zsCnJm#k2uQmM2FItYDIdX=c=ZyXhF>W^Ec#_+UE`R57`1h4o%?9azljQ%sAK5&`?~ zUDA93E|VH-Uo7m?PZPOU6FpD*tCU*9EZ$UZ>n7_U^;0&9UxD6!^ILI~V&30@DtG^s z&_)GL<@lYF>^Sfg7)VtvOlSzOAu2?P?iP8?xO-aezUV3Jdz`koiua%62eNyUvEC@x zvBeTh#yWV(_t+9=`F7+lN{0htk@)y#Ix*qWqAB6t_UB){&q$2AGdp|Uo2Ze&z0Er! ze0>fXW3OFkv>u-&j@kW`(UH2n;@#YQt?Rgb^WG$O7v-x5G$^z}`VQc-Fp3D>Io~1N z$^QJOXr`n6v%AP&beR8@G{a7K@V8}J%R5@IC&)>vy7rEf7+2FeeGEw4$ ziHjnWaaGgRFNQ6v8Z{yo^Z60JcldjEy6fZHS2Yn?O?_3<^#?|K{#Z#A-q8=}Z+C2g zUf=guzc~YWN(CU(KPG7F%*4s4UlDY-bDGg0PHHxB$4TG}sd>-#I8A-;T|P-%>f9`D zx@*@r?u+z2fPD^<&c+xanqeV3P0)`gqx2MZ7>j2oPAc|1)p5xpC6|3b4_< zOaRQyvA!*jJkk4gB@$i>a$}Zg2E1C;DPIxr(hSOWv2%T1cPyFK{1FI`IKb9SE&5dm(=ggnWq5`;(D?1WC<5)AVD; zL24tULG7T&g3pUt?oz(3G~AxpnP97Ct7~f#;X&R{Q7-(~Ie*QV1AMaMH1#sqA26-2 zDqX`d15v9fxfws8Tiat%^DgZM4ZQ97VS$lVCN%XE$4=PAUq^-3YzG2FGkqUQzXPxR z6=V$4zrDN8Z{BVw3=}J=Ic}svFrxFx+^N{=;Bj8HySUIrVO6v$S`Dp^E*s!ImdI`g z`b9YlGsYypa;{dRyGX5 zu8;=QcV)q{VOCiwq~WiNRDN}EhzT*BKP=VKXB~9*&y+MIzwN@QD_o$LRD-fhxRjm&p!{nAezNRI?up)4i!2Z|+y2Wcj3^_TxZ(7NAw{E%~g=)lolaG-qU zLlsM_zxHk^)& z4&6p}?~y`d=#LaDlkGU77ye%Bf)?wIG~gQJ>VCC3-Scac)2|*8#lfbp4iC_0*1^6% z2MFAv3bU>5TFgbb6QIPeF!C$CDc^GY{QP~&w0*eLB!KP|m|uD)iQ7!{Yv>YI@?+W` zOng$`ytlelxpoDY>OE6M+z@^d3|a3ED+bGZ=lI$EU~vM(txGnei~^S3P?S^S1kc#yuHGo?xw5L8eZu2UD?l-x-=x(ZF5N80F#J+}iHtxO z5WSn3K(ent*PluBtAVWZ$vHfm&oH8q<+7Qt_Vf+nhoIE>exaub?q4!akl(KWNSUh6 z3fdC?t$ptIWmKF9a2@<{gF4M;I!4Wx`CjY5dgW&Ee$a;c?)X=wCEjw(`M*|w5m)WQ zUKjsA6R7claW~F|Pb_vv8_?y)QT=Ys0xsq}abD|NBV(SysED+*XdO{Od{b}lBVtlQ!g+K?+SH)Htg8a??L%1fQ2eFB!tin(C@Xd`;x{G3w zD|neB4J)rq3G`+7a9Hkq0{Mr5jCx2r3x&sjNY?CnMg*rU2V(r9JkU)A@0$DTo+4O| zKo>SM8!rMVzkQebh1eg;kKN(-9uON6uE*~A65oNxg2xkXnvCfa(KR;$n7t`e6t|~- zN&l;yfziNG_Lw(@$)v0P;s2^j4M20+Dd#CkH7kU`6_4s~@G(efc`poH#3k%TIe`m2 zLOddvk&}z4e>0PB^IW{jpZ8-{s`|f#O?uArP+KARuXqG~Gnp^jn4r5P_Hsr1FT`aj zG2Dj@m?mYO2>%WEvYFSX>Da_E1xZ8{g71n)+@djfv*Mf8d=-~iw`)1(%+ZcB(-8Zn z^*?n!{s{Ief8SGYah2mmZ4k%n@1NPf&N!Z&oZ$^pdPW-bqx2QEr}X4m#b-gUWFlMU zpDDh*{O({6Azrnm(^K@($}`6*&C0)zWqEZuVHsIdJzb2n<#PsIe~}6lxjKMij@tXKpI*xDWOSUrojw`>(Qa&= z$v9z9QiWDYzuWslq1F0k@yfkd!jQRw&u!!O<8y z8oq%Z99o@}@Xjd%dQq_B?%FS4&YdZsprDXySQ$OpRMT~yX0xTsk+4V|>e|*|bnKqa zvu~$yKrn)3=>616^|6bYI_4O-mTb61!!JE$4^KhpPQvMrxrwPxTs9M=*Y!xxZd2Nq z{BRFd^$~jdWBYG#-wshe+3~}xe|Izj4Idg9Diacw|M`h##RzU+Jn6X_L8`jz98E(YlmSHyK^|)`d#>7YgYFm4o#bT!A*-3}staL9P{zNp2^qYW9Q@ozN z9_&(Eub%d%wqiLbo;ATfHxhAk-@>)wG!bEbV;g8kr)c)%JImH%2Q4}G?Z=DDM}4M& zOshq7DXMAuu0Ke=%(i)~_VWUq3{$tgs*vJ7zTUJp?KwSHLhRE|wb5?6X;o#1c5g?m zf+x9oS65ji3CTGYT`Kxh%u+tdxXA|KL(raqhZ~l-wy(EM%NIzygz)QtCEZ7fo|HmB z=Q9?&J4Y<}pu7H7(ng=Z6(GOk5W<_+tWqTAGVNYrbB&%^43+Db`2Wxz8}`u@8SkEG zDvXzKx)a!3(bS}{(=>;AlWgg925qLN@4Z{&v1@AUREtq``nvX5mB3itn0cjk$FiA$ z8M?IB(D*_o&|7zUyR?FLDAhTmxawMCNOYX%sHrPqb6b4mq>9k->*+DFLB#3qbtug9 z48p}1e@b+IU|?Ins9Do9yWFX{?Nxjgg6||X^F{kjoE_%bsA-4K1cbO17{P=}3BWq^ z)+-loXx~L`uDEL`miN9fz1rc$=YKobX19l03PpeZf{!@H{q1II?``k1x$R2Hsn$~A z`11fGGWWjd^K4P9q?I&sx9@>lL016g8P}kNq<#pT21A|c;ygxK+_pMDCJ> zeI*Zf#IJ8meZ{FFyqjj)DHYu;$8C0R6b4wwvDF*9j@>FLYLpPIIZ1hGCBF4Tv?)FP)1lZ+27jkECbpdgxBF5CCj+_o?ATXv?~ zyRe6hS}Q};My98%yU@_gOf$@AP@3ncd*z<$%w@YTN<|5WcpD)!dF4yH}Rptw-s;y)M1Gu-GfC(Sp)30Na+P%t}vr80o)Xnsgf@P~+vX z_bXr-VOh<5Hx3p)x-?;w5d?5tDQ<{7d1J|1g%9bHgh*Qj9ZkC-5@ zFfZm9VDi>Ce!LuUNnl!^3*)tAVqD`m)u=sYjL;t&K#Gfm-I=)-yPm@GD4k)i*ujb1 z0ni(}yozpcl{neLlaHVp$ag-=EtnLXB9-ZY?})iYNtb8zqHfZ<2rqVO+A|jC+wze| zwE{=xkXu^1wpww3sow>-+Lc-Y$wAZ_Qb&K&Sq!QrP7uAO8sbjCgD})*3dLlwYi%Oa z%z}4Tusplp&p4gL*!3-4?paPx-9oK;->Us&Ric*Nr0Xla_+oLIV%l|tMPSHZ6%=g^ zcJ!4p$vOtO47cr8={Q0h8?21{2wwm-W=3cVM`LeN7$O$VjZzqmdb@FR_^Y@Et|%3`gC)n z96|N_Y}CR%s3G7a>^`qt&C|3LMTK`2l|Fj=u%=2`06-*DNo`-6dF45sQ8c8-VRCHA9I&XIayr3CZ$@?<1C{u z=amnuX95D^Bz-;S@<4x-)(a0@bO{+A=*2G3*uWYv0`K*aoH7G2-4~-Ii*>OkjfPUUJ*`^rdH9ZG;}UgyUAkO>$K-sYT1n9z(}I zD~RI-3I+#-v*HZD>BnJ!gRHYIV(<;;hrsxu10RBtEirU3RYk=pPc63b`JkQ=sPVxJ z1@gA9(M_PQga+oNouj8uX3SFlfN7v2lkYZij$i@XvcyGqhB?-X>orevg2=F$%k*~& z{KYqk#jaA#ImJ?p4{|}O!c!i(IUkL;uk)PYq|zvdR_%TfRWxA*M#l`PWMy~I0z^tyTxwS&0vZU zlUox9m?_(ism5qa!%O=~9QE$n)E~C4gGG+1c!j0P27%!?K?FUT5cHFO>}YvBr#C-6 z0aeX?=^C1%gUoz~;`*O8=J+dlI)Bg8 zBraTfRlgVb9q4-3#~d?Uh-UJS;zVgQj8~?p9l)>kj54FoR6nxS1UJDtmZePar^cXr z%$c37TO#tr>S*hjS4hh#T#@-xOrO_^%_14b35DoWPS|JJLkzxN_1>m!=1k=3_uRX1 z0{-dB+@&2q5nEblS5wdljCOYBWdZ!)Q-enmD%2|;0n_5OaqUIAS39}~b4f%nBeD|6 z0d2mh1ITl&@=FKZg_vaeqNMV@;me&u_z#wYVfa-4ESr>7MJ+O?oA>K_ zfuWc?U}|l_J>2W;IJ^3jgQ}T5KOP`=OQY1r{g20+um}#t+xHb*t*;dTLn#v-bDVM| z#9-ST1IW(dYK^O=-5Xkpl`s#398q1;9Ir|LIB=rbr>z}wnW7-Tja>t!)d7dr z=MZYY+_WP{jbs(zmZYA!N@(=xLH5*8S|?GiTLd@$p_*bL+#mR`&ed^%D9_0)`xt`^JP9 zM6H*q4j>6IEaut78$?!hO>7j%w!EUb)HcaZoM2QA|IT7#26?Ucq51Sd;Vw!WQE)=` zr<4>887=+bo9Y9VLvt$wSde8HTaz{Wq~#K@FP}gaGpmg6=eoldb_AHYQD;gT1oAFr z7c(Wc8bAf{Y|dsw^_wMo3PVi|Pk=Z4F(f9%qV@p*2Px%{RlaHAW$iDoAl647D-w!`Uuy zY=1z@W6tbx$}(a4`@q`sF8I=`PF!^k1)dH@{ckz;xGC!E+N(* zPO8OX6=k3WwRo@UU=^FhVPO08$e!}2zgKHf($$b1wBH%gBnPn4_gsv&#+_-v z<{Qvaz%H+j)~l)k+nTWEt3|$G7MLQ7sSU~@v0hO>!>5+5*owvszvIjiy4JmI7we=# zdgtY#xw9=b`$$IT3r0k-@}}?<(F%hA4wuS9Y`2zx;WcfwV8Is`Q}aG?3~0!_S-~kw z6GNY*Fy-aHCl&gpbulhBMrdj=17k_Mt<~2lBw*k5jMgD==wo6Gd~`)dcWcFc*M6gR zIbcvSk;3)U9Bl|$inoPmdo#V%jTi_KQja8C+nikN{L4_+Ja zS&50|PN>FR?RoYLYoBD1cwete152)mwXE7Ata)lvUqV3O4~Wn2Vo!J!Rrnzu@_XAT zz*0F3+yj9P6}X-IC{tze6|dg}{_)G4Fn45vU{`lP@|lzCxP`6(&r%UTL#Lph9z02v z8KlXDBu!oZaf)leNALrIHF^h0de5sazfeQc$~Z-8p(Zdo0Q=2WUo?c;j+f~*oyN5e zgB%|T?T&DyRFy+ZROq8P*`zatCs|xWE7)vcB{SPqHbZtCQBbI0%6$)72VSXG4)p$c_{^bVN|sH+2Z9Dyp+d)UpN>!02r9Z21cq7q3PO(~2dc)D zs2J|R<5}mQ(Gu3WFn2NhEhL_>O%kh=0WGl{8oQeyD(A|YnEI1#loga*133yeM&2@l zjGRZR6SLvQaeX?RFWX-n7<6wk5t&{4H7O_-vg?;#H{%0DCg&3B6|iy8CZ2+K*|
    X0vp4QJwxc)H9ZOh3>U9g#dL^4bR%4krM${=79 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 literal 0 HcmV?d00001 diff --git a/spec/p2p/v0.35/router.md b/spec/p2p/v0.35/router.md new file mode 100644 index 000000000..9dbb0aa1c --- /dev/null +++ b/spec/p2p/v0.35/router.md @@ -0,0 +1,128 @@ +# Router - WIP + +The router is the component of the *new* p2p layer +responsible for establishing connection with peers, +and for routing messages from reactors to peers and vice-versa. + +## Dialing peers + +The router maintains a persistent routine `dialPeers()` consuming +[candidate peers to dial](./peer_manager.md#dialnext-transition) +produced by the peer manager. + +The consumed candidate peers (addresses) are provided for dialing routines, +retrieved from a pool with `numConcurrentDials()` threads. +The default number of threads in the pool is set to 32 times the number of +available CPUs. + +> The 32 factor was introduced in [#8827](https://github.com/tendermint/tendermint/pull/8827), +> with the goal of speeding up the establishment of outbound connections. + +The router thus dials a peer whenever there are: (i) a candidate peer to be +consumed and (ii) a dialing routine is available in the pool. +Given the size of the thread pool, the router is in practice is expected to +dial in parallel all candidate peers produced by the peer manager. + +> There was a random-interval sleep between starting subsequent dialing +> routines. This behavior was removed by [#8839](https://github.com/tendermint/tendermint/pull/8839). + +The dialing routine selected to dial to a peer runs by the `connectPeer()` +method, which: + +1. Calls `dialPeer()` to establish a connection with the remote peer + 1. In case of errors, invokes the `DialFailed` transition of the peer manager +1. Calls `handshakePeer()` with the established connection and the expected remote node ID + 1. In case of errors, invokes the `DialFailed` transition of the peer manager +1. Reports the established outbound connection through the `Dialed` transition of the peer manager + 1. In the transition fails, the established connection was refused +1. Spawns a `routePeer()` routine for the peer + +> Step 3. above acquires a mutex, preventing concurrent calls from different threads. +> The reason is not clear, as all peer manager transitions are also protected by a mutex. +> +> Step 3i. above also notifies the peer manager's next peer to dial routine. +> This should trigger the peer manager to produce another candidate peer. +> TODO: check when this was introduced, as it breaks modularity. + +In case of any of the above errors, the connection with the remote peer is +**closed** and the dialing routines returns. + +## Accepting peers + +The router maintains a persistent routine `acceptPeers()` consuming connections +accepted by each of the configured transports. + +Each accepted connection is handled by a different `openConnection()` routine, +spawned for this purpose, that operate as follows. +There is no limit for the number of concurrent routines accepting peer's connections. + +1. Calls `filterPeersIP()` with the peer address + 1. If the peer IP is rejected, the method returns +1. Calls `handshakePeer()` with the accepted connection to retrieve the remote node ID + 1. If the handshake fails, the method returns +1. Calls `filterPeersID()` with the peer ID (learned from the handshake) + 1. If the peer ID is rejected, the method returns +1. Reports the established incoming connection through the `Accepted` transition of the peer manager + 1. In the transition fails, the accepted connection was refused and the method returns +1. Switches to the `routePeer()` routine for the accepted peer + +> Step 4. above acquires a mutex, preventing concurrent calls from different threads. +> The reason is not clear, as all peer manager transitions are also protected by a mutex. + +In case of any of the above errors, the connection with the remote peer is +**closed**. + +> TODO: Step 2. above has a limitation, commented in the source code, referring +> to absence of an ack/nack in the handshake, which may case further +> connections to be rejected. + +> TODO: there is a `connTracker` in the router that rate limits addresses that +> try to establish connections to often. This procedure should be documented. + +## Evicting peers + +The router maintains a persistent routine `evictPeers()` consuming +[peers to evict](./peer_manager.md#evictnext-transition) +produced by the peer manager. + +The eviction of a peer is performed by closing the send queue associated to the peer. +This queue maintains outbound messages destined to the peer, consumed by the +peer's send routine. +When the peer's send queue is closed, the peer's send routine is interrupted +with no errors. + +When the [routing messages](#routing-messages) routine notices that the peer's +send routine was interrupted, it forces the interruption of peer's receive routine. +When both send and receive routines are interrupted, the router considers the +peer as disconnected, and its eviction has been done. + +## Routing messages + +When the router successfully establishes a connection with a peer, because it +dialed the peer or accepted a connection from the peer, it starts routing +messages from and to the peer. + +This role is implemented by the `routePeer()` routine. +Initially, the router notifies the peer manager that the peer is +[`Ready`](./peer_manager.md#ready-transition). +This notification includes the list of channels IDs supported by the peer, +information obtained during the handshake process. + +Then, the peer's send and receive routines are spawned. +The send routine receives the peer ID, the established connection, and a new +send queue associated with the peer. +The peer's send queue is fed with messages produced by reactors and destined to +the peer, which are sent to the peer through the established connection. +The receive routine receives the peer ID and the established connection. +Messages received through the established connections are forwarded to the +appropriate reactors, using message queues associated to each channel ID. + +From this point, the routing routine will monitor the peer's send and receive routines. +When one of them returns, due to errors or because it was interrupted, the +router forces the interruption of the other. +To force the interruption of the send routine, the router closes the peer's +send queue. To force the interruption of the receive routine, the router closes +the connection established with the peer. + +Finally, when both peer's send and receive routine return, the router notifies +the peer manager that the peer is [`Disconnected`](./peer_manager.md#disconnected-transition).