| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
C Tor calls this a "period", but "interval" is more accurate.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
As David mentioned in a review comment, we don't want to refetch the
descriptor unless *all* introduction attempts have failed. See
https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3925#note_3402810
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
If the client doesn't have a timely cached descriptor, then ignore
the requery period and reach out to all the HsDirs of the service.
This can, in theory, cause the client to unnecessarily query the HsDirs
when its cached descriptor has expired, but this would be a very rare
event, because the descriptor is long lived.
I'm carving out this exception to the usual rate-limiting behavior,
because I suspect having the client more eagerly reattempt the
connection will be better for UX, (by the time the client's descriptor
expires, the service, assuming it's still online, is expected to have
published a new one, so IMO it makes sense to try to fetch it).
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Because we now refetch HsDirs on introduce NACK, we need some type of
rate-limiting to prevent clients from hammering the HsDirs if the
service is offline.
This rate-limiting is per-HsDir: the client will avoid querying the
same HsDir more frequently than `hs_dir_requery_period`. The HsDir
requery info is stored in the new `DataHsDirs` map.
Part of #966
|
| | |
|
| |
|
|
| |
This is no longer an `&OwnedChanTarget`, so I'm renaming it accordingly.
|
| |
|
|
|
|
|
| |
The new `RelayIdFor` type alias I'm about to add will need to call
`RelayIdFor::{for_lookup, for_store}` with a type that isn't
`&OwnedChanTarget`, so I will need these functions to take a generic
`HasRelayIds`.
|
| |
|
|
|
|
|
|
| |
This refactors `RelayIdForExperience` into a more generic `RelayIdFor`
type.
`RelayIdFor` will serve the basis for another key type that will be used
for storing `HsDir` information.
|
| | |
|
| | |
|
| |
|
|
|
|
| |
I find having too many of these nested `else { None }` branches makes
the overall logic harder to follow, so I changed this to use `Option<>`
combinators instead.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
This avoids us replacing our cached hsdesc with one that has a lower
revision counter.
This was not a problem before, because we'd only ever fetch a new
descriptor when our cahced one expired, but now that we refetch the
descriptor on introduction NACK, we need to make sure the new descriptor
is actually more recent than the one we have.
The implementation is a bit convoluted because I had to avoid retaining
a reference to the known-timely cached `desc` so as not to anger borrowck.
|
| |
|
|
| |
This will soon need to be called from two places, unfortunately.
|
| | |
|
| |
|
|
|
| |
As suggested in
https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3925?commit_id=22ae30205a5f18fee43f424f8c0f9768b95a2ae6#note_3402779
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Prior to this change, arti clients would retain their cached HS
descriptors until expiry. This is causing us some problems in
[arti#2458], where arti frequently fails to connect to C Tor services
in a chutney test net. One of the problems in #2458 is that all
introduction points are NACK-ing the client's introduction requests,
ultimately causing the connection attempt to fail:
```
2026-04-23T16:25:23Z DEBUG tor_hsclient::state: HS connection failure for ijalr3vpf67zradtlaxze6pex5ypadu5qfsltn42cmhioqory6363tad.onion error=error: Unable to connect to hidden service using any Rendezvous Point / Introduction Point: Tried to make circuit to hidden service 6 times, but all attempts failed
Attempt 1: Introduction point #3 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
Attempt 2: Introduction point #2 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
Attempt 3: Introduction point #1 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
Attempt 4: Introduction point #3 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
Attempt 5: Introduction point #2 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
Attempt 6: Introduction point #1 reported error in its INTRODUCE_ACK: NOT_RECOGNIZED
```
I think this is happening because the C Tor service has rotated intro
points and republished its descriptor, before the descriptor's planned
expiry. I believe is something that can (and does) happen, and so arti
should be able to handle it gracefully.
I added some more logs to arti and reran the test, and noticed the
descriptor's lifetime works out to be just over 2 days (54h), which
seems excessive (especially in our test net, where the voting interval
is 20s and the hsdir interval is 8min). In any case, holding on to a
service's descriptor for too long, and not refetching a new one, will
cause the client's introduction requests to be rejected (because the
service might switch intro points).
I think there are at least 2 things we need to do to improve arti's
handling of HS connections:
* In the case of an introduce NACK (with status = `NOT_RECOGNIZED`),
the client should refetch the descriptor and then retry the
introduction. This behavior is not codified in the spec yet (see
torspec#245), but I am told this is what C Tor does
* Rethink the cached descriptor expiry calculation
This commit addresses the first point. The second one seems trickier, so
I have not looked into it yet.
Part of #966
[arti#913]: https://gitlab.torproject.org/tpo/core/arti/-/work_items/913#note_2914448
[arti#2458]: https://gitlab.torproject.org/tpo/core/arti/-/work_items/2458#note_3400768
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
This will soon be used to force a refetch in the case of an
`INTRODUCE_NACK`.
(This commit is intentionally left misindented to make reviewing a bit
easier. A future commit will rustfmt the file).
|
| |
|
|
|
|
|
| |
Gabi correctly points out that since the client uses guarded
circuits for introduction points, whereas the service uses naive
circuits, we shouldn't expect the peer's circuits to be any longer
than ours.
|
| |
|
|
|
|
|
|
|
| |
Both C tor and Arti will retry building a circuit if the first
attempt fails. This means that it can be worthwhile waiting longer
than we might otherwise for the HS to build its rendezvous circuit.
We don't need to make this change for _our_ circuits, since
the CircMgr code takes care of those timeouts for us.
|
| | |
|
| |
|
|
|
|
|
|
| |
We don't actually need to use this method on any circuits that have
a virtual hop, so instead of "fixing" this method to ignore virtual
hops, the simpler approach is to change its name and its documented
behavior, and to explain how the documented behavior is appropriate
for our needs.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
This time we _do_ need to use the BuildCircuit estimator, since we
have to consider the peer's circuit building.
The peer may be using full vanguards, so we need to use 5 as their
maximum hop estimate.
Additionally, their circuit may be longer than ours, so we ought to
possibly wait a bit longer for them to get our INTRODUCE2.
There are XXXXs here about OneWay timeout estimators, for immediate
followup.
|
| |
|
|
|
|
| |
The circmgr handles timeouts on its own, so we can let it do that.
Use the actual circuit length for calculating round-trip timeouts.
|
| |
|
|
|
|
|
|
| |
The circmgr code handles circuit timeouts, so we don't need to
include that redundantly.
Also, we look at the circuit to find out its number of hops,
so that we estimate the timeout more accurately.
|
| |
|
|
|
|
|
|
|
| |
The hspool operations already include their own timeouts, so we
don't need to recalculate them.
For the directory related operations, we now calculate the timeouts
based on actual circuit lengths, and use those timeouts on the
operations themselves.
|
| |
|
|
| |
We'll use these for timeout estimations.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
cargo set-version -p arti-client 0.42.0
cargo set-version -p arti-config 0.42.0
cargo set-version -p arti-relay 0.42.0
cargo set-version -p arti-rpc-client-core 0.42.0
cargo set-version -p arti-rpcserver 0.42.0
cargo set-version -p arti-testing 0.42.0
cargo set-version -p arti-ureq 0.42.0
cargo set-version -p tor-async-utils 0.42.0
cargo set-version -p tor-basic-utils 0.42.0
cargo set-version -p tor-bytes 0.42.0
cargo set-version -p tor-cell 0.42.0
cargo set-version -p tor-cert 0.42.0
cargo set-version -p tor-cert-x509 0.42.0
cargo set-version -p tor-chanmgr 0.42.0
cargo set-version -p tor-checkable 0.42.0
cargo set-version -p tor-circmgr 0.42.0
cargo set-version -p tor-config 0.42.0
cargo set-version -p tor-config-path 0.42.0
cargo set-version -p tor-consdiff 0.42.0
cargo set-version -p tor-dirclient 0.42.0
cargo set-version -p tor-dircommon 0.42.0
cargo set-version -p tor-dirmgr 0.42.0
cargo set-version -p tor-dirserver 0.42.0
cargo set-version -p tor-error 0.42.0
cargo set-version -p tor-events 0.42.0
cargo set-version -p tor-general-addr 0.42.0
cargo set-version -p tor-geoip 0.42.0
cargo set-version -p tor-guardmgr 0.42.0
cargo set-version -p tor-hsclient 0.42.0
cargo set-version -p tor-hscrypto 0.42.0
cargo set-version -p tor-hsrproxy 0.42.0
cargo set-version -p tor-hsservice 0.42.0
cargo set-version -p tor-key-forge 0.42.0
cargo set-version -p tor-keymgr 0.42.0
cargo set-version -p tor-linkspec 0.42.0
cargo set-version -p tor-llcrypto 0.42.0
cargo set-version -p tor-log-ratelim 0.42.0
cargo set-version -p tor-memquota 0.42.0
cargo set-version -p tor-memquota-cost 0.42.0
cargo set-version -p tor-netdir 0.42.0
cargo set-version -p tor-netdoc 0.42.0
cargo set-version -p tor-persist 0.42.0
cargo set-version -p tor-proto 0.42.0
cargo set-version -p tor-protover 0.42.0
cargo set-version -p tor-ptmgr 0.42.0
cargo set-version -p tor-relay-crypto 0.42.0
cargo set-version -p tor-relay-selection 0.42.0
cargo set-version -p tor-rpcbase 0.42.0
cargo set-version -p tor-rpc-connect 0.42.0
cargo set-version -p tor-rtcompat 0.42.0
cargo set-version -p tor-rtmock 0.42.0
cargo set-version -p tor-socksproto 0.42.0
cargo set-version -p tor-units 0.42.0
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
There are no breaking changes.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
As per
https://gitlab.torproject.org/tpo/core/arti/-/issues/2436#note_3384773
Made with
nailing-cargo -Eu set-version -p arti-client 0.41.0
nailing-cargo -Eu set-version -p arti-relay 0.41.0
nailing-cargo -Eu set-version -p arti-rpcserver 0.41.0
nailing-cargo -Eu set-version -p arti-ureq 0.41.0
nailing-cargo -Eu set-version -p arti-rpc-client-core 0.41.0
nailing-cargo -Eu set-version -p tor-basic-utils 0.41.0
nailing-cargo -Eu set-version -p tor-error 0.41.0
nailing-cargo -Eu set-version -p tor-general-addr 0.41.0
nailing-cargo -Eu set-version -p tor-geoip 0.41.0
nailing-cargo -Eu set-version -p tor-memquota-cost 0.41.0
nailing-cargo -Eu set-version -p tor-llcrypto 0.41.0
nailing-cargo -Eu set-version -p tor-cert-x509 0.41.0
nailing-cargo -Eu set-version -p tor-rtcompat 0.41.0
nailing-cargo -Eu set-version -p tor-rtmock 0.41.0
nailing-cargo -Eu set-version -p tor-async-utils 0.41.0
nailing-cargo -Eu set-version -p tor-config 0.41.0
nailing-cargo -Eu set-version -p tor-config-path 0.41.0
nailing-cargo -Eu set-version -p tor-rpc-connect 0.41.0
nailing-cargo -Eu set-version -p tor-log-ratelim 0.41.0
nailing-cargo -Eu set-version -p tor-rpcbase 0.41.0
nailing-cargo -Eu set-version -p tor-memquota 0.41.0
nailing-cargo -Eu set-version -p tor-units 0.41.0
nailing-cargo -Eu set-version -p tor-bytes 0.41.0
nailing-cargo -Eu set-version -p tor-protover 0.41.0
nailing-cargo -Eu set-version -p tor-checkable 0.41.0
nailing-cargo -Eu set-version -p tor-cert 0.41.0
nailing-cargo -Eu set-version -p tor-key-forge 0.41.0
nailing-cargo -Eu set-version -p tor-hscrypto 0.41.0
nailing-cargo -Eu set-version -p tor-socksproto 0.41.0
nailing-cargo -Eu set-version -p tor-linkspec 0.41.0
nailing-cargo -Eu set-version -p tor-cell 0.41.0
nailing-cargo -Eu set-version -p tor-persist 0.41.0
nailing-cargo -Eu set-version -p tor-keymgr 0.41.0
nailing-cargo -Eu set-version -p tor-relay-crypto 0.41.0
nailing-cargo -Eu set-version -p tor-proto 0.41.0
nailing-cargo -Eu set-version -p tor-netdoc 0.41.0
nailing-cargo -Eu set-version -p tor-consdiff 0.41.0
nailing-cargo -Eu set-version -p tor-netdir 0.41.0
nailing-cargo -Eu set-version -p tor-relay-selection 0.41.0
nailing-cargo -Eu set-version -p tor-chanmgr 0.41.0
nailing-cargo -Eu set-version -p tor-ptmgr 0.41.0
nailing-cargo -Eu set-version -p tor-dircommon 0.41.0
nailing-cargo -Eu set-version -p tor-guardmgr 0.41.0
nailing-cargo -Eu set-version -p tor-circmgr 0.41.0
nailing-cargo -Eu set-version -p tor-dirclient 0.41.0
nailing-cargo -Eu set-version -p tor-dirmgr 0.41.0
nailing-cargo -Eu set-version -p tor-dirserver 0.41.0
nailing-cargo -Eu set-version -p tor-hsclient 0.41.0
nailing-cargo -Eu set-version -p tor-hsservice 0.41.0
nailing-cargo -Eu set-version -p tor-hsrproxy 0.41.0
|
| |
|
|
|
|
|
|
| |
As per
https://gitlab.torproject.org/tpo/core/arti/-/issues/2436#note_3384773
Made with
cargo set-version --offline --bump minor -p retry-error
|
| |
|
|
|
|
|
|
| |
As per
https://gitlab.torproject.org/tpo/core/arti/-/issues/2436#note_3384773
Made with
cargo set-version --offline --bump patch -p safelog
|
| |
|
|
| |
As generated by maint/fixup-features.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
| |
Done using:
```
for crate in $(./maint/list_crates | rg '^(tor|arti-)'); do
cargo set-version -p $crate 0.40.0
done
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The non-{arti-,tor-} crates are:
```
./maint/list-crates | rg -v '^(tor|arti)'
oneshot-fused-workaround
slotmap-careful
test-temp-dir
fslock-guard
hashx
equix
caret
fs-mistrust
safelog
retry-error
futures-copy
```
Because this release bumps the MSRV, I am bumping the minor version of all of
them.
MINOR="
oneshot-fused-workaround
slotmap-careful
test-temp-dir
fslock-guard
hashx
equix
caret
fs-mistrust
safelog
retry-error
futures-copy
"
for crate in $MINOR; do
cargo set-version --bump minor -p $crate;
done
```
|