[tor-commits] [tor] branch main updated: relay: Use the configured number of threads for worker work calculation

gitolite role git at cupani.torproject.org
Wed Nov 23 19:58:17 UTC 2022


This is an automated email from the git hooks/post-receive script.

dgoulet pushed a commit to branch main
in repository tor.

The following commit(s) were added to refs/heads/main by this push:
     new fbc9e92fdb relay: Use the configured number of threads for worker work calculation
     new 04d8753676 Merge branch 'maint-0.4.7'
fbc9e92fdb is described below

commit fbc9e92fdb364a741a3190fc22c6fa65d90e92e3
Author: David Goulet <dgoulet at torproject.org>
AuthorDate: Wed Nov 23 13:47:59 2022 -0500

    relay: Use the configured number of threads for worker work calculation
    
    We cap our number of CPU worker threads to at least 2 even if we have a
    single core. But also, before we used to always add one extra thread
    regardless of the number of core.
    
    This meant that we were off when re-using the get_num_cpus() function
    when calculating our onionskin work overhead because we were always off
    by one.
    
    This commit makes it that we always use the number of thread our actual
    thread pool was configured with.
    
    Fixes #40719
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 changes/ticket40719             |  3 +++
 src/core/mainloop/cpuworker.c   | 10 ++++++++++
 src/core/mainloop/cpuworker.h   |  2 ++
 src/feature/relay/onion_queue.c |  8 +++++++-
 src/lib/evloop/workqueue.c      |  8 ++++++++
 src/lib/evloop/workqueue.h      |  1 +
 6 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/changes/ticket40719 b/changes/ticket40719
new file mode 100644
index 0000000000..eec84dce0f
--- /dev/null
+++ b/changes/ticket40719
@@ -0,0 +1,3 @@
+  o Minor bugfixes (cpuworker, relay):
+    - Fix an off by one overload calculation on the number of CPUs being used by
+      our thread pool. Fixes bug 40719; bugfix on 0.3.5.1-alpha.
diff --git a/src/core/mainloop/cpuworker.c b/src/core/mainloop/cpuworker.c
index 3ad556a184..39d4899075 100644
--- a/src/core/mainloop/cpuworker.c
+++ b/src/core/mainloop/cpuworker.c
@@ -144,6 +144,16 @@ cpu_init(void)
   set_max_pending_tasks(NULL);
 }
 
+/** Return the number of threads configured for our CPU worker. */
+unsigned int
+cpuworker_get_n_threads(void)
+{
+  if (!threadpool) {
+    return 0;
+  }
+  return threadpool_get_n_threads(threadpool);
+}
+
 /** Magic numbers to make sure our cpuworker_requests don't grow any
  * mis-framing bugs. */
 #define CPUWORKER_REQUEST_MAGIC 0xda4afeed
diff --git a/src/core/mainloop/cpuworker.h b/src/core/mainloop/cpuworker.h
index 94545af586..9eee287c1f 100644
--- a/src/core/mainloop/cpuworker.h
+++ b/src/core/mainloop/cpuworker.h
@@ -38,5 +38,7 @@ void cpuworker_log_onionskin_overhead(int severity, int onionskin_type,
                                       const char *onionskin_type_name);
 void cpuworker_cancel_circ_handshake(or_circuit_t *circ);
 
+unsigned int cpuworker_get_n_threads(void);
+
 #endif /* !defined(TOR_CPUWORKER_H) */
 
diff --git a/src/feature/relay/onion_queue.c b/src/feature/relay/onion_queue.c
index 6d1a6de15c..b844aefcd1 100644
--- a/src/feature/relay/onion_queue.c
+++ b/src/feature/relay/onion_queue.c
@@ -152,7 +152,13 @@ have_room_for_onionskin(uint16_t type)
   /* If we've got fewer than 50 entries, we always have room for one more. */
   if (ol_entries[type] < 50)
     return 1;
-  num_cpus = get_num_cpus(options);
+
+  /* If zero, this means our thread pool was never initialized meaning we can't
+   * really get here but make sure we don't have such value because we are
+   * using as a divisor. */
+  num_cpus = cpuworker_get_n_threads();
+  tor_assert(num_cpus > 0);
+
   max_onion_queue_delay = get_onion_queue_max_delay(options);
 
   /* Compute how many microseconds we'd expect to need to clear all
diff --git a/src/lib/evloop/workqueue.c b/src/lib/evloop/workqueue.c
index 603dddd5a3..bc929148eb 100644
--- a/src/lib/evloop/workqueue.c
+++ b/src/lib/evloop/workqueue.c
@@ -672,3 +672,11 @@ replyqueue_process(replyqueue_t *queue)
 
   tor_mutex_release(&queue->lock);
 }
+
+/** Return the number of threads configured for the given pool. */
+unsigned int
+threadpool_get_n_threads(threadpool_t *tp)
+{
+  tor_assert(tp);
+  return tp->n_threads;
+}
diff --git a/src/lib/evloop/workqueue.h b/src/lib/evloop/workqueue.h
index 50391759bf..134fe7434f 100644
--- a/src/lib/evloop/workqueue.h
+++ b/src/lib/evloop/workqueue.h
@@ -65,5 +65,6 @@ void replyqueue_process(replyqueue_t *queue);
 
 int threadpool_register_reply_event(threadpool_t *tp,
                                     void (*cb)(threadpool_t *tp));
+unsigned int threadpool_get_n_threads(threadpool_t *tp);
 
 #endif /* !defined(TOR_WORKQUEUE_H) */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tor-commits mailing list