]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[master] give threads unique names to assist debugging
authorEvan Hunt <each@isc.org>
Fri, 21 Apr 2017 20:58:22 +0000 (13:58 -0700)
committerEvan Hunt <each@isc.org>
Fri, 21 Apr 2017 20:59:40 +0000 (13:59 -0700)
4602. [func] Threads are now set to human-readable
names to assist debugging, when supported by
the OS. [RT #43234]

15 files changed:
CHANGES
config.h.in
configure
configure.in
doc/arm/notes.xml
lib/isc/nothreads/include/isc/thread.h
lib/isc/nothreads/thread.c
lib/isc/pthreads/include/isc/thread.h
lib/isc/pthreads/thread.c
lib/isc/task.c
lib/isc/timer.c
lib/isc/unix/socket.c
lib/isc/win32/include/isc/thread.h
lib/isc/win32/libisc.def.in
lib/isc/win32/thread.c

diff --git a/CHANGES b/CHANGES
index 4d67159f0976a3f1742ab40c6cbb13554a44d002..0e298ecbb902a183b0d90a087dbe0cb167174b20 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+4602.  [func]          Threads are now set to human-readable
+                       names to assist debugging, when supported by
+                       the OS. [RT #43234]
+
 4601.  [bug]           Reject incorrect RSA key lengths during key
                        generation and and sign/verify context
                        creation. [RT #45043]
index 597f9e6ff26c63ee39f78c4d32eac98ac82d0728..b7befbb5b81f8a030b221b176b0f2c514ab31897 100644 (file)
@@ -383,6 +383,15 @@ int sigwait(const unsigned int *set, int *sig);
 /* Support for PTHREAD_MUTEX_ADAPTIVE_NP */
 #undef HAVE_PTHREAD_MUTEX_ADAPTIVE_NP
 
+/* Define to 1 if you have the <pthread_np.h> header file. */
+#undef HAVE_PTHREAD_NP_H
+
+/* Define to 1 if you have the `pthread_setname_np' function. */
+#undef HAVE_PTHREAD_SETNAME_NP
+
+/* Define to 1 if you have the `pthread_set_name_np' function. */
+#undef HAVE_PTHREAD_SET_NAME_NP
+
 /* Define to 1 if you have the `pthread_yield' function. */
 #undef HAVE_PTHREAD_YIELD
 
index 956376a85e7c230a73ea1e85bcc00f6014edfa8d..3dac59d422cc3fc43e0a863815d10a0cdb2f3e3b 100755 (executable)
--- a/configure
+++ b/configure
                        ;;
        esac
 
+       # Look for functions relating to thread naming
+       for ac_func in pthread_setname_np pthread_set_name_np
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+       for ac_header in pthread_np.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_np_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_NP_H 1
+_ACEOF
+
+fi
+
+done
+
+
        #
        # Look for sysconf to allow detection of the number of processors.
        #
index 941123a37ab70f5617d9b493d593c89bc21de37d..bf388ff48dc0ef3b2c27e720b26088d8bb41c450 100644 (file)
@@ -1351,6 +1351,10 @@ then
                        ;;
        esac
 
+       # Look for functions relating to thread naming
+       AC_CHECK_FUNCS(pthread_setname_np pthread_set_name_np)
+       AC_CHECK_HEADERS(pthread_np.h)
+
        #
        # Look for sysconf to allow detection of the number of processors.
        #
index f52b11b6bf004933ac00106901c3c833b24d06f1..44aec4e82bfc3e80d3240ad9e59b00694f33f5c8 100644 (file)
 
   <section xml:id="relnotes_changes"><info><title>Feature Changes</title></info>
     <itemizedlist>
+      <listitem>
+       <para>
+         Threads in <command>named</command> are now set to human-readable
+         names to assist debugging on operating systems that support that.
+         Threads will have names such as "isc-timer", "isc-sockmgr",
+         "isc-worker0001", and so on. This will affect the reporting of
+         subsidiary thread names in <command>ps</command> and
+         <command>top</command>, but not the main thread. [RT #43234]
+       </para>
+      </listitem>
       <listitem>
        <para>
          The Response Policy Zone (RPZ) implementation has been
     <itemizedlist>
       <listitem>
        <para>
-         A synthesized CNAME record appearing in a response before the
-         associated DNAME could be cached, when it should not have been.
-         This was a regression introduced while addressing CVE-2016-8864.
-         [RT #44318]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         <command>named</command> could deadlock if multiple changes
-         to NSEC/NSEC3 parameters for the same zone were being processed
-         at the same time. [RT #42770]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         <command>named</command> could trigger an assertion when
-         sending NOTIFY messages. [RT #44019]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         Referencing a nonexistent zone in a <command>response-policy</command>
-         statement could cause an assertion failure during configuration.
-         [RT #43787]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         <command>rndc addzone</command> could cause a crash
-         when attempting to add a zone with a type other than
-         <command>master</command> or <command>slave</command>.
-         Such zones are now rejected. [RT #43665]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         <command>named</command> could hang when encountering log
-         file names with large apparent gaps in version number (for
-         example, when files exist called "logfile.0", "logfile.1",
-         and "logfile.1482954169").  This is now handled correctly.
-         [RT #38688]
-       </para>
-      </listitem>
-      <listitem>
-       <para>
-         If a zone was updated while <command>named</command> was
-         processing a query for nonexistent data, it could return
-         out-of-sync NSEC3 records causing potential DNSSEC validation
-         failure. [RT #43247]
+         None.
        </para>
       </listitem>
     </itemizedlist>
index 6ef7fd1782b15337aaea160d876bf810005c6ab9..bc11d3652557ec6be1027ba686e167d0be727207 100644 (file)
@@ -19,6 +19,9 @@ ISC_LANG_BEGINDECLS
 void
 isc_thread_setconcurrency(unsigned int level);
 
+void
+isc_thread_setname(isc_thread_t, const char *);
+
 #define isc_thread_self() ((unsigned long)0)
 #define isc_thread_yield() ((void)0)
 
index 1cf7700c091f4527efff1b5b758d2e0e9884f3b9..b697cf37111e26b7555fc24f63515a3ec5f42818 100644 (file)
@@ -17,3 +17,8 @@ void
 isc_thread_setconcurrency(unsigned int level) {
        UNUSED(level);
 }
+
+void isc_thread_setname(isc_thread_t thread, const char *name) {
+       UNUSED(thread);
+       UNUSED(name);
+}
index e44f5cbe351f03c64ebdcdaba9b5ca76be3b1508..57221c6be57b536ebcb3bd9fd6c0fdc6c5caa4b4 100644 (file)
 
 #include <pthread.h>
 
+#if defined(HAVE_PTHREAD_NP_H)
+#include <pthread_np.h>
+#endif
+
 #include <isc/lang.h>
 #include <isc/result.h>
 
@@ -35,6 +39,9 @@ isc_thread_setconcurrency(unsigned int level);
 void
 isc_thread_yield(void);
 
+void
+isc_thread_setname(isc_thread_t, const char *);
+
 /* XXX We could do fancier error handling... */
 
 #define isc_thread_join(t, rp) \
index 08286e2fce76c6e11abbd69de591e72fa334bd74..4caa7dde816b11c6cf63208271efe4fb7bfbaf0a 100644 (file)
@@ -70,6 +70,22 @@ isc_thread_setconcurrency(unsigned int level) {
 #endif
 }
 
+void
+isc_thread_setname(isc_thread_t thread, const char *name) {
+#if defined(HAVE_PTHREAD_SETNAME_NP) && defined(_GNU_SOURCE)
+       /*
+        * macOS has pthread_setname_np but only works on the
+        * current thread so it's not used here
+       */
+       (void)pthread_setname_np(thread, name);
+#elif defined(HAVE_PTHREAD_SET_NAME_NP)
+       (void)pthread_set_name_np(thread, name);
+#else
+       UNUSED(thread);
+       UNUSED(name);
+#endif
+}
+
 void
 isc_thread_yield(void) {
 #if defined(HAVE_SCHED_YIELD)
index 1fac0df21657c4e4ce1381ea322178af01bcc602..1c422845c54eaf335b6f6a5a8a042043ba0352ee 100644 (file)
@@ -1449,6 +1449,10 @@ isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers,
                if (isc_thread_create(run, manager,
                                      &manager->threads[manager->workers]) ==
                    ISC_R_SUCCESS) {
+                       char name[16];  /* thread name limit on Linux */
+                       snprintf(name, sizeof(name), "isc-worker%04d", i);
+                       isc_thread_setname(manager->threads[manager->workers],
+                                          name);
                        manager->workers++;
                        started++;
                }
index c7849f16af3c9b0381ad446e848dcce4ad82506d..79d463bf302b19c83d2de7ccf7af4f83047e9cb4 100644 (file)
@@ -914,6 +914,7 @@ isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
                                                ISC_MSG_FAILED, "failed"));
                return (ISC_R_UNEXPECTED);
        }
+       isc_thread_setname(manager->thread, "isc-timer");
 #endif
 #ifdef USE_SHARED_MANAGER
        manager->refs = 1;
index c1831c0528893060e56a820c2ea79cea56662c30..60fd7dd86db40bbd1497163c526090708d3b7dac 100644 (file)
@@ -4772,6 +4772,7 @@ isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
                result = ISC_R_UNEXPECTED;
                goto cleanup;
        }
+       isc_thread_setname(manager->watcher, "isc-socket");
 #endif /* USE_WATCHER_THREAD */
        isc_mem_attach(mctx, &manager->mctx);
 
index d1abfd9eeb7c7c3720905a3b71657cb85b8f81c8..6f1a715254ad2831b7f8d186273f8e549ddb5476 100644 (file)
@@ -74,6 +74,9 @@ isc_thread_join(isc_thread_t, isc_threadresult_t *);
 void
 isc_thread_setconcurrency(unsigned int level);
 
+void
+isc_thread_setname(isc_thread_t, const char *);
+
 int
 isc_thread_key_create(isc_thread_key_t *key, void (*func)(void *));
 
index 2bb4a3c0669055b09062229436f98ea8279817ee..a08de6db1445f522b01a6e1c482f9a4fee8f0eb9 100644 (file)
@@ -705,6 +705,7 @@ isc_thread_key_delete
 isc_thread_key_getspecific
 isc_thread_key_setspecific
 isc_thread_setconcurrency
+isc_thread_setname
 isc_time_add
 isc_time_compare
 isc_time_formatISO8601
index 996d7facf25462bc1591f3f63e9ecc86298ac5d6..39e83b1413cfd732db779ce459cc84ac309761d7 100644 (file)
@@ -58,6 +58,12 @@ isc_thread_setconcurrency(unsigned int level) {
         */
 }
 
+void
+isc_thread_setname(isc_thread_t thread, const char *name) {
+       UNUSED(thread);
+       UNUSED(name);
+}
+
 void *
 isc_thread_key_getspecific(isc_thread_key_t key) {
        return(TlsGetValue(key));