Clear last_hid_serv_requests on SIGNAL NEWNYM

Fixes bug #3309.
This commit is contained in:
Robert Ransom 2011-06-02 02:46:04 -07:00
parent a1d866edc9
commit b0e7925c02
4 changed files with 30 additions and 0 deletions

9
changes/bug3309 Normal file
View File

@ -0,0 +1,9 @@
o Minor bugfixes:
- Clear the table recording the time of the last request for each
hidden service descriptor from each HS directory on SIGNAL
NEWNYM. Previously, we would clear our HS descriptor cache on
SIGNAL NEWNYM, but if we had previously retrieved a descriptor
(or tried to) from every directory responsible for it, we would
refuse to fetch it again for up to 15 minutes. Bugfix on
0.2.2.25-alpha; fixes bug 3309.

View File

@ -855,6 +855,7 @@ signewnym_impl(time_t now)
addressmap_clear_transient();
rend_cache_purge();
rend_client_cancel_descriptor_fetches();
rend_client_purge_last_hid_serv_requests();
time_of_last_signewnym = now;
signewnym_is_pending = 0;
}

View File

@ -444,6 +444,25 @@ directory_clean_last_hid_serv_requests(void)
}
}
/** Purge the history of request times to hidden service directories,
* so that future lookups of an HS descriptor will not fail because we
* accessed all of the HSDir relays responsible for the descriptor
* recently. */
void
rend_client_purge_last_hid_serv_requests(void)
{
/* Don't create the table if it doesn't exist yet (and it may very
* well not exist if the user hasn't accessed any HSes)... */
strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_;
/* ... and let get_last_hid_serv_requests re-create it for us if
* necessary. */
last_hid_serv_requests_ = NULL;
if (old_last_hid_serv_requests != NULL) {
strmap_free(old_last_hid_serv_requests, _tor_free);
}
}
/** Determine the responsible hidden service directories for <b>desc_id</b>
* and fetch the descriptor belonging to that ID from one of them. Only
* send a request to hidden service directories that we did not try within

View File

@ -19,6 +19,7 @@ int rend_client_introduction_acked(origin_circuit_t *circ,
size_t request_len);
void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query);
void rend_client_cancel_descriptor_fetches(void);
void rend_client_purge_last_hid_serv_requests(void);
int rend_client_remove_intro_point(extend_info_t *failed_intro,
const rend_data_t *rend_query);
int rend_client_rendezvous_acked(origin_circuit_t *circ,