[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] Correctly handle partial success in consensus diff calculation.
commit 3bb29dd707fbc825501c30ed9a6fe4aecdf4fd22
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Mon Nov 20 11:02:40 2017 -0500
Correctly handle partial success in consensus diff calculation.
Previously, if store_multiple() reported a partial success, we would
store all the handles it gave us as if they had succeeded. But it's
possible for the diff to be only partially successful -- for
example, if LZMA failed but the other compressors succeeded.
Fixes bug 24086; bugfix on 0.3.1.1-alpha.
---
changes/bug24086 | 7 +++++++
src/or/consdiffmgr.c | 9 +++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/changes/bug24086 b/changes/bug24086
new file mode 100644
index 000000000..2ae0b37e6
--- /dev/null
+++ b/changes/bug24086
@@ -0,0 +1,7 @@
+ o Minor bugfixes (directory cache):
+ - When a consensus diff calculation is only partially successful, only
+ record the successful parts as having succeeded. Partial success
+ can happen if (for example) one compression method fails but
+ the others succeed. Previously we misrecorded all the calculations as
+ having succeeded, which would later cause a nonfatal assertion failure.
+ Fixes bug 24086; bugfix on 0.3.1.1-alpha.
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
index 831d5d45c..8c25ff201 100644
--- a/src/or/consdiffmgr.c
+++ b/src/or/consdiffmgr.c
@@ -1589,8 +1589,13 @@ consensus_diff_worker_replyfn(void *work_)
for (u = 0; u < ARRAY_LENGTH(handles); ++u) {
compress_method_t method = compress_diffs_with[u];
if (cache) {
- cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, status,
- handles[u]);
+ consensus_cache_entry_handle_t *h = handles[u];
+ int this_status = status;
+ if (h == NULL) {
+ this_status = CDM_DIFF_ERROR;
+ }
+ tor_assert_nonfatal(h != NULL || this_status == CDM_DIFF_ERROR);
+ cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, this_status, h);
} else {
consensus_cache_entry_handle_free(handles[u]);
}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits