summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-07-12 12:17:51 -0400
committerNick Mathewson <nickm@torproject.org>2017-07-27 16:28:59 -0400
commit0ae0b5aa4136fe6df7863c8a5b7d239d519b7393 (patch)
treeb6091d0a70fcc9a03f2c0ff361e7c02ba2e7f1d7
parentbddea78dede010cdf0115265546cdca0c47d64d0 (diff)
downloadtor-0ae0b5aa4136fe6df7863c8a5b7d239d519b7393.tar.gz
tor-0ae0b5aa4136fe6df7863c8a5b7d239d519b7393.zip
Queue consensus diffs at LOW priority.
Fixes bug 22883.
-rw-r--r--changes/bug22883-priority8
-rw-r--r--src/or/consdiffmgr.c6
-rw-r--r--src/or/cpuworker.c15
-rw-r--r--src/or/cpuworker.h2
-rw-r--r--src/test/test_consdiffmgr.c5
5 files changed, 27 insertions, 9 deletions
diff --git a/changes/bug22883-priority b/changes/bug22883-priority
new file mode 100644
index 0000000000..4b3531c30b
--- /dev/null
+++ b/changes/bug22883-priority
@@ -0,0 +1,8 @@
+ o Major bugfixes (relay, performance):
+
+ - Perform circuit handshake operations at a higher priority than we use
+ for consensus diff creation and compression. This should prevent
+ circuits from starving when a relay or bridge receive a new consensus,
+ especially on lower-powered machines. Fixes bug 22883; bugfix on
+ 0.3.1.1-alpha.
+
diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c
index 638fcd6794..8d0a0af3d5 100644
--- a/src/or/consdiffmgr.c
+++ b/src/or/consdiffmgr.c
@@ -1605,7 +1605,8 @@ consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from,
goto err;
workqueue_entry_t *work;
- work = cpuworker_queue_work(consensus_diff_worker_threadfn,
+ work = cpuworker_queue_work(WQ_PRI_LOW,
+ consensus_diff_worker_threadfn,
consensus_diff_worker_replyfn,
job);
if (!work)
@@ -1768,7 +1769,8 @@ consensus_queue_compression_work(const char *consensus,
if (background_compression) {
workqueue_entry_t *work;
- work = cpuworker_queue_work(consensus_compress_worker_threadfn,
+ work = cpuworker_queue_work(WQ_PRI_LOW,
+ consensus_compress_worker_threadfn,
consensus_compress_worker_replyfn,
job);
if (!work) {
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index 1013fa555e..ad99af64c0 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -481,16 +481,18 @@ queue_pending_tasks(void)
/** DOCDOC */
MOCK_IMPL(workqueue_entry_t *,
-cpuworker_queue_work,(workqueue_reply_t (*fn)(void *, void *),
+cpuworker_queue_work,(workqueue_priority_t priority,
+ workqueue_reply_t (*fn)(void *, void *),
void (*reply_fn)(void *),
void *arg))
{
tor_assert(threadpool);
- return threadpool_queue_work(threadpool,
- fn,
- reply_fn,
- arg);
+ return threadpool_queue_work_priority(threadpool,
+ priority,
+ fn,
+ reply_fn,
+ arg);
}
/** Try to tell a cpuworker to perform the public key operations necessary to
@@ -545,7 +547,8 @@ assign_onionskin_to_cpuworker(or_circuit_t *circ,
memwipe(&req, 0, sizeof(req));
++total_pending_tasks;
- queue_entry = threadpool_queue_work(threadpool,
+ queue_entry = threadpool_queue_work_priority(threadpool,
+ WQ_PRI_HIGH,
cpuworker_onion_handshake_threadfn,
cpuworker_onion_handshake_replyfn,
job);
diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h
index aedf2fae32..320de9532f 100644
--- a/src/or/cpuworker.h
+++ b/src/or/cpuworker.h
@@ -16,7 +16,9 @@ void cpu_init(void);
void cpuworkers_rotate_keyinfo(void);
struct workqueue_entry_s;
enum workqueue_reply_t;
+enum workqueue_priority_t;
MOCK_DECL(struct workqueue_entry_s *, cpuworker_queue_work, (
+ enum workqueue_priority_t priority,
enum workqueue_reply_t (*fn)(void *, void *),
void (*reply_fn)(void *),
void *arg));
diff --git a/src/test/test_consdiffmgr.c b/src/test/test_consdiffmgr.c
index 746d17a038..963a6e427a 100644
--- a/src/test/test_consdiffmgr.c
+++ b/src/test/test_consdiffmgr.c
@@ -98,10 +98,13 @@ typedef struct fake_work_queue_ent_t {
void *arg;
} fake_work_queue_ent_t;
static struct workqueue_entry_s *
-mock_cpuworker_queue_work(enum workqueue_reply_t (*fn)(void *, void *),
+mock_cpuworker_queue_work(workqueue_priority_t prio,
+ enum workqueue_reply_t (*fn)(void *, void *),
void (*reply_fn)(void *),
void *arg)
{
+ (void) prio;
+
if (! fake_cpuworker_queue)
fake_cpuworker_queue = smartlist_new();