- feeder: add -appids option: lets you specify which apps to

get jobs for (default it all).
    Useful if you're mixing locality and regular scheduling.
- a little E@h-specific stuff
From Bernd Machenschalk.


svn path=/trunk/boinc/; revision=18039
This commit is contained in:
David Anderson 2009-05-06 21:52:50 +00:00
parent 76b8b87e90
commit 6262401394
4 changed files with 68 additions and 40 deletions

View File

@ -4344,3 +4344,15 @@ David 6 May 2009
client/
gui_rpc_server_ops.cpp
cpu_sched.cpp
David 6 May 2009
- feeder: add -appids option: lets you specify which apps to
get jobs for (default it all).
Useful if you're mixing locality and regular scheduling.
- a little E@h-specific stuff
From Bernd Machenschalk.
sched/
feeder.cpp
handle_request.cpp
sched_send.cpp

View File

@ -29,6 +29,7 @@
// recommended if using HR with multiple schedulers
// [ -sleep_interval x ] sleep x seconds if nothing to do
// [ -allapps ] interleave results from all applications uniformly
// [ -appids a1{,a2} ] get work only for appids a1,... (comma-separated list)
// [ -purge_stale x ] remove work items from the shared memory segment
// that have been there for longer then x minutes
// but haven't been assigned
@ -632,6 +633,7 @@ int main(int argc, char** argv) {
int i, retval;
void* p;
char path[256];
char* appids=NULL;
unlink(REREAD_DB_FILENAME);
@ -660,6 +662,10 @@ int main(int argc, char** argv) {
order_clause = "order by r1.priority desc, r1.workunitid";
} else if (!strcmp(argv[i], "-purge_stale")) {
purge_stale_time = atoi(argv[++i])*60;
} else if (!strcmp(argv[i], "-appids")) {
strcat(mod_select_clause, " and workunit.appid in (");
strcat(mod_select_clause, argv[++i]);
strcat(mod_select_clause, ")");
} else if (!strcmp(argv[i], "-mod")) {
int n = atoi(argv[++i]);
int j = atoi(argv[++i]);
@ -678,11 +684,6 @@ int main(int argc, char** argv) {
}
}
#ifdef EINSTEIN_AT_HOME
// don't read locality scheduling workunits into the feeder
strcat(mod_select_clause, " and workunit.name not like \"%\\_\\_%\" ");
#endif
log_messages.printf(MSG_NORMAL, "Starting\n");
show_version();

View File

@ -65,6 +65,12 @@ static bool find_host_by_other(DB_USER& user, HOST req_host, DB_HOST& host) {
char buf[2048];
char dn[512], ip[512], os[512], pm[512];
#ifdef EINSTEIN_AT_HOME
// This is to prevent GRID hosts that manipulate their hostids from flooding E@H's DB with slow queries
if ((user.id == 282952) || (user.id == 243543))
return false;
#endif
// Only check if the fields are populated
if (strlen(req_host.domain_name) && strlen(req_host.last_ip_addr) && strlen(req_host.os_name) && strlen(req_host.p_model)) {
strcpy(dn, req_host.domain_name);
@ -77,7 +83,8 @@ static bool find_host_by_other(DB_USER& user, HOST req_host, DB_HOST& host) {
escape_string(pm, 512);
sprintf(buf,
"where userid=%d and id>%d and domain_name='%s' and last_ip_addr = '%s' and os_name = '%s' and p_model = '%s' and m_nbytes = %lf order by id desc", user.id, req_host.id, dn, ip, os, pm, req_host.m_nbytes
"where userid=%d and id>%d and domain_name='%s' and last_ip_addr = '%s' and os_name = '%s' and p_model = '%s'"
" and m_nbytes = %lf order by id desc", user.id, req_host.id, dn, ip, os, pm, req_host.m_nbytes
);
if (!host.enumerate(buf)) {
host.end_enumerate();

View File

@ -127,8 +127,8 @@ inline void get_max_wus_in_progress_multiplier() {
}
static const char* find_user_friendly_name(int appid) {
APP* app = ssp->lookup_app(appid);
if (app) return app->user_friendly_name;
APP* app = ssp->lookup_app(appid);
if (app) return app->user_friendly_name;
return "deprecated application";
}
@ -312,16 +312,16 @@ static void get_prefs_info() {
pos = str.find("<app_id>", pos) + 1;
}
if (parse_bool(buf,"allow_non_preferred_apps", flag)) {
g_wreq->allow_non_preferred_apps = flag;
if (parse_bool(buf,"allow_non_preferred_apps", flag)) {
g_wreq->allow_non_preferred_apps = flag;
}
if (parse_bool(buf,"allow_beta_work", flag)) {
if (parse_bool(buf,"allow_beta_work", flag)) {
g_wreq->allow_beta_work = flag;
}
if (parse_bool(buf,"no_gpus", flag)) {
}
if (parse_bool(buf,"no_gpus", flag)) {
g_wreq->no_gpus = flag;
}
if (parse_bool(buf,"no_cpu", flag)) {
if (parse_bool(buf,"no_cpu", flag)) {
g_wreq->no_cpu = flag;
}
}
@ -342,7 +342,7 @@ static void get_host_info() {
double expavg_time = g_reply->host.expavg_time;
update_average(0, 0, CREDIT_HALF_LIFE, expavg_credit, expavg_time);
// Platforms other then Windows, Linux and Intel Macs need a
// Platforms other then Windows, Linux and Intel Macs need a
// larger set of computers to be marked reliable
//
double multiplier = 1.0;
@ -351,9 +351,9 @@ static void get_host_info() {
|| (strstr(g_reply->host.os_name,"Darwin")
&& !(strstr(g_reply->host.p_vendor,"Power Macintosh"))
)) {
multiplier = 1.0;
multiplier = 1.0;
} else {
multiplier = 1.8;
multiplier = 1.8;
}
if (
@ -385,7 +385,7 @@ bool app_not_selected(WORKUNIT& wu) {
if (g_wreq->preferred_apps.size() == 0) return false;
for (i=0; i<g_wreq->preferred_apps.size(); i++) {
if (wu.appid == g_wreq->preferred_apps[i].appid) {
g_wreq->preferred_apps[i].work_available = true;
g_wreq->preferred_apps[i].work_available = true;
return false;
}
}
@ -898,22 +898,22 @@ int add_result_to_reply(
//
if (config.reliable_on_priority && result.priority >= config.reliable_on_priority && config.reliable_reduced_delay_bound > 0.01
) {
double reduced_delay_bound = delay_bound*config.reliable_reduced_delay_bound;
double est_wallclock_duration = estimate_duration(wu, *bavp);
double reduced_delay_bound = delay_bound*config.reliable_reduced_delay_bound;
double est_wallclock_duration = estimate_duration(wu, *bavp);
// Check to see how reasonable this reduced time is.
// Increase it to twice the estimated delay bound
// if all the following apply:
//
// 1) Twice the estimate is longer then the reduced delay bound
// 2) Twice the estimate is less then the original delay bound
// 3) Twice the estimate is less then the twice the reduced delay bound
if (est_wallclock_duration*2 > reduced_delay_bound
// 1) Twice the estimate is longer then the reduced delay bound
// 2) Twice the estimate is less then the original delay bound
// 3) Twice the estimate is less then the twice the reduced delay bound
if (est_wallclock_duration*2 > reduced_delay_bound
&& est_wallclock_duration*2 < delay_bound
&& est_wallclock_duration*2 < delay_bound*config.reliable_reduced_delay_bound*2
) {
reduced_delay_bound = est_wallclock_duration*2;
reduced_delay_bound = est_wallclock_duration*2;
}
delay_bound = (int) reduced_delay_bound;
delay_bound = (int) reduced_delay_bound;
}
result.report_deadline = result.sent_time + delay_bound;
@ -1131,23 +1131,23 @@ static void explain_to_user() {
// Tell the user about applications with no work
//
for (i=0; i<g_wreq->preferred_apps.size(); i++) {
if (!g_wreq->preferred_apps[i].work_available) {
APP* app = ssp->lookup_app(g_wreq->preferred_apps[i].appid);
// don't write message if the app is deprecated
if (app != NULL) {
char explanation[256];
sprintf(explanation, "No work is available for %s",
if (!g_wreq->preferred_apps[i].work_available) {
APP* app = ssp->lookup_app(g_wreq->preferred_apps[i].appid);
// don't write message if the app is deprecated
if (app != NULL) {
char explanation[256];
sprintf(explanation, "No work is available for %s",
find_user_friendly_name(g_wreq->preferred_apps[i].appid)
);
g_reply->insert_message(USER_MESSAGE(explanation, "high"));
}
}
g_reply->insert_message(USER_MESSAGE(explanation, "high"));
}
}
}
// Tell the user about applications they didn't qualify for
//
for (i=0; i<g_wreq->no_work_messages.size(); i++){
g_reply->insert_message(g_wreq->no_work_messages.at(i));
g_reply->insert_message(g_wreq->no_work_messages.at(i));
}
if (g_wreq->no_allowed_apps_available) {
g_reply->insert_message(
@ -1461,11 +1461,19 @@ void send_work() {
if (config.locality_scheduler_fraction > 0) {
if (drand() < config.locality_scheduler_fraction) {
send_work_locality();
send_work_old();
if (config.debug_locality)
log_messages.printf(MSG_NORMAL, "[mixed] sending locality work first\n");
send_work_locality();
if (config.debug_locality)
log_messages.printf(MSG_NORMAL, "[mixed] sending non-locality work second\n");
send_work_old();
} else {
send_work_old();
send_work_locality();
if (config.debug_locality)
log_messages.printf(MSG_NORMAL, "[mixed] sending non-locality work first\n");
send_work_old();
if (config.debug_locality)
log_messages.printf(MSG_NORMAL, "[mixed] sending locality work second\n");
send_work_locality();
}
} else if (config.locality_scheduling) {
send_work_locality();