|
@@ -120,6 +120,12 @@ n_consensus_compression_methods(void)
|
|
|
*/
|
|
|
#define RETAIN_CONSENSUS_COMPRESSED_WITH_METHOD ZLIB_METHOD
|
|
|
|
|
|
+
|
|
|
+ * stored. */
|
|
|
+static consensus_cache_entry_handle_t *
|
|
|
+ latest_consensus[N_CONSENSUS_FLAVORS]
|
|
|
+ [ARRAY_LENGTH(compress_consensus_with)];
|
|
|
+
|
|
|
|
|
|
* from a given sha3 digest to the current consensus. */
|
|
|
typedef struct cdm_diff_t {
|
|
@@ -510,6 +516,41 @@ sort_and_find_most_recent(smartlist_t *lst)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * If we know a consensus with the flavor <b>flavor</b> compressed with
|
|
|
+ * <b>method</b>, set *<b>entry_out</b> to that value. Return values are as
|
|
|
+ * for consdiffmgr_find_diff_from().
|
|
|
+ */
|
|
|
+consdiff_status_t
|
|
|
+consdiffmgr_find_consensus(struct consensus_cache_entry_t **entry_out,
|
|
|
+ consensus_flavor_t flavor,
|
|
|
+ compress_method_t method)
|
|
|
+{
|
|
|
+ int pos=-1;
|
|
|
+ unsigned i;
|
|
|
+ tor_assert(flavor < N_CONSENSUS_FLAVORS);
|
|
|
+
|
|
|
+
|
|
|
+ for (i = 0; i < n_consensus_compression_methods(); ++i) {
|
|
|
+ if (compress_consensus_with[i] == method) {
|
|
|
+ pos = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (pos < 0) {
|
|
|
+
|
|
|
+ return CONSDIFF_NOT_FOUND;
|
|
|
+ }
|
|
|
+ consensus_cache_entry_handle_t *handle = latest_consensus[flavor][pos];
|
|
|
+ if (!handle)
|
|
|
+ return CONSDIFF_NOT_FOUND;
|
|
|
+ *entry_out = consensus_cache_entry_handle_get(handle);
|
|
|
+ if (entry_out)
|
|
|
+ return CONSDIFF_AVAILABLE;
|
|
|
+ else
|
|
|
+ return CONSDIFF_NOT_FOUND;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
* Look up consensus_cache_entry_t for the consensus of type <b>flavor</b>,
|
|
|
* from the source consensus with the specified digest (which must be SHA3).
|
|
@@ -1063,6 +1104,14 @@ consdiffmgr_free_all(void)
|
|
|
next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff);
|
|
|
cdm_diff_free(this);
|
|
|
}
|
|
|
+ int i;
|
|
|
+ unsigned j;
|
|
|
+ for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) {
|
|
|
+ for (j = 0; j < n_consensus_compression_methods(); ++j) {
|
|
|
+ consensus_cache_entry_handle_free(latest_consensus[i][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ memset(latest_consensus, 0, sizeof(latest_consensus));
|
|
|
consensus_cache_free(cons_diff_cache);
|
|
|
cons_diff_cache = NULL;
|
|
|
}
|
|
@@ -1571,6 +1620,16 @@ consensus_compress_worker_replyfn(void *work_)
|
|
|
"consensus");
|
|
|
cdm_cache_dirty = 1;
|
|
|
|
|
|
+ unsigned u;
|
|
|
+ consensus_flavor_t f = job->flavor;
|
|
|
+ tor_assert(f < N_CONSENSUS_FLAVORS);
|
|
|
+ for (u = 0; u < ARRAY_LENGTH(handles); ++u) {
|
|
|
+ if (handles[u] == NULL)
|
|
|
+ continue;
|
|
|
+ consensus_cache_entry_handle_free(latest_consensus[f][u]);
|
|
|
+ latest_consensus[f][u] = handles[u];
|
|
|
+ }
|
|
|
+
|
|
|
consensus_compress_worker_job_free(job);
|
|
|
}
|
|
|
|