mirror of https://github.com/BOINC/boinc.git
- scheduler: improve no-work messages
- web: don't use DB conn in mysql_real_escape_string() (otherwise won't work if DB is down) svn path=/trunk/boinc/; revision=16961
This commit is contained in:
parent
f33631cbbc
commit
50405c89e3
|
@ -449,7 +449,7 @@ Eric 15 Jan 2009
|
|||
Makefile.am
|
||||
samples/
|
||||
example_app/
|
||||
Makefile
|
||||
Makefile
|
||||
|
||||
Charlie Jan 15 2009
|
||||
- client: boinc_copy ownership fix of 1/6/09 didn't work because it used
|
||||
|
@ -501,8 +501,21 @@ David 19 Jan 2009
|
|||
server_types.h
|
||||
|
||||
David 20 Jan 2009
|
||||
- client: fix messages
|
||||
- client: fix messages
|
||||
|
||||
client/
|
||||
rr_sim.cpp
|
||||
work_fetch.cpp
|
||||
client/
|
||||
rr_sim.cpp
|
||||
work_fetch.cpp
|
||||
|
||||
David 20 Jan 2009
|
||||
- scheduler: improve no-work messages
|
||||
- web: don't use DB conn in mysql_real_escape_string()
|
||||
(otherwise won't work if DB is down)
|
||||
|
||||
html/inc/
|
||||
boinc_db.inc
|
||||
db_conn.inc
|
||||
sched/
|
||||
sched_plan.cpp.h
|
||||
sched_send.cpp
|
||||
server_types.h
|
||||
|
|
|
@ -50,8 +50,7 @@ class BoincDb extends DbConn {
|
|||
return $instance;
|
||||
}
|
||||
static function escape_string($string) {
|
||||
$db = self::get();
|
||||
return $db->base_escape_string(trim($string));
|
||||
return parent::base_escape_string(trim($string));
|
||||
}
|
||||
static function error() {
|
||||
$db = self::get();
|
||||
|
|
|
@ -148,7 +148,7 @@ class DbConn {
|
|||
return $this->do_query($query);
|
||||
}
|
||||
function base_escape_string($string) {
|
||||
return mysql_real_escape_string($string, $this->db_conn);
|
||||
return mysql_real_escape_string($string);
|
||||
}
|
||||
function base_error() {
|
||||
return mysql_error($this->db_conn);
|
||||
|
|
|
@ -42,13 +42,12 @@ static void get_ncpus(SCHEDULER_REQUEST& sreq, int& ncpus, bool& bounded) {
|
|||
}
|
||||
}
|
||||
|
||||
bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
||||
int app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
||||
if (!strcmp(plan_class, "mt")) {
|
||||
// the following is for an app that can use anywhere
|
||||
// from 1 to 64 threads, can control this exactly,
|
||||
// and whose speedup is .95N
|
||||
// (so on a uniprocessor, we'll use a sequential app
|
||||
// if one is available)
|
||||
// (so on a uniprocessor, we'll use a sequential app if one is available)
|
||||
//
|
||||
int ncpus, nthreads;
|
||||
bool bounded;
|
||||
|
@ -66,7 +65,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
hu.flops/1e9
|
||||
);
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
} else if (!strcmp(plan_class, "cuda")) {
|
||||
// the following is for an app that uses a CUDA GPU
|
||||
//
|
||||
|
@ -77,7 +76,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
);
|
||||
g_wreq->no_gpus_prefs = true;
|
||||
}
|
||||
return false;
|
||||
return PLAN_REJECT_PREFS;
|
||||
}
|
||||
COPROC_CUDA* cp = (COPROC_CUDA*)sreq.coprocs.lookup("CUDA");
|
||||
if (!cp) {
|
||||
|
@ -86,7 +85,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
"[version] Host lacks CUDA coprocessor for plan class cuda\n"
|
||||
);
|
||||
}
|
||||
return false;
|
||||
return PLAN_REJECT_NO_COPROC;
|
||||
}
|
||||
int v = (cp->prop.major)*100 + cp->prop.minor;
|
||||
if (v < 101) {
|
||||
|
@ -95,7 +94,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
"[version] CUDA version %d < 1.1\n", v
|
||||
);
|
||||
}
|
||||
return false;
|
||||
return PLAN_REJECT_COPROC_VERSION;
|
||||
}
|
||||
|
||||
if (cp->prop.dtotalGlobalMem < 254*1024*1024) {
|
||||
|
@ -104,7 +103,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
"[version] CUDA mem %d < 254MB\n", cp->prop.dtotalGlobalMem
|
||||
);
|
||||
}
|
||||
return false;
|
||||
return PLAN_REJECT_COPROC_MEM;
|
||||
}
|
||||
hu.flops = cp->flops_estimate();
|
||||
|
||||
|
@ -118,8 +117,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
hu.flops/1e9
|
||||
);
|
||||
}
|
||||
g_wreq->gpu_too_slow = true;
|
||||
return false;
|
||||
return PLAN_REJECT_COPROC_SPEED;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -141,7 +139,7 @@ bool app_plan(SCHEDULER_REQUEST& sreq, char* plan_class, HOST_USAGE& hu) {
|
|||
cp->prop.multiProcessorCount
|
||||
);
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
log_messages.printf(MSG_CRITICAL,
|
||||
"Unknown plan class: %s\n", plan_class
|
||||
|
|
|
@ -18,4 +18,12 @@
|
|||
#include "boinc_db.h"
|
||||
#include "server_types.h"
|
||||
|
||||
extern bool app_plan(SCHEDULER_REQUEST&, char* plan_class, HOST_USAGE&);
|
||||
// reasons for the planning function to reject a host
|
||||
|
||||
#define PLAN_REJECT_PREFS 1
|
||||
#define PLAN_REJECT_NO_COPROC 2
|
||||
#define PLAN_REJECT_COPROC_VERSION 3
|
||||
#define PLAN_REJECT_COPROC_MEM 4
|
||||
#define PLAN_REJECT_COPROC_SPEED 5
|
||||
|
||||
extern int app_plan(SCHEDULER_REQUEST&, char* plan_class, HOST_USAGE&);
|
||||
|
|
|
@ -145,7 +145,7 @@ bool SCHEDULER_REQUEST::has_version(APP& app) {
|
|||
BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
||||
bool found;
|
||||
unsigned int i;
|
||||
int j;
|
||||
int retval, j;
|
||||
BEST_APP_VERSION* bavp;
|
||||
char message[256];
|
||||
|
||||
|
@ -192,7 +192,6 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
);
|
||||
USER_MESSAGE um(message, "high");
|
||||
g_wreq->insert_no_work_message(um);
|
||||
g_wreq->no_app_version = true;
|
||||
}
|
||||
bavp->avp = 0;
|
||||
} else {
|
||||
|
@ -220,6 +219,10 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
//
|
||||
bavp->host_usage.flops = 0;
|
||||
bavp->avp = NULL;
|
||||
bool no_version_for_platform = true;
|
||||
int cuda_reject = 0;
|
||||
bool no_cuda_requested = false;
|
||||
bool no_cpu_requested = false;
|
||||
for (i=0; i<g_request->platforms.list.size(); i++) {
|
||||
PLATFORM* p = g_request->platforms.list[i];
|
||||
for (j=0; j<ssp->napp_versions; j++) {
|
||||
|
@ -227,17 +230,27 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
APP_VERSION& av = ssp->app_versions[j];
|
||||
if (av.appid != wu.appid) continue;
|
||||
if (av.platformid != p->id) continue;
|
||||
no_version_for_platform = false;
|
||||
if (g_request->core_client_version < av.min_core_version) {
|
||||
log_messages.printf(MSG_NORMAL,
|
||||
"outdated client version %d < min core version %d\n",
|
||||
g_request->core_client_version, av.min_core_version
|
||||
);
|
||||
g_wreq->outdated_core = true;
|
||||
g_wreq->outdated_client = true;
|
||||
continue;
|
||||
}
|
||||
if (strlen(av.plan_class)) {
|
||||
if (!g_request->client_cap_plan_class) continue;
|
||||
if (!app_plan(*g_request, av.plan_class, host_usage)) {
|
||||
if (!g_request->client_cap_plan_class) {
|
||||
log_messages.printf(MSG_NORMAL,
|
||||
"client version %d lacks plan class capability\n",
|
||||
g_request->core_client_version
|
||||
);
|
||||
g_wreq->outdated_client = true;
|
||||
continue;
|
||||
}
|
||||
retval = app_plan(*g_request, av.plan_class, host_usage);
|
||||
if (retval) {
|
||||
cuda_reject = retval;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
|
@ -254,6 +267,7 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
"[version] Don't need CUDA jobs, skipping\n"
|
||||
);
|
||||
}
|
||||
no_cuda_requested = true;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
|
@ -263,6 +277,7 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
"[version] Don't need CPU jobs, skipping\n"
|
||||
);
|
||||
}
|
||||
no_cpu_requested = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -282,7 +297,13 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
);
|
||||
}
|
||||
} else {
|
||||
// here if no app version exists
|
||||
// Here if there's no app version we can use.
|
||||
// Could be because:
|
||||
// - none exists for platform
|
||||
// - one exists for platform, but host lacks processor type
|
||||
// - one exists for platform, but no work requested for processor type
|
||||
// - one exists but requires newer client
|
||||
// - one exists but plan function rejects this host
|
||||
//
|
||||
if (config.debug_version_select) {
|
||||
for (i=0; i<g_request->platforms.list.size(); i++) {
|
||||
|
@ -293,7 +314,7 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
);
|
||||
}
|
||||
}
|
||||
if (!g_wreq->no_gpus_prefs) {
|
||||
if (no_version_for_platform) {
|
||||
sprintf(message,
|
||||
"%s is not available for your type of computer.",
|
||||
app->user_friendly_name
|
||||
|
@ -301,7 +322,43 @@ BEST_APP_VERSION* get_app_version(WORKUNIT& wu) {
|
|||
USER_MESSAGE um(message, "high");
|
||||
g_wreq->insert_no_work_message(um);
|
||||
}
|
||||
g_wreq->no_app_version = true;
|
||||
char* p = NULL;
|
||||
switch (cuda_reject) {
|
||||
case PLAN_REJECT_PREFS:
|
||||
p = "Your preferences are to not use GPU"; break;
|
||||
case PLAN_REJECT_NO_COPROC:
|
||||
p = "Your computer has no CUDA device"; break;
|
||||
case PLAN_REJECT_COPROC_VERSION:
|
||||
p = "Your CUDA device has the wrong software version"; break;
|
||||
case PLAN_REJECT_COPROC_MEM:
|
||||
p = "Your CUDA device has insufficient memory"; break;
|
||||
case PLAN_REJECT_COPROC_SPEED:
|
||||
p = "Your CUDA device is too slow"; break;
|
||||
}
|
||||
if (p) {
|
||||
sprintf(message,
|
||||
"Can't use CUDA app for %s: %s",
|
||||
app->user_friendly_name, p
|
||||
);
|
||||
USER_MESSAGE um(message, "high");
|
||||
g_wreq->insert_no_work_message(um);
|
||||
}
|
||||
if (no_cpu_requested) {
|
||||
sprintf(message,
|
||||
"CPU app exists for %s but no CPU work requested",
|
||||
app->user_friendly_name
|
||||
);
|
||||
USER_MESSAGE um(message, "high");
|
||||
g_wreq->insert_no_work_message(um);
|
||||
}
|
||||
if (no_cuda_requested) {
|
||||
sprintf(message,
|
||||
"CUDA app exists for %s but no CUDA work requested",
|
||||
app->user_friendly_name
|
||||
);
|
||||
USER_MESSAGE um(message, "high");
|
||||
g_wreq->insert_no_work_message(um);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return bavp;
|
||||
|
@ -1235,7 +1292,9 @@ static void explain_to_user() {
|
|||
g_reply->set_delay(DELAY_NO_WORK_TEMP);
|
||||
USER_MESSAGE um2("No work sent", "high");
|
||||
g_reply->insert_message(um2);
|
||||
// Inform the user about applications with no work
|
||||
|
||||
// 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);
|
||||
|
@ -1250,13 +1309,12 @@ static void explain_to_user() {
|
|||
}
|
||||
}
|
||||
}
|
||||
// Inform the user about applications they didn't qualify for
|
||||
|
||||
// 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));
|
||||
}
|
||||
if (g_wreq->no_app_version) {
|
||||
g_reply->set_delay(DELAY_NO_WORK_PERM);
|
||||
}
|
||||
if (g_wreq->no_allowed_apps_available) {
|
||||
USER_MESSAGE um(
|
||||
"No work available for the applications you have selected. Please check your settings on the web site.",
|
||||
|
@ -1295,7 +1353,7 @@ static void explain_to_user() {
|
|||
);
|
||||
g_reply->insert_message(um);
|
||||
}
|
||||
if (g_wreq->outdated_core) {
|
||||
if (g_wreq->outdated_client) {
|
||||
USER_MESSAGE um(
|
||||
" (your BOINC client is old - please install current version)",
|
||||
"high"
|
||||
|
|
|
@ -181,10 +181,9 @@ struct WORK_REQ {
|
|||
|
||||
bool no_allowed_apps_available;
|
||||
bool excessive_work_buf;
|
||||
bool no_app_version;
|
||||
bool hr_reject_temp;
|
||||
bool hr_reject_perm;
|
||||
bool outdated_core;
|
||||
bool outdated_client;
|
||||
bool gpu_too_slow;
|
||||
bool no_gpus_prefs;
|
||||
bool daily_result_quota_exceeded;
|
||||
|
|
Loading…
Reference in New Issue