The thread running ldap_pvt_thread_pool_destroy and the one that ran the index
task (which was immediately finished after receiving the shutdown signal) are
both waiting for the pool->ltp_cond to be signalled.
Under normal conditions (slapd is not shutting down) the signal would have
been sent by ldap_pvt_thread_pool_resume(), called by the thread that handled
the second modify request. But there is an explicit check for
pool->ltp_finishing in ldap_pvt_thread_pool_resume(). When pool->ltp_finishing
is set this signal is not send.
The check for pool->ltp_finishing has been introduced with r1.81 of tpool.c. I
am unsure what this was supposed to fix the log message is just:
"In pool_resume don't touch the condvar if the pool is tearing down."
This patch solves the problem for me, so I am unsure if it'll break other
things:
--- libraries/libldap_r/tpool.c 10 Mar 2008 12:21:24 -0000 1.97
+++ libraries/libldap_r/tpool.c 3 Dec 2008 14:43:28 -0000
@@ -785,8 +785,7 @@
SET_VARY_OPEN_COUNT(pool);
pool->ltp_work_list = &pool->ltp_pending_list;
- if (!pool->ltp_finishing)
- ldap_pvt_thread_cond_broadcast(&pool->ltp_cond);
+ ldap_pvt_thread_cond_broadcast(&pool->ltp_cond);
ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
return(0);