[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: icecream/services
From: Stephan Kulow <coolo () kde ! org>
Date: 2012-03-20 9:14:28
Message-ID: 20120320091428.16EEBAC898 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1286336 by coolo:
apply patch from Lubos to schedule local jobs differently
if the submitter is busy
M +21 -9 scheduler.cpp
--- trunk/icecream/services/scheduler.cpp #1286335:1286336
@@ -156,10 +156,11 @@
int max_jobs;
bool noremote;
list<Job*> joblist;
+ int submitted_jobs_count;
Environments compiler_versions; // Available compilers
CS (int fd, struct sockaddr *_addr, socklen_t _len, bool text_based)
: MsgChannel(fd, _addr, _len, text_based),
- load(1000), max_jobs(0), noremote(false),
+ load(1000), max_jobs(0), noremote(false), submitted_jobs_count(0),
state(CONNECTED), type(UNKNOWN), chroot_possible(false)
{
hostid = 0;
@@ -195,7 +196,7 @@
public:
unsigned int id;
unsigned int local_client_id;
- enum {PENDING, WAITINGFORCS, COMPILING, WAITINGFORDONE} state;
+ enum {PENDING, WAITINGFORCS, COMPILING} state;
CS *server; // on which server we build
CS *submitter; // who submitted us
Environments environments;
@@ -218,12 +219,17 @@
Job (unsigned int _id, CS *subm)
: id(_id), local_client_id( 0 ), state(PENDING), server(0),
submitter(subm),
- starttime(0), start_on_scheduler(0), done_time( 0 ), arg_flags( 0 ) {}
+ starttime(0), start_on_scheduler(0), done_time( 0 ), arg_flags( 0 )
+ {
+ ++submitter->submitted_jobs_count;
+ }
+
~Job()
{
// XXX is this really deleted on all other paths?
/* fd2chan.erase (channel->fd);
delete channel;*/
+ --submitter->submitted_jobs_count;
}
};
@@ -377,12 +383,19 @@
// we only care for the load if we're about to add a job to it
if (job) {
- /* The submitter of a job gets more speed. So if he is equally
- fast to the rest of the farm it will be prefered to chose him
- to compile the job. Then this can be done locally without
- needing the preprocessor. */
- if (job->submitter == cs)
+ if (job->submitter == cs) {
+ /* The submitter of a job gets more speed if it's capable of handling its requests on its own.
+ So if he is equally fast to the rest of the farm it will be prefered to chose him
+ to compile the job. Then this can be done locally without needing the preprocessor.
+ However if there are more requests than the number of jobs the submitter can handle,
+ it is assumed the submitter is doing a massively parallel build, in which case it is
+ better not to build on the submitter and let it do other work (such as preprocessing
+ output for other nodes) that can be done only locally. */
+ if (cs->submitted_jobs_count <= cs->max_jobs)
f *= 1.1;
+ else
+ f *= 0.1; // penalize heavily
+ }
else // ignoring load for submitter - assuming the load is our own
f *= float(1000 - cs->load) / 1000;
}
@@ -1412,7 +1425,6 @@
job->state == Job::PENDING ? "PEND"
: job->state == Job::WAITINGFORCS ? "WAIT"
: job->state == Job::COMPILING ? "COMP"
- : job->state == Job::WAITINGFORDONE ? "DONE"
: "Huh?",
job->submitter ? job->submitter->nodename.c_str() : "<>",
job->server ? job->server->nodename.c_str() : "<unknown>");
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic