|
@@ -72,6 +72,11 @@ static const char address_tld[] = "onion";
|
|
|
* loading keys requires that we are an actual running tor process. */
|
|
|
static smartlist_t *hs_service_staging_list;
|
|
|
|
|
|
+/** True if the list of available router descriptors might have changed which
|
|
|
+ * might result in an altered hash ring. Check if the hash ring changed and
|
|
|
+ * reupload if needed */
|
|
|
+static int consider_republishing_hs_descriptors = 0;
|
|
|
+
|
|
|
static void set_descriptor_revision_counter(hs_descriptor_t *hs_desc);
|
|
|
|
|
|
/* Helper: Function to compare two objects in the service map. Return 1 if the
|
|
@@ -2429,7 +2434,14 @@ run_upload_descriptor_event(time_t now)
|
|
|
FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
|
|
|
int for_next_period = 0;
|
|
|
|
|
|
- /* Can this descriptor be uploaed? */
|
|
|
+ /* If we were asked to re-examine the hash ring, and it changed, then
|
|
|
+ schedule an upload */
|
|
|
+ if (consider_republishing_hs_descriptors &&
|
|
|
+ service_desc_hsdirs_changed(service, desc)) {
|
|
|
+ service_desc_schedule_upload(desc, now, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Can this descriptor be uploaded? */
|
|
|
if (!should_service_upload_descriptor(service, desc, now)) {
|
|
|
continue;
|
|
|
}
|
|
@@ -2456,6 +2468,9 @@ run_upload_descriptor_event(time_t now)
|
|
|
upload_descriptor_to_all(service, desc, for_next_period);
|
|
|
} FOR_EACH_DESCRIPTOR_END;
|
|
|
} FOR_EACH_SERVICE_END;
|
|
|
+
|
|
|
+ /* We are done considering whether to republish rend descriptors */
|
|
|
+ consider_republishing_hs_descriptors = 0;
|
|
|
}
|
|
|
|
|
|
/* Called when the introduction point circuit is done building and ready to be
|
|
@@ -2738,7 +2753,7 @@ service_add_fnames_to_list(const hs_service_t *service, smartlist_t *list)
|
|
|
|
|
|
/** The set of HSDirs have changed: check if the change affects our descriptor
|
|
|
* HSDir placement, and if it does, reupload the desc. */
|
|
|
-static int
|
|
|
+int
|
|
|
service_desc_hsdirs_changed(const hs_service_t *service,
|
|
|
const hs_service_descriptor_t *desc)
|
|
|
{
|
|
@@ -2788,34 +2803,13 @@ service_desc_hsdirs_changed(const hs_service_t *service,
|
|
|
/* ========== */
|
|
|
|
|
|
/* We just received a new batch of descriptors which might affect the shape of
|
|
|
- * the HSDir hash ring. Signal that we should re-upload our HS descriptors. */
|
|
|
+ * the HSDir hash ring. Signal that we should reexamine the hash ring and
|
|
|
+ * re-upload our HS descriptors if needed. */
|
|
|
void
|
|
|
hs_hsdir_set_changed_consider_reupload(void)
|
|
|
{
|
|
|
- time_t now = approx_time();
|
|
|
-
|
|
|
- /* Check if HS subsystem is initialized */
|
|
|
- if (!hs_service_map) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* Basic test: If we have not bootstrapped 100% yet, no point in even trying
|
|
|
- to upload descriptor. */
|
|
|
- if (!router_have_minimum_dir_info()) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- log_info(LD_GENERAL, "Received new dirinfo: Checking hash ring for changes");
|
|
|
-
|
|
|
- /* Go over all descriptors and check if the set of HSDirs changed for any of
|
|
|
- * them. Schedule reupload if so. */
|
|
|
- FOR_EACH_SERVICE_BEGIN(service) {
|
|
|
- FOR_EACH_DESCRIPTOR_BEGIN(service, desc) {
|
|
|
- if (service_desc_hsdirs_changed(service, desc)) {
|
|
|
- service_desc_schedule_upload(desc, now, 0);
|
|
|
- }
|
|
|
- } FOR_EACH_DESCRIPTOR_END;
|
|
|
- } FOR_EACH_SERVICE_END;
|
|
|
+ log_info(LD_REND, "New dirinfo arrived: consider reuploading descriptor");
|
|
|
+ consider_republishing_hs_descriptors = 1;
|
|
|
}
|
|
|
|
|
|
/* Return the number of service we have configured and usable. */
|