Queue consensus diffs at LOW priority.

Fixes bug 22883.
This commit is contained in:
Nick Mathewson 2017-07-12 12:17:51 -04:00
parent bddea78ded
commit 0ae0b5aa41
5 changed files with 27 additions and 9 deletions

View File

@ -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.

View File

@ -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) {

View File

@ -481,13 +481,15 @@ 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,
return threadpool_queue_work_priority(threadpool,
priority,
fn,
reply_fn,
arg);
@ -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);

View File

@ -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));

View File

@ -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();