diff options
author | David Goulet <dgoulet@torproject.org> | 2021-10-06 15:35:30 -0400 |
---|---|---|
committer | David Goulet <dgoulet@torproject.org> | 2021-10-06 15:35:30 -0400 |
commit | a53c949dcf2816f6878209788c8768b7ca35dc35 (patch) | |
tree | 0998b30edb516b0aaf66b8ae9782aa06f92a4ab0 /src/feature/dirclient/dirclient.c | |
parent | f0d1240a07c60b3a01d730d9379bdbe72d41b552 (diff) | |
parent | cac612af42798bc76d8933837a9da97ddc039c9b (diff) | |
download | tor-a53c949dcf2816f6878209788c8768b7ca35dc35.tar.gz tor-a53c949dcf2816f6878209788c8768b7ca35dc35.zip |
Merge branch 'tor-gitlab/mr/420' into maint-0.4.5
Diffstat (limited to 'src/feature/dirclient/dirclient.c')
-rw-r--r-- | src/feature/dirclient/dirclient.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/feature/dirclient/dirclient.c b/src/feature/dirclient/dirclient.c index a5dd856729..f2e1e5b5ff 100644 --- a/src/feature/dirclient/dirclient.c +++ b/src/feature/dirclient/dirclient.c @@ -738,7 +738,22 @@ connection_dir_client_request_failed(dir_connection_t *conn) return; /* this was a test fetch. don't retry. */ } if (!entry_list_is_constrained(get_options())) - router_set_status(conn->identity_digest, 0); /* don't try this one again */ + /* We must not set a directory to non-running for HS purposes else we end + * up flagging nodes from the hashring has unusable. It doesn't have direct + * effect on the HS subsystem because the nodes are selected regardless of + * their status but still, we shouldn't flag them as non running. + * + * One example where this can go bad is if a tor instance gets added a lot + * of ephemeral services and with a network with problem then many nodes in + * the consenus ends up unusable. + * + * Furthermore, a service does close any pending directory connections + * before uploading a descriptor and thus we can end up here in a natural + * way since closing a pending directory connection leads to this code + * path. */ + if (!DIR_PURPOSE_IS_HS(TO_CONN(conn)->purpose)) { + router_set_status(conn->identity_digest, 0); + } if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { log_info(LD_DIR, "Giving up on serverdesc/extrainfo fetch from " |