On 1/21/19 7:49 PM, Ondřej Kuzník wrote:
Except there are no locks as you know being the author of parts of code that deals with what I'm about to outline anyway:
Whenever a cn=config op is about to be processed, a pause is requested. That tells worker threads to stop picking up new work and waits until they're all quiet. The indexing task is run by one of these worker threads.
Duuh, right. I got stuck looking for what's special about the indexing task and couldn't find it:-( I need to make it special.
So, let tasks declare their expected speed until finish or between pausechecks. At FAST=1 (default) and SLOW=0. 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.
To mitigate that, we'd need to predeclare the speed when submitting a task, and limit the number of parallel slow tasks. pool_submit() could stash the rest in a "slow queue" instead of submitting. But I don't want to go there yet.