summaryrefslogtreecommitdiff
path: root/src/feature/dirclient/dlstatus.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2021-10-23 04:18:00 -0400
committerRoger Dingledine <arma@torproject.org>2021-10-24 17:40:28 -0400
commitd66549c20855b4d75b1a26f18c852327f6a75a05 (patch)
tree7e416fed816413ee6770fa9bf359d48daccfc3bf /src/feature/dirclient/dlstatus.c
parent2f171f30c8fdcf968ea304d48c42db9fbd0efdf4 (diff)
downloadtor-d66549c20855b4d75b1a26f18c852327f6a75a05.tar.gz
tor-d66549c20855b4d75b1a26f18c852327f6a75a05.zip
fetch missing bridge descriptors without delay
Without this change, if we have a working bridge, and we add a new bridge, we will schedule the fetch attempt for that new bridge descriptor for three hours(!) in the future. This change is especially needed because of bug #40396, where if you have one working bridge and one bridge whose descriptor you haven't fetched yet, your Tor will stall until you have successfully fetched that new descriptor -- in this case for hours. In the old design, we would put off all further bridge descriptor fetches once we had any working bridge descriptor. In this new design, we make the decision per bridge based on whether we successfully got *its* descriptor. To make this work, we need to also call learned_bridge_descriptor() every time we get a bridge descriptor, not just when it's a novel descriptor. Fixes bug 40396. Also happens to fix bug 40495 (redundant descriptor fetches for every bridge) since now we delay fetches once we succeed. A side effect of this change is that if we have any configured bridges that *aren't* working, we will keep trying to fetch their descriptors on the modern directory retry schedule -- every couple of seconds for the first half minute, then backing off after that -- which is a lot faster than before.
Diffstat (limited to 'src/feature/dirclient/dlstatus.c')
-rw-r--r--src/feature/dirclient/dlstatus.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/feature/dirclient/dlstatus.c b/src/feature/dirclient/dlstatus.c
index 8be2983a5d..c21dd113b4 100644
--- a/src/feature/dirclient/dlstatus.c
+++ b/src/feature/dirclient/dlstatus.c
@@ -73,15 +73,14 @@ find_dl_min_delay(const download_status_t *dls, const or_options_t *options)
}
}
case DL_SCHED_BRIDGE:
- if (options->UseBridges && num_bridges_usable(0) > 0) {
- /* A bridge client that is sure that one or more of its bridges are
- * running can afford to wait longer to update bridge descriptors. */
- return options->TestingBridgeDownloadInitialDelay;
- } else {
- /* A bridge client which might have no running bridges, must try to
- * get bridge descriptors straight away. */
- return options->TestingBridgeBootstrapDownloadInitialDelay;
- }
+ /* Be conservative here: always return the 'during bootstrap' delay
+ * value, so we never delay while trying to fetch descriptors
+ * for new bridges. Once we do succeed at fetching a descriptor
+ * for our bridge, we will adjust its next_attempt_at based on
+ * the longer "TestingBridgeDownloadInitialDelay" value. See
+ * learned_bridge_descriptor() for details.
+ */
+ return options->TestingBridgeBootstrapDownloadInitialDelay;
default:
tor_assert(0);
}