https://bugs.openldap.org/show_bug.cgi?id=8958
--- Comment #28 from Hallvard Furuseth h.b.furuseth@usit.uio.no --- On 03.08.2021 14:36, openldap-its@openldap.org wrote:
https://bugs.openldap.org/show_bug.cgi?id=8958
--- Comment #25 from Howard Chu hyc@openldap.org --- (In reply to Hallvard Furuseth from comment #17)
(...) A pause only stops tasks with speed < ltp_pause. In thread_pool_pause(), replace the WANT_PAUSE stage with
while (++ltp_pause <= max speed) { wait until no more tasks with speed < ltp_pause; }
Then fast tasks should breeze past slow ones when preparing to pause. Until all threads have slow tasks, anyway.
I don't understand how this solves anything. If a slow indexing task is currently running, and a fast config mod comes in, it's still the case that the config change could pull the DB out from under the indexer task. So there's nothing safe about letting the fast task progress while the slow task is still running
Fast tasks still wait for *running* slow tasks. And when there is no pause involved, slow tasks get scheduled normally.
This is only about scheduling when something wants a pause. setspeed() does CHECK_PAUSE, standing aside for faster tasks.
Then, a fast task which wants a pause (cn=config change #2) won't block other fast tasks while a slower task (indexer) is running. So normal tasks will keep getting scheduled, instead of slapd locking up for them.
This all depends on there being only a few config changes/slow tasks at any time, since they do occupy a thread.