aboutsummaryrefslogtreecommitdiff
path: root/crates/tor-circmgr
Commit message (Collapse)AuthorAgeFilesLines
...
* Give every ConfigBuilder a From<Config> implementation.Nick Mathewson2021-11-211-0/+22
| | | | This will make it more convenient to reconfigure things.
* Ensure that every section-level config type has a builder() function.Nick Mathewson2021-11-211-0/+18
|
* Flatten enforce_distance into path_rules.Nick Mathewson2021-11-183-16/+54
| | | | Also use the path_rules name consistently throughout the code.
* Fold "circuit_timing" and "request_timing" into a single section.Nick Mathewson2021-11-183-76/+29
|
* Move top-level configuration downwards from `arti` to `arti-config`.Nick Mathewson2021-11-182-4/+7
| | | | | | | | To do this at all neatly, I had to split out `tor-config` from `arti-config` again, and putting the lower level stuff (paths, builder errors) into tor-config. I also changed our use of derive_builder to always use a common error type, to avoid error type proliferation.
* Completely overhaul the tor-proto circuit reactoreta2021-11-121-4/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rather like e8e9699c3c239d6c30f9ad414f15d3bad6ec03fd ("Get rid of tor-proto's ChannelImpl, and use the reactor more instead"), this admittedly rather large commit refactors the way circuits in `tor-proto` work, centralising all of the logic in one large nonblocking reactor which other things send messages into and out of, instead of having a bunch of `-Impl` types that are protected by mutexes. Congestion control becomes a lot simpler with this refactor, since the reactor can manage both stream- and circuit-level congestion control unilaterally without having to share this information with consumers, meaning we can get rid of some locks. The way streams work also changes, in order to facilitate better handling of backpressure / fairness between streams: each stream now has a set of channels to send and receive messages over, instead of sending relay cells directly onto the channel (now, the reactor pulls messages off each stream in each map, and tries to avoid doing so if it won't be able to forward them yet). Additionally, a lot of "close this circuit / stream" messages aren't required any more, since that state is simply indicated by one end of a channel going away. This should make cleanup a lot less brittle. Getting all of this to work involved writing a fair deal of intricate nonblocking code in Reactor::run_once that tries very hard to be mindful of making backpressure work correctly (and congestion control); the old code could get away with having tasks .await on things, but the new reactor can't really do this (as it'd lock the reactor up), so has to do everything in a nonblocking manner.
* Fix typosDimitris Apostolou2021-11-121-1/+1
|
* Document that the "experimental-api" feature is not semver-covered.Nick Mathewson2021-11-111-0/+4
|
* Add a couple of pieces of missing documentation.Nick Mathewson2021-11-081-1/+1
|
* Replace all println/eprintln calls outside of arti CLI with trace.Nick Mathewson2021-11-042-4/+6
|
* Remove all remaining dbg! instances.Nick Mathewson2021-11-041-5/+0
|
* Basic tests for readonly estimators, and estimator migration.Nick Mathewson2021-11-032-2/+92
| | | | | Also add a comment about a possible problem behavior in read-only estimators.
* Get rid of tor-proto's ChannelImpl, and use the reactor more insteadeta2021-11-031-2/+4
| | | | | | | | | | | | | | | | | | | Instead of awkwardly sharing the internals of a `tor-proto` `Channel` between the reactor task and any other tasks, move most of the internals into the reactor and have other tasks communicate with the reactor via message-passing to allocate circuits and send cells. This makes a lot of things simple, and has convenient properties like not needing to wrap the `Channel` in an `Arc` (though some places in the code still do this for now). A lot of test code required tweaking in order to deal with the refactor; in fact, fixing the tests probably took longer than writing the mainline code (!). Importantly, we now use `tokio`'s `tokio::test` annotation instead of `async_test`, so that we can run things in the background (which is required to have reactors running for the circuit tests). This is an instance of #205, and also kind of #217.
* Disable a check in exitpathNick Mathewson2021-11-021-1/+2
| | | | | This check relies on families being enforced correctly, which is not the case when specifying a fixed exit and using guards. (See #183)
* Allow clone-on-copy in tor-circmgr tests to fix a nightly-only clippy warning.Nick Mathewson2021-11-022-0/+2
|
* tor-circmgr: test ExitPathBuilder with guards.Nick Mathewson2021-11-022-0/+104
|
* tor-circmgr: test DirPathBuilder with GuardMgr.Nick Mathewson2021-11-022-0/+41
|
* tor-circmgr: testing for NoUsage and TimeoutTesting usageNick Mathewson2021-11-021-0/+24
| | | | This doesn't add much to coverage, but it's important.
* tor-circmgr: tests for netwoks with no exitsNick Mathewson2021-11-022-25/+76
|
* tor-circmgr::usage: Add a few more tests.Nick Mathewson2021-11-021-2/+66
|
* Bump all crate versions to 0.0.1Nick Mathewson2021-10-291-14/+14
|
* Merge remote-tracking branch 'origin/mr/112'Nick Mathewson2021-10-291-3/+37
|\
| * Improve docs of more (potentially re-exported) arti-client typeseta2021-10-291-3/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Most of the structs in `arti-client` have example code now, to give a clearer idea of how they're used. Annoyingly, a lot of the types exposed in `arti-client` are actually re-exports, which makes documentation a bit harder: example code that references other parts of `arti-client` can't actually be run as a doctest, since the crate it's in is a dependency of `arti-client`. We might be able to fix this in future by doing the documentation in `arti-client` itself, but rustdoc seems to have some weird behaviours there that need to be investigated first (for example, it seems to merge the re-export and original documentation, and also put the re-export documentation on the `impl` block for some reason). For now, though, this commit just writes the docs from the point of view of an `arti-client` consumer, removing notes specific to the crate in which they're defined. It's not ideal, but at least the end user experience is decent.
* | Improve some documentation linksNick Mathewson2021-10-291-1/+2
|/ | | | | | | | | Instead of putting a fully qualified name in the text, in most cases we should just use the short name of the type or function we're referring to. In other words, instead of saying [`crate::module::Foo`], we should typically say [`Foo`](crate::module::Foo).
* Try writing a bit more documentation for configuration types.Nick Mathewson2021-10-281-3/+9
|
* Fix clippy warnings in tests.Nick Mathewson2021-10-281-5/+5
|
* Merge remote-tracking branch 'origin/mr/110'Nick Mathewson2021-10-281-136/+233
|\
| * tor_circmgr: Refactor and re-enable build_timeout() testNick Mathewson2021-10-271-136/+233
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The previous version of this test used the old, racy version of wait_for (see #149). The new version is refactored so that simulated time is only allowed to advance after each step is done, so that we can actually be sure that each step in the process will happen as it should. In order to get the time-advances to proceed properly, and avoid polluting state between tests, I've had to introduce some machinery to encode the proper amount for time to advance. It isn't something I'd want to use for a whole bunch of tests, but for just one set, it's fine. These tests now pass reliably for me. I wonder if a discrete-event-simulation approach (hello, Shadow) would let us write tests like these to our hearts' content?
* | Mark request_retried test as ignoredNick Mathewson2021-10-281-0/+1
|/
* Update our disclaimers and limitations sections.Nick Mathewson2021-10-272-8/+0
|
* Add #[serde(flatten)] HashMap fields to serializable objectseta2021-10-271-2/+8
| | | | | | | | | | As per arti#175, we'd like to be able to handle newer Arti versions storing additional state in the persisted state files, without dropping this data on the floor when we write out changes to these files. Use the #[serde(flatten)] mechanism to achieve this, by adding catch-all HashMap<String, JsonValue> fields to all structs that are at risk of this happening to them.
* Fix some clippy-nightly warnings.Nick Mathewson2021-10-261-0/+4
| | | | These are my fault; I merged the wrong version of !102. :p
* circmgr: Split request_timeout test into two.Nick Mathewson2021-10-261-0/+7
| | | | | | | There seems to be some issue here with the new WaitFor code, where using the same MockSleepProvider with both of these wait_for() calls gives questionable behavior under some circumstances (like when running under Tarpaulin with the wrong set of flags).
* Merge remote-tracking branch 'origin/mr/102'Nick Mathewson2021-10-263-15/+79
|\
| * Overhaul the way WaitFor and the MockSleepProvider worketa2021-10-263-15/+79
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of racily advancing time forward, this commit attempts to rework how WaitFor works, such that it makes advances when all sleeper futures that have been created have been polled (by handing the MockSleepRuntime a Waker with which to wake up the WaitFor). The above described mechanics work well enough for the double timeout test, but fail in the presence of code that spawns asynchronous / background tasks that must make progress before time is advanced for the test to work properly. In order to deal with these cases, a set of APIs are introduced in order to block time from being advanced until some code has run, and a carveout added in order to permit small advances in time where required. (In some cases, code needed to be hacked up a bit in order to be made properly testable using these APIs; the `MockablePlan` trait included in here is somewhat unfortunate.) This should fix arti#149.
* | Merge branch 'pb_lite_squashed'Nick Mathewson2021-10-261-1/+11
|\ \
| * | Do not blame a guard for failures on non-random circuits.Nick Mathewson2021-10-261-1/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | We must not apply our new path-bias behavior (where we blame a guard if it gives us too many indeterminate circuit failures) if the path was not chosen at random. If too many random paths fail, we know that's suspicious, since the other relays are a random sample. But if a bunch of user-provided paths fail, that could simply be because the user's chosen exit is down.
* | | Turn StreamIsolation into a separate type.Nick Mathewson2021-10-252-39/+91
|/ / | | | | | | | | | | | | | | | | Now that we have two kinds of isolation tokens (those set on a stream, and those set by the stream's associated TorClient), we need a more sophisticated kind of isolation. This fixes the bug introduced with the previous commit, where per-stream tokens would override per-TorClient tokens.
* | s/arti-arti-client/arti-client/ and regenerate readme filesNick Mathewson2021-10-251-1/+1
| |
* | Fix a typo in a comment.Nick Mathewson2021-10-251-1/+1
| |
* | Run "cargo fix --edition-idioms=2018".Nick Mathewson2021-10-221-1/+1
| |
* | Replace references to arti-client in the documentation.Nick Mathewson2021-10-213-4/+4
| |
* | Remove #![allow(dead_code)] in timeouts.rsNick Mathewson2021-10-212-2/+3
| |
* | Merge branch 'share_state'Nick Mathewson2021-10-217-221/+461
|\ \ | |/ |/|
| * Implement the guard side of shared state directories.Nick Mathewson2021-10-211-1/+10
| |
| * Finish the timeout-inference side of shared state.Nick Mathewson2021-10-203-30/+94
| |
| * Add a timeout estimator to take estimates from another process.Nick Mathewson2021-10-204-42/+93
| |
| * Allow type of timeout estimator to change at runtime.Nick Mathewson2021-10-204-201/+289
| | | | | | | | | | | | This is a big change, but it does simplify the type of Builder a little, and isolates locking across different (potential) timeout estimator types.
| * Replace the return type of StorageMgr::try_lock with a tristateNick Mathewson2021-10-201-1/+9
| | | | | | | | | | It's useful to know now only if we now have the lock, but also if we just got it for the first time.
| * Initial work on periodically reloading state.Nick Mathewson2021-10-192-2/+11
| | | | | | | | | | We can use this in the case where we don't get the lock on the state file, because another process is running.