|
@@ -149,7 +149,8 @@ typedef struct cert_list_t cert_list_t;
|
|
|
|
|
|
static int compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
bandwidth_weight_rule_t rule,
|
|
|
- double **bandwidths_out);
|
|
|
+ double **bandwidths_out,
|
|
|
+ double *total_bandwidth_out);
|
|
|
static const routerstatus_t *router_pick_trusteddirserver_impl(
|
|
|
const smartlist_t *sourcelist, dirinfo_type_t auth,
|
|
|
int flags, int *n_busy_out);
|
|
@@ -2513,7 +2514,7 @@ smartlist_choose_node_by_bandwidth_weights(const smartlist_t *sl,
|
|
|
double *bandwidths_dbl=NULL;
|
|
|
uint64_t *bandwidths_u64=NULL;
|
|
|
|
|
|
- if (compute_weighted_bandwidths(sl, rule, &bandwidths_dbl) < 0)
|
|
|
+ if (compute_weighted_bandwidths(sl, rule, &bandwidths_dbl, NULL) < 0)
|
|
|
return NULL;
|
|
|
|
|
|
bandwidths_u64 = tor_calloc(smartlist_len(sl), sizeof(uint64_t));
|
|
@@ -2533,11 +2534,14 @@ smartlist_choose_node_by_bandwidth_weights(const smartlist_t *sl,
|
|
|
* smartlist_choose_node_by_bandwidth_weights, compute weighted bandwidth
|
|
|
* values for each node and store them in a freshly allocated
|
|
|
* *<b>bandwidths_out</b> of the same length as <b>sl</b>, and holding results
|
|
|
- * as doubles. Return 0 on success, -1 on failure. */
|
|
|
+ * as doubles. If <b>total_bandwidth_out</b> is non-NULL, set it to the total
|
|
|
+ * of all the bandwidths.
|
|
|
+ * Return 0 on success, -1 on failure. */
|
|
|
static int
|
|
|
compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
bandwidth_weight_rule_t rule,
|
|
|
- double **bandwidths_out)
|
|
|
+ double **bandwidths_out,
|
|
|
+ double *total_bandwidth_out)
|
|
|
{
|
|
|
int64_t weight_scale;
|
|
|
double Wg = -1, Wm = -1, We = -1, Wd = -1;
|
|
@@ -2545,6 +2549,7 @@ compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
uint64_t weighted_bw = 0;
|
|
|
guardfraction_bandwidth_t guardfraction_bw;
|
|
|
double *bandwidths;
|
|
|
+ double total_bandwidth = 0.0;
|
|
|
|
|
|
|
|
|
tor_assert(rule == NO_WEIGHTING ||
|
|
@@ -2553,6 +2558,10 @@ compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
rule == WEIGHT_FOR_MID ||
|
|
|
rule == WEIGHT_FOR_DIR);
|
|
|
|
|
|
+ if (total_bandwidth_out) {
|
|
|
+ *total_bandwidth_out = 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
if (smartlist_len(sl) == 0) {
|
|
|
log_info(LD_CIRC,
|
|
|
"Empty routerlist passed in to consensus weight node "
|
|
@@ -2714,6 +2723,7 @@ compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
}
|
|
|
|
|
|
bandwidths[node_sl_idx] = final_weight;
|
|
|
+ total_bandwidth += final_weight;
|
|
|
} SMARTLIST_FOREACH_END(node);
|
|
|
|
|
|
log_debug(LD_CIRC, "Generated weighted bandwidths for rule %s based "
|
|
@@ -2724,6 +2734,10 @@ compute_weighted_bandwidths(const smartlist_t *sl,
|
|
|
|
|
|
*bandwidths_out = bandwidths;
|
|
|
|
|
|
+ if (total_bandwidth_out) {
|
|
|
+ *total_bandwidth_out = total_bandwidth;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2740,7 +2754,8 @@ frac_nodes_with_descriptors(const smartlist_t *sl,
|
|
|
if (smartlist_len(sl) == 0)
|
|
|
return 0.0;
|
|
|
|
|
|
- if (compute_weighted_bandwidths(sl, rule, &bandwidths) < 0) {
|
|
|
+ if (compute_weighted_bandwidths(sl, rule, &bandwidths, &total) < 0 ||
|
|
|
+ total <= 0.0) {
|
|
|
int n_with_descs = 0;
|
|
|
SMARTLIST_FOREACH(sl, const node_t *, node, {
|
|
|
if (node_has_descriptor(node))
|
|
@@ -2759,9 +2774,6 @@ frac_nodes_with_descriptors(const smartlist_t *sl,
|
|
|
|
|
|
tor_free(bandwidths);
|
|
|
|
|
|
- if (total < 1.0)
|
|
|
- return 0;
|
|
|
-
|
|
|
return present / total;
|
|
|
}
|
|
|
|