Optimise cli.JobExecutor with many pending jobs
Optimise cli.JobExecutor with many pending jobs

In the case we submit many pending jobs (> 100) to the masterd, the
JobExecutor 'spams' the master daemon with status requests for the
status of all the jobs, even though in the end it will only choose a
single job for polling.

This is very sub-optimal, because when the master is busy processing
small/fast jobs, this query forces reading all the jobs from
this. Restricting the 'window' of jobs that we query from the entire
set to a smaller subset makes a huge difference (masterd only, 0s
delay jobs, all jobs to tmpfs thus no I/O involved):

- submitting/waiting for 500 jobs:
  - before: ~21 s
  - after:   ~5 s
- submitting/waiting for 1K jobs:
  - before: ~76 s
  - after:   ~8 s

This is with a batch of 25 jobs. With a batch of 50 jobs, it goes from
8s to 12s. I think that choosing the 'best' job for nice output only
matters with a small number of jobs, and that for more than that
people will not actually watch the jobs. So changing from 'perfect
job' to 'best job in the first 25' should be OK.

Note that most jobs won't execute as fast as 0 delay, but this is
still a good improvement.

Signed-off-by: Iustin Pop <acf83a5274f31a43af6b914614365999469c1a31@google.com>
Reviewed-by: Guido Trotter <f62ca4d5358bdaeef0e50e57f9f7e231de63727e@google.com>
Reviewed-by: Michael Hanselmann <68b67885ff74281219b4a4be33cc20fd45078d7c@google.com>

ganeti-github-testing/ganeti-test-1,mbakke/ganeti,mbakke/ganeti,grnet/snf-ganeti,dimara/ganeti,bitemyapp/ganeti,apyrgio/ganeti,ganeti/ganeti,onponomarev/ganeti,apyrgio/snf-ganeti,yiannist/ganeti,andir/ganeti,yiannist/ganeti,bitemyapp/ganeti,mbakke/ganeti,leshchevds/ganeti,andir/ganeti,grnet/snf-ganeti,dimara/ganeti,apyrgio/ganeti,andir/ganeti,leshchevds/ganeti,apyrgio/snf-ganeti,onponomarev/ganeti,ganeti-github-testing/ganeti-test-1,ganeti/ganeti,ganeti/ganeti,yiannist/ganeti,leshchevds/ganeti